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)进行加密。
1.2 JWT 工作原理
JWT 的工作流程涉及三个角色:客户端(用户代理)、认证服务器、资源服务器(应用服务器)。
- 用户登录:客户端向认证服务器提交凭据(用户名/密码)。
- 签发令牌:认证服务器验证凭据后,生成 JWT 并返回给客户端。
- 存储令牌:客户端将 JWT 存储在本地(如 localStorage、sessionStorage 或 Cookie)。
- 请求资源:客户端在后续请求的 HTTP Header 中携带 JWT,通常格式为
Authorization: Bearer <token>。 - 验证令牌:资源服务器验证 JWT 的签名、过期时间等,若有效则提取用户信息并处理请求。
无状态设计: 资源服务器无需存储会话信息,仅通过 JWT 自身即可完成身份验证。这降低了服务器内存开销,便于水平扩展。
1.3 JWT 与 Session 对比
Session 是传统的服务端会话管理方式,JWT 是新兴的无状态令牌方案。两者在存储位置、扩展性、安全性等方面存在显著差异。
| 对比维度 | Session | JWT |
|---|---|---|
| 存储位置 | 服务端内存/数据库,客户端仅存 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 做短期令牌 + 黑名单做吊销)也是常见方案。