1. JWT 基础概念

1.1 JWT 定义

JWT(JSON Web Token) 是一种基于 JSON 格式的开放标准(RFC 7519),用于在各方之间以紧凑且自包含的方式安全传输信息。JWT 通常用于身份认证和信息交换,其核心特点是:

  • 自包含:Token 本身携带用户身份、权限等声明信息,无需服务端存储会话状态。
  • 紧凑:通过 Base64URL 编码,体积小,适合 HTTP 头部、URL 参数等传输场景。
  • 防篡改:通过签名机制(HMAC 或 RSA/ECDSA)保证数据完整性。
压测视角:JWT 的无状态特性使其在分布式压测场景中天然具备高可扩展性,但签名验证的计算开销会成为性能瓶颈,需重点关注。

1.2 JWT 结构详解

一个完整的 JWT 由三部分组成,以点号(.)分隔:Header.Payload.Signature。以下通过 SVG 结构图展示其组成关系:

JWT 结构组成 Header(头部) 算法类型 & Token 类型 {"alg":"HS256","typ":"JWT"} Payload(载荷) 声明(Claims) 用户ID、角色、过期时间 Signature(签名) 防篡改验证 HMACSHA256(base64(Header).base64(Payload), secret) 完整 JWT 格式 Header . Payload . Signature Base64URL 编码:将二进制数据转为 URL 安全的 ASCII 字符串 签名算法:HMAC(对称)或 RSA/ECDSA(非对称)

1.3 三部分详细说明

1.3.1 Header(头部)

Header 通常包含两部分信息:Token 类型(typ)和签名算法(alg)。示例:

{
  "alg": "HS256",
  "typ": "JWT"
}
字段含义常见值
alg签名算法HS256、RS256、ES256
typToken 类型JWT
kid密钥 ID(可选)用于多密钥场景

1.3.2 Payload(载荷)

Payload 包含声明(Claims),分为三类:

  • 注册声明(Registered Claims):预定义的标准字段,如 iss(签发者)、sub(主题)、exp(过期时间)、iat(签发时间)。
  • 公共声明(Public Claims):自定义字段,需在 IANA JSON Web Token Registry 注册或使用命名空间避免冲突。
  • 私有声明(Private Claims):双方约定的自定义字段,如 userId、role。
{
  "sub": "1234567890",
  "name": "John Doe",
  "role": "admin",
  "iat": 1516239022,
  "exp": 1516242622
}
压测注意:Payload 体积直接影响 JWT 大小和网络传输开销。压测时应控制自定义声明数量,避免 Token 过大导致带宽和解析性能下降。

1.3.3 Signature(签名)

签名由 Header 指定的算法生成,用于验证 Token 在传输过程中未被篡改。生成过程:

HMACSHA256(
  base64UrlEncode(header) + "." + base64UrlEncode(payload),
  secret
)

服务端验证时,使用相同的密钥和算法重新计算签名,与 Token 中的签名比对。若不一致,则拒绝请求。

1.4 JWT 与 Session 对比

在压测场景中,选择 JWT 还是 Session 直接影响测试架构设计。以下从多个维度进行对比:

对比维度JWTSession
状态存储无状态,Token 自包含用户信息有状态,服务端存储 Session 数据
扩展性天然支持分布式,无需共享存储需 Redis/DB 等共享存储,增加复杂度
性能开销签名验证计算开销(CPU 密集型)Session 查询开销(IO 密集型)
安全性签名防篡改,但 Payload 仅 Base64 编码(非加密)Session ID 随机生成,数据存储在服务端
跨域支持天然支持跨域(CORS)需额外配置跨域 Session 共享
Token 大小较大(通常 200-500 字节)Session ID 很小(通常 16-32 字节)
吊销机制需黑名单或短过期时间直接删除服务端 Session 即可

以下 SVG 图展示 JWT 与 Session 在典型请求流程中的差异:

JWT vs Session 请求流程对比 JWT 无状态流程 客户端 服务端 请求 + JWT 验证签名 返回数据 Session 有状态流程 客户端 服务端 请求 + Session ID 查询 Session 返回数据 压测场景关键差异 • JWT:每次请求需 CPU 计算签名验证,适合高并发无共享架构 • Session:每次请求需 IO 查询共享存储(Redis/DB),存在单点瓶颈 • JWT 压测关注点:签名算法性能、Token 大小、过期策略 • Session 压测关注点:共享存储连接池、Session 序列化/反序列化

1.5 压测场景选择建议

选择 JWT 的场景:

  • 微服务架构,需要无状态认证
  • 移动端或跨域 API 服务
  • 高并发分布式部署,避免 Session 共享瓶颈

选择 Session 的场景:

  • 单体应用,服务端可快速访问 Session 存储
  • 需要服务端主动吊销用户会话
  • Token 大小敏感的低带宽环境