3. JWT Header 详解:类型与签名算法声明
JWT Header(头部)是 JWT 结构中的第一个组成部分,位于 Token 的最前端。它本质上是一个 JSON 对象,用于描述 Token 的元数据——类型(typ)和签名算法(alg)。Header 的完整性和正确性直接决定了 JWT 的解析方式与安全强度。
3.1 typ 类型声明
typ(Type)声明 JWT 的媒体类型,通常固定为 "JWT"。该字段帮助解析器识别 Token 的格式,避免与其他基于 JSON 的令牌结构混淆。
| typ 值 | 含义 | 使用场景 |
|---|---|---|
"JWT" |
标准 JSON Web Token | 绝大多数认证与授权场景 |
"JOSE" |
JSON Object Signing and Encryption | JWS/JWE 嵌套结构 |
| 不声明 | 默认按 JWT 处理 | 部分实现允许省略 |
最佳实践:始终显式声明
"typ": "JWT",避免解析歧义。在微服务网关或 API 网关中,该字段可用于快速过滤非 JWT 令牌。
3.2 alg 签名算法声明
alg(Algorithm)是 Header 中最关键的字段,它声明了 JWT 签名或加密所使用的算法。服务端在验证 Token 时,必须依据 alg 字段选择对应的验证逻辑。
alg 字段的取值分为三大类:
- 对称签名算法:签名和验证使用同一个密钥(Secret Key)。
- 非对称签名算法:使用私钥签名,公钥验证。
- 无签名算法:
"alg": "none",表示不进行任何签名保护。
3.3 常见算法类型:HS256 与 RS256
在实际生产环境中,HS256 和 RS256 是最广泛使用的两种签名算法。下表从多个维度对比两者的差异:
| 对比维度 | HS256 (HMAC-SHA256) | RS256 (RSA-SHA256) |
|---|---|---|
| 算法类别 | 对称签名 | 非对称签名 |
| 密钥管理 | 单一密钥,签发与验证共用 | 私钥签发,公钥验证 |
| 密钥分发 | 需安全通道共享密钥 | 公钥可公开分发 |
| 性能 | 计算速度快 | 计算速度较慢 |
| 适用场景 | 单体应用、内部服务间通信 | 微服务、第三方集成、开放 API |
| 安全风险 | 密钥泄露可伪造任意 Token | 私钥泄露风险范围可控 |
安全警告:切勿在生产环境中使用
"alg": "none"。攻击者可利用算法混淆攻击,将 alg 篡改为 none 绕过签名验证。服务端必须白名单校验允许的算法。
3.4 Header 结构示例
一个完整的 JWT Header 示例如下:
{
"alg": "RS256",
"typ": "JWT",
"kid": "key-id-2024-01"
}
其中 kid(Key ID)为可选字段,用于在多个密钥中标识具体使用的密钥,常见于 JWKS(JSON Web Key Set)场景。
3.5 算法选择决策流程
下图展示了在实际系统设计中,如何根据架构需求选择 JWT 签名算法:
3.6 算法混淆攻击与防御
JWT 历史上最著名的安全漏洞之一就是算法混淆攻击(Algorithm Confusion Attack)。攻击者将 Header 中的 alg 从 RS256 篡改为 HS256,并利用泄露的公钥作为 HMAC 密钥重新签名 Token,从而绕过验证。
防御措施:
- 服务端强制白名单校验
alg字段,拒绝未预期的算法。 - 使用专用库(如 jose、jjwt)时,指定期望的算法列表。
- 避免在验证逻辑中动态从 Header 读取算法类型。
- 对于 RS256,确保公钥仅用于验证,不用于 HMAC 签名操作。
3.7 Header 常见错误清单
| 错误类型 | 错误示例 | 后果 |
|---|---|---|
| 算法未声明 | {"typ":"JWT"} |
解析器可能默认使用不安全算法 |
| 算法为 none | {"alg":"none"} |
Token 无签名保护,可被任意伪造 |
| 算法与密钥不匹配 | HS256 使用 RSA 密钥 | 验证失败或抛出异常 |
| typ 拼写错误 | "typ":"jwt"(小写) |
部分严格实现可能拒绝 Token |
Header 虽小,却是 JWT 安全的第一道防线。正确声明 typ 和 alg,并配合服务端严格的算法校验,是构建安全 JWT 认证体系的基础。