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