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:

  1. 解析Token,获取Header和Payload。
  2. 根据Header中的算法(如HS256)和预存储的密钥(或公钥)重新计算Signature。
  3. 比较计算出的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验证(用公钥作为密钥),攻击者可用公钥伪造签名。

3.2 密钥泄露与弱密钥

  • 若HMAC的密钥强度不足(如短密钥、常见单词),可能被暴力破解。
  • 防御:使用强随机密钥(≥256位),定期轮换。

3.3 未验证签名

  • 开发错误:服务端未验证Signature直接解析Payload。
  • 后果:攻击者可任意修改Payload(如提升权限)。

3.4 敏感信息泄露

  • JWT的Payload仅Base64编码,未加密(除非使用JWE)。
  • 风险:Token被拦截后,攻击者可解码获取敏感数据(如用户ID)。

4. JWT 安全最佳实践

  1. 严格限制算法:服务端应强制指定允许的算法(如只接受RS256)。
  2. 验证所有声明:检查 expissaud(受众)等字段。
  3. 保护密钥
    • HS256:密钥安全存储,避免硬编码在代码中。
    • RS256:私钥仅服务端持有,公钥分发给客户端。
  4. 使用HTTPS:防止Token在传输中被窃取。
  5. 短期有效:设置较短的过期时间(如15分钟),结合刷新令牌机制。

5. 攻击案例模拟

场景:算法混淆攻击

  1. 攻击者捕获合法JWT:eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjMifQ.doz56kC...
  2. 修改Header为 {"alg": "none", "typ": "JWT"},Payload改为 {"sub": "admin"}
  3. 删除Signature,生成Token:base64(Header).base64(Payload).(末尾加点)。
  4. 若服务端支持 none 算法,可能接受此Token并授予管理员权限。

防御:禁用 none 算法,严格校验算法类型。


6. 总结

JWT的安全依赖于正确的实现和配置。开发人员需充分理解其验证机制,避免常见漏洞(如算法混淆、弱密钥),并结合加密(JWE)、短期令牌等策略增强安全性。

JSON Web Token (JWT) 安全详解 1. JWT 的基本概念与结构 JWT(JSON Web Token)是一种用于身份验证和授权的开放标准(RFC 7519),它通过数字签名或加密确保数据的完整性和可信性。JWT 由三部分组成,用点( . )分隔: Header :包含令牌类型(如 "alg": "HS256" )和签名算法。 Payload :存储实际数据(如用户ID、权限等),包含标准声明(如 exp 过期时间)和自定义声明。 Signature :对前两部分进行签名,防止篡改(例如使用HMAC或RSA私钥)。 示例: 最终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验证(用公钥作为密钥),攻击者可用公钥伪造签名。 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)、短期令牌等策略增强安全性。