3. JWT Header 详解:类型声明与算法选择
JWT Header(头部)是 JWT 结构的第一个组成部分,承载着令牌的元数据。它通常由两个核心字段组成:typ(类型声明)和 alg(算法声明)。Header 的完整性与正确性直接决定了 JWT 的解析方式与安全强度。
3.1 typ 类型声明
typ(Type)字段用于声明令牌的媒体类型,帮助解析方识别这是一个 JWT。根据 RFC 7519 规范,该字段的值通常为 "JWT"。
| 字段 | 说明 | 示例值 |
|---|---|---|
typ |
声明令牌的媒体类型,用于区分 JWT 与其他类似结构(如 JWE) | "JWT" |
cty |
(可选)内容类型,当 JWT 嵌套在其他结构中时使用 | "JWT" |
最佳实践: 在大多数场景下,
typ 字段可以省略,因为接收方通常通过上下文(如 HTTP Authorization Header 中的 Bearer 前缀)即可判断令牌类型。但建议在需要明确标识 JWT 格式时显式声明 "typ": "JWT",以增强互操作性。
3.2 alg 算法声明
alg(Algorithm)字段是 Header 中最关键的安全字段,它声明了用于签名或加密的算法。该字段的值必须与 JWT 签名/加密的实际算法严格一致,否则会导致验证失败或安全漏洞。
常见的 alg 值包括:
- HS256:HMAC with SHA-256(对称签名)
- RS256:RSA with SHA-256(非对称签名)
- ES256:ECDSA with P-256 and SHA-256(椭圆曲线签名)
- none:无签名(仅用于调试,生产环境禁止使用)
3.3 常见算法类型对比
| 算法 | 类型 | 密钥 | 签名长度 | 性能 | 典型场景 |
|---|---|---|---|---|---|
| HS256 | 对称 | 共享密钥(256位) | 32 字节 | 快 | 内部服务间通信、单点登录 |
| RS256 | 非对称 | 私钥签名 / 公钥验证 | 256 字节 | 慢 | 第三方认证、开放 API |
| ES256 | 非对称 | 私钥签名 / 公钥验证 | 64 字节 | 中 | 移动端、IoT 设备 |
安全提示: 对称算法(HS256)要求签名方和验证方共享同一个密钥,密钥泄露风险较高。非对称算法(RS256/ES256)允许签名方持有私钥,验证方仅需公钥,更适合分布式系统。ES256 在相同安全强度下签名长度更短,适合带宽受限场景。
3.4 算法选择决策流程
下图展示了在系统架构中如何根据安全需求与部署环境选择合适的签名算法:
3.5 Header 安全风险与防护
JWT Header 是攻击者篡改的常见目标,以下是最关键的三个安全风险:
- 算法混淆攻击(Algorithm Confusion):攻击者将
alg从RS256改为HS256,并利用泄露的公钥作为 HMAC 密钥进行签名,导致验证通过。防护措施:在验证时强制指定预期算法,拒绝alg字段的任意值。 - none 算法攻击:攻击者将
alg设为"none",绕过签名验证。防护措施:在 JWT 库中禁用none算法,并始终验证签名。 - Header 注入:攻击者通过修改 Header 中的
kid(Key ID)等字段,指向恶意密钥。防护措施:对kid等字段进行白名单校验。
架构师提醒: 在微服务网关或 API 网关层统一进行 JWT 验证时,务必对 Header 中的
alg 字段做白名单校验。例如,只允许 ["RS256", "ES256"],拒绝 HS256 和 none。这是防止算法混淆攻击的第一道防线。
3.6 典型 Header 示例
以下是一个完整的 JWT Header 示例,使用 RS256 算法:
{
"alg": "RS256",
"typ": "JWT",
"kid": "key-id-2024-01"
}
对应的 Base64URL 编码后的 Header 字符串:
eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCIsImtpZCI6ImtleS1pZC0yMDI0LTAxIn0
该 Header 与 Payload、Signature 共同构成完整的 JWT:
eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCIsImtpZCI6ImtleS1pZC0yMDI0LTAxIn0.
eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ.
SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c
关键总结: Header 中的
alg 字段是 JWT 安全的核心。选择算法时需权衡性能、密钥管理和部署环境。非对称算法(RS256/ES256)更适合开放系统,对称算法(HS256)适合内部信任域。始终在服务端对 alg 进行白名单校验,拒绝 none 算法。