3. JWT Header 详解:typ 类型、alg 算法声明、常见算法标识符

JWT 的 Header(头部)是令牌的第一部分,通常由两个核心字段组成:typ(Token 类型)和 alg(签名算法)。Header 以 JSON 对象形式存在,经过 Base64URL 编码后成为 JWT 的第一段。理解 Header 的结构与算法标识符,是进行 JWT 契约校验的基础。

3.1 Header 标准结构

一个典型的 JWT Header 如下所示:

{
  "alg": "HS256",
  "typ": "JWT"
}

该 JSON 经过 Base64URL 编码后,形如:eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9。解码后即可还原为原始声明。

3.2 typ 字段:Token 类型

typ(Type)用于声明令牌的媒体类型,帮助解析器识别这是一个 JWT。虽然该字段在大多数场景下是固定的,但契约校验中仍需确认其值是否符合预期。

typ 值 含义 推荐场景
JWT 标准的 JSON Web Token 绝大多数 API 认证、授权场景
JOSE JSON Object Signing and Encryption 的缩写 当 JWT 被用于更广泛的 JOSE 框架时
不设置或为 null 未声明类型 部分实现允许省略,但契约校验建议显式声明
校验要点:在契约校验中,应强制要求 typ 字段存在且值为 "JWT"。若接收方解析到非预期的 typ 值(如 "JOSE" 或缺失),应视为格式违规,拒绝后续处理。

3.3 alg 字段:签名算法声明

alg(Algorithm)是 Header 中最重要的字段,它声明了用于签名或加密的算法。服务端必须根据 alg 的值选择对应的验证方式。如果 alg 与预期不符,将直接导致签名验证失败或安全漏洞。

常见算法标识符分为三类:

  • HMAC 对称算法:使用同一个密钥进行签名和验证。
  • RSA 非对称算法:使用私钥签名,公钥验证。
  • ECDSA 椭圆曲线算法:基于椭圆曲线的非对称算法,密钥更短,性能更高。

3.4 常见算法标识符速查表

alg 参数值 算法 算法类型 说明
HS256 HMAC with SHA-256 对称 最常用的对称签名算法,密钥长度至少 256 位
HS384 HMAC with SHA-384 对称 比 HS256 更安全,但计算开销略大
HS512 HMAC with SHA-512 对称 最高安全级别的 HMAC 算法
RS256 RSA with SHA-256 非对称 广泛使用的非对称签名算法,基于 RSA 公钥体系
RS384 RSA with SHA-384 非对称 RSA 系列中安全性与性能的折中
RS512 RSA with SHA-512 非对称 RSA 最高安全级别
ES256 ECDSA with P-256 and SHA-256 非对称 基于 NIST P-256 曲线,密钥短、性能高
ES384 ECDSA with P-384 and SHA-384 非对称 P-384 曲线,安全强度更高
ES512 ECDSA with P-521 and SHA-512 非对称 P-521 曲线,最高安全等级
none 无签名 无 安全警告:不进行任何签名,仅用于调试,生产环境禁止使用
安全风险:算法混淆攻击(Algorithm Confusion Attack)是 JWT 常见漏洞之一。攻击者可能将 alg 从 RS256 篡改为 HS256,如果服务端未严格校验算法类型,可能使用公钥作为 HMAC 密钥进行验证,导致签名被伪造。契约校验必须强制绑定预期的算法标识符。

3.5 Header 算法选择与契约校验流程

下图展示了在契约校验中,服务端如何根据 Header 中的 alg 字段进行算法验证与签名校验的决策流程:

JWT Header 算法校验流程 解析 JWT Header 提取 alg 字段值 alg 是否在允许算法白名单中? 是 按 alg 验证签名 否 拒绝:算法不匹配 契约校验要点:必须预先配置允许的 alg 白名单,拒绝 none 算法,防止算法混淆攻击

3.6 契约校验中的 Header 检查清单

在 JWT 契约校验中,对 Header 的检查应至少包含以下步骤:

  1. 格式检查:确认 Header 是合法的 JSON 对象,且 Base64URL 解码无异常。
  2. typ 字段检查:确认 typ 存在且值为 "JWT"(或契约约定的其他值)。
  3. alg 字段存在性检查:确认 alg 字段存在且不为空。
  4. alg 白名单检查:确认 alg 值在服务端预定义的允许算法列表中。
  5. alg 类型一致性检查:确认算法类型(对称/非对称)与密钥类型匹配,防止算法混淆。
  6. none 算法拒绝:除非是调试环境且契约明确允许,否则必须拒绝 alg: "none"。
实战建议:在微服务架构中,建议将允许的算法白名单配置在统一的认证中心或 API 网关中。例如,内部服务间通信推荐使用 RS256 或 ES256,以便使用公钥进行无状态验证;而单点登录(SSO)场景中,HS256 配合密钥管理服务也是常见选择。