JWT安全尾延迟压测性能压测与瓶颈诊断 - 第1节

1.1 JWT 结构:Header、Payload、Signature

JWT(JSON Web Token)是一种紧凑的、URL 安全的令牌格式,用于在各方之间以 JSON 对象形式安全传输声明信息。其结构由三个独立的部分组成,以点号(.)分隔:

Base64URL(Header).Base64URL(Payload).Signature

1.1.1 Header(头部)

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

字段含义示例值
typ令牌类型,固定为 "JWT""JWT"
alg签名算法,如 HMAC SHA256 或 RSA"HS256"、"RS256"
{
  "alg": "HS256",
  "typ": "JWT"
}

1.1.2 Payload(载荷)

Payload 包含声明(claims),即关于实体(通常是用户)和附加数据的声明。声明分为三类:

  • 注册声明(Registered Claims):预定义的标准字段,如 iss(签发者)、exp(过期时间)、sub(主题)、iat(签发时间)。
  • 公共声明(Public Claims):由使用 JWT 的各方自定义,需在 IANA JSON Web Token Registry 注册或使用命名空间避免冲突。
  • 私有声明(Private Claims):在同意使用 JWT 的各方之间共享的自定义字段。
{
  "sub": "1234567890",
  "name": "张三",
  "role": "admin",
  "iat": 1716000000,
  "exp": 1716003600
}

1.1.3 Signature(签名)

Signature 用于验证消息在传输过程中未被篡改。对于使用 HMAC SHA256 算法的令牌,签名通过以下方式生成:

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

接收方使用相同的密钥和算法重新计算签名,并与令牌中的签名比对。如果一致,则证明令牌内容未被修改。

安全要点: 签名仅保证完整性,不提供加密。Payload 中的敏感信息(如密码、身份证号)必须避免明文存储,或使用 JWE(JSON Web Encryption)进行加密。
JWT 结构分解图 Header {"alg":"HS256", "typ":"JWT"} Base64URL 编码 → eyJhbGciOiJIUzI1... Payload {"sub":"123", "name":"张三", "role":"admin"} Base64URL 编码 → eyJzdWIiOiIxMjM... Signature HMACSHA256( base64Header + "." + base64Payload, secret) 最终 JWT 格式:Header.Payload.Signature(如:eyJhbG... .eyJzdW... .s9f3Z...)

1.2 JWT 工作原理

JWT 的工作流程涉及三个角色:客户端(用户代理)、认证服务器、资源服务器(应用服务器)。

  1. 用户登录:客户端向认证服务器提交凭据(用户名/密码)。
  2. 签发令牌:认证服务器验证凭据后,生成 JWT 并返回给客户端。
  3. 存储令牌:客户端将 JWT 存储在本地(如 localStorage、sessionStorage 或 Cookie)。
  4. 请求资源:客户端在后续请求的 HTTP Header 中携带 JWT,通常格式为 Authorization: Bearer <token>。
  5. 验证令牌:资源服务器验证 JWT 的签名、过期时间等,若有效则提取用户信息并处理请求。
无状态设计: 资源服务器无需存储会话信息,仅通过 JWT 自身即可完成身份验证。这降低了服务器内存开销,便于水平扩展。
JWT 工作原理流程图 客户端 认证服务器 资源服务器 ① 登录请求 ② 返回 JWT ③ 携带 JWT(Authorization: Bearer <token>) ④ 验证签名 & 过期时间,返回资源/数据 关键点:资源服务器不查询数据库即可验证用户身份,实现无状态认证 签名验证失败或令牌过期 → 返回 401 Unauthorized

1.3 JWT 与 Session 对比

Session 是传统的服务端会话管理方式,JWT 是新兴的无状态令牌方案。两者在存储位置、扩展性、安全性等方面存在显著差异。

对比维度SessionJWT
存储位置服务端内存/数据库,客户端仅存 Session ID客户端存储完整令牌,服务端无状态
扩展性需共享 Session 存储(如 Redis)或粘性会话天然支持水平扩展,无需共享存储
跨域支持需配置 CORS 或代理,跨域共享困难通过 HTTP Header 传递,天然支持跨域
性能开销每次请求需查询 Session 存储仅需本地计算验证签名,无 I/O 开销
令牌大小Session ID 很小(通常 16-32 字节)JWT 较大(通常 500-2000 字节),含完整用户信息
吊销机制直接删除 Session 即可立即失效需维护黑名单或缩短过期时间,吊销复杂
安全性Session ID 随机生成,难以伪造签名防篡改,但 Payload 明文可读,需防 XSS 窃取
选型建议: 对于传统服务端渲染应用或需要即时吊销的场景,Session 更合适。对于微服务架构、移动端 API、单页应用(SPA)等需要跨域和水平扩展的场景,JWT 是更优选择。混合使用(如 JWT 做短期令牌 + 黑名单做吊销)也是常见方案。
Session vs JWT 架构对比 Session 模式 客户端 存 Session ID 服务端 存用户数据 Session ID 扩展需共享 Session 存储 吊销:直接删除 Session JWT 模式 客户端 存完整 JWT 服务端 无状态 JWT 扩展无需共享存储 吊销:需黑名单或短过期