JWT安全详解
字数 1257 2025-11-18 00:17:40
JWT安全详解
一、JWT基础概念
JWT(JSON Web Token)是一种开放标准(RFC 7519),用于在各方之间安全传输信息。它由三部分组成:
- 头部(Header):包含令牌类型(如"JWT")和签名算法(如HS256、RS256)。
{"alg":"HS256","typ":"JWT"} - 载荷(Payload):存放实际传输的数据(例如用户ID、权限),包含三类声明:
- 注册声明(如iss签发者、exp过期时间)
- 公共声明(可自定义)
- 私有声明(双方协定的自定义字段)
- 签名(Signature):对头部和载荷的Base64URL编码字符串拼接后,通过指定算法生成签名,用于验证令牌完整性。
三部分通过点(.)连接形成完整JWT:Base64URL(Header).Base64URL(Payload).Signature。
二、JWT工作流程
- 用户登录后,服务器生成JWT并返回给客户端。
- 客户端在后续请求的Authorization头中携带JWT(格式:
Bearer <token>)。 - 服务器验证签名和声明(如过期时间)后处理请求。
三、常见安全风险及防护
-
算法混淆攻击(Algorithm Confusion)
- 原理:攻击者修改头部算法为"none"(无签名)或将非对称算法(如RS256)改为对称算法(如HS256),利用服务器公钥作为HS256的密钥伪造签名。
- 案例:
- 原始头部:
{"alg":"RS256"} - 攻击修改:
{"alg":"HS256"} - 利用服务器公钥生成HS256签名,绕过非对称验证。
- 原始头部:
- 防护:
- 严格校验算法类型,拒绝"none"算法。
- 非对称算法验证时,禁止接受对称算法密钥。
-
签名验证缺失
- 原理:服务器未验证签名直接解码载荷,导致攻击者可篡改数据。
- 防护:始终验证签名,且使用安全库(如java-jwt、pyjwt)。
-
敏感信息泄露
- 原理:JWT载荷仅Base64URL编码(非加密),可被中间人解码。
- 案例:载荷包含
{"user":"admin","password":"123456"},直接解码暴露密码。 - 防护:
- 避免在载荷中存放敏感信息(如密码、密钥)。
- 敏感数据传输使用HTTPS加密通道。
-
过期时间(exp)过长
- 原理:exp设置过长(如30天),增加令牌被盗用风险。
- 防护:设置较短过期时间(如15分钟),结合刷新令牌机制。
-
密钥管理不当
- 风险:使用弱密钥(如"secret")或硬编码密钥易被破解。
- 防护:
- 使用强随机密钥(长度≥256位)。
- 密钥定期轮换,且不同服务使用不同密钥。
四、安全最佳实践
- 算法选择:优先使用非对称算法(如RS256)避免密钥分发风险。
- 声明验证:强制校验iss(签发者)、aud(受众)、exp(过期时间)等关键声明。
- 存储安全:客户端使用HttpOnly Cookie存储JWT,防止XSS窃取。
- 日志监控:记录JWT验证失败事件,及时发现攻击尝试。
通过严格遵循上述规范,可有效提升JWT在身份认证场景中的安全性。