我正在使用 Spring 开发 REST API (HTTPS),现在需要对 1000 个并发用户进行负载测试。问题是我使用 siege 进行负载测试,但它无法测试 jwt 令牌标头。这是执行负载的最佳方式在我的场景中测试?
您可以使用 Jmeter 来测试 JWT Secured Rest API。
您可以将 jwt 令牌与请求一起包含在“HTTP 标头管理器”中。
参考:http://jmeter.apache.org/usermanual/build-adv-web-test-plan.html#header_manager
我会建议以下配置:
将 jjwt jar 连同依赖项(jackson-databind)放在 JMeter Classpath 下(只需将 jar 放入 JMeter 安装的“lib”文件夹中,然后重新启动 JMeter 以获取它们)
添加 HTTP 请求 采样器并将其配置为发送您的 API 请求。
添加 HTTP 标头管理器 作为 HTTP 请求采样器的子项。
添加 JSR223 PreProcessor 作为 HTTP 请求采样器的子项。
将以下代码放入JSR223 PreProcessor“脚本”区域:
import io.jsonwebtoken.Jwts
import io.jsonwebtoken.SignatureAlgorithm
import io.jsonwebtoken.impl.crypto.MacProvider
import org.apache.jmeter.protocol.http.control.Header
import java.security.Key
def key = MacProvider.generateKey();
def compactJws = Jwts.builder()
.setSubject('Joe')
.signWith(SignatureAlgorithm.HS512, key)
.compact()
sampler.getHeaderManager().add(new Header('Authorization', 'Bearer ' + compactJws))
上面的代码将生成一个 JSON Web Token,它将 registered claim 子(主题)设置为
Joe
并添加具有 Authorization
值的 Bearer %generated token string%
标头到 HTTP 请求。
您需要根据需要修改代码,但概念应该是相同的。如果需要,请联系您的应用程序开发人员寻求帮助。
参考资料:
我会建议Gopayloader。它是一个用 Go 编写的 HTTP 负载测试器,使用 JWTS 可以达到大约 50k RPS。
它通过提供私钥来签署 JWT 来生成自定义 JWT,即
./gopayloader run http://localhost:8081 -c 150 -r 1000000 --jwt-header "my-jwt" --jwt-key ./private-key.pem --jwt-kid 3434645743124 --jwt-sub "my-subject" --jwt-aud "some-audience" --jwt-iss "some-issuer"
会生成一个像这样的 JWT 主体:
{
"aud": "some-audience",
"exp": 1714130039,
"iss": "some-issuer",
"jti": "05181473-bbd6-4d21-8942-d86c2e972b2b",
"sub": "my-subject"
}
带标题:
{
"alg": "ES256",
"kid": "3434645743124",
"typ": "JWT"
}
它预先生成 JWT 并在运行测试之前将它们保存到磁盘,以保持低内存占用并实现高 RPS,因为 CPU 周期专门用于发送请求而不是生成 JWTS。每个 JWT 都是独一无二的,因为它有自己的
jti
即
"jti" : "8f2d1472-084c-4662-ae74-04e0f1de4993"
这可能很有用,因为某些 JWT 身份验证服务不允许重复使用相同的 JWT,因为它只能使用一次以防止重放攻击,请参阅:https://www.rfc-editor.org/rfc/rfc7519#第 4.1.7 节.