JSON Web Token (JWT) 安全详解
字数 1670 2025-11-14 02:32:45
JSON Web Token (JWT) 安全详解
1. JWT 的基本概念与结构
JWT(JSON Web Token)是一种用于身份验证和授权的开放标准(RFC 7519),它通过数字签名或加密确保数据的完整性和可信性。JWT 由三部分组成,用点(.)分隔:
- Header:包含令牌类型(如
"alg": "HS256")和签名算法。 - Payload:存储实际数据(如用户ID、权限等),包含标准声明(如
exp过期时间)和自定义声明。 - Signature:对前两部分进行签名,防止篡改(例如使用HMAC或RSA私钥)。
示例:
Header: {"alg": "HS256", "typ": "JWT"}
Payload: {"sub": "123", "name": "Alice", "exp": 1633042800}
Signature: HMACSHA256(base64UrlEncode(Header) + "." + base64UrlEncode(Payload), secret)
最终Token格式:base64UrlEncode(Header).base64UrlEncode(Payload).Signature
2. JWT 的安全机制与验证流程
2.1 签名验证
服务端通过以下步骤验证JWT:
- 解析Token,获取Header和Payload。
- 根据Header中的算法(如HS256)和预存储的密钥(或公钥)重新计算Signature。
- 比较计算出的Signature与Token中的Signature是否一致。若不一致,则拒绝请求。
2.2 标准声明验证
- exp(Expiration Time):检查当前时间是否超过过期时间。
- nbf(Not Before):确保Token未在生效时间前被使用。
- iss(Issuer):验证颁发者是否受信任。
3. JWT 常见安全漏洞与攻击手法
3.1 算法混淆攻击(Algorithm Confusion)
- 原理:攻击者将Header中的算法改为
none(如果服务端支持)或从非对称算法(如RS256)改为对称算法(如HS256),从而绕过签名验证。 - 示例:
- 原始Header:
{"alg": "RS256", "typ": "JWT"} - 攻击者修改为:
{"alg": "HS256", "typ": "JWT"} - 服务端若错误地使用HS256验证(用公钥作为密钥),攻击者可用公钥伪造签名。
- 原始Header:
3.2 密钥泄露与弱密钥
- 若HMAC的密钥强度不足(如短密钥、常见单词),可能被暴力破解。
- 防御:使用强随机密钥(≥256位),定期轮换。
3.3 未验证签名
- 开发错误:服务端未验证Signature直接解析Payload。
- 后果:攻击者可任意修改Payload(如提升权限)。
3.4 敏感信息泄露
- JWT的Payload仅Base64编码,未加密(除非使用JWE)。
- 风险:Token被拦截后,攻击者可解码获取敏感数据(如用户ID)。
4. JWT 安全最佳实践
- 严格限制算法:服务端应强制指定允许的算法(如只接受RS256)。
- 验证所有声明:检查
exp、iss、aud(受众)等字段。 - 保护密钥:
- HS256:密钥安全存储,避免硬编码在代码中。
- RS256:私钥仅服务端持有,公钥分发给客户端。
- 使用HTTPS:防止Token在传输中被窃取。
- 短期有效:设置较短的过期时间(如15分钟),结合刷新令牌机制。
5. 攻击案例模拟
场景:算法混淆攻击
- 攻击者捕获合法JWT:
eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjMifQ.doz56kC... - 修改Header为
{"alg": "none", "typ": "JWT"},Payload改为{"sub": "admin"}。 - 删除Signature,生成Token:
base64(Header).base64(Payload).(末尾加点)。 - 若服务端支持
none算法,可能接受此Token并授予管理员权限。
防御:禁用 none 算法,严格校验算法类型。
6. 总结
JWT的安全依赖于正确的实现和配置。开发人员需充分理解其验证机制,避免常见漏洞(如算法混淆、弱密钥),并结合加密(JWE)、短期令牌等策略增强安全性。