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 签名算法:

JWT 签名算法选择决策流程 开始选择算法 是否涉及多个服务/第三方? 是 RS256 否 是否对性能极度敏感? 是 HS256 否 推荐 RS256(安全优先) 说明:HS256 适合内部信任环境;RS256 适合跨域、开放、多客户端场景 选择算法时,还需考虑密钥轮换频率、审计合规要求及客户端库支持情况

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 认证体系的基础。