JWT安全详解
字数 1257 2025-11-18 00:17:40

JWT安全详解

一、JWT基础概念
JWT(JSON Web Token)是一种开放标准(RFC 7519),用于在各方之间安全传输信息。它由三部分组成:

  1. 头部(Header):包含令牌类型(如"JWT")和签名算法(如HS256、RS256)。
    {"alg":"HS256","typ":"JWT"}
    
  2. 载荷(Payload):存放实际传输的数据(例如用户ID、权限),包含三类声明:
    • 注册声明(如iss签发者、exp过期时间)
    • 公共声明(可自定义)
    • 私有声明(双方协定的自定义字段)
  3. 签名(Signature):对头部和载荷的Base64URL编码字符串拼接后,通过指定算法生成签名,用于验证令牌完整性。

三部分通过点(.)连接形成完整JWT:Base64URL(Header).Base64URL(Payload).Signature

二、JWT工作流程

  1. 用户登录后,服务器生成JWT并返回给客户端。
  2. 客户端在后续请求的Authorization头中携带JWT(格式:Bearer <token>)。
  3. 服务器验证签名和声明(如过期时间)后处理请求。

三、常见安全风险及防护

  1. 算法混淆攻击(Algorithm Confusion)

    • 原理:攻击者修改头部算法为"none"(无签名)或将非对称算法(如RS256)改为对称算法(如HS256),利用服务器公钥作为HS256的密钥伪造签名。
    • 案例
      • 原始头部:{"alg":"RS256"}
      • 攻击修改:{"alg":"HS256"}
      • 利用服务器公钥生成HS256签名,绕过非对称验证。
    • 防护
      • 严格校验算法类型,拒绝"none"算法。
      • 非对称算法验证时,禁止接受对称算法密钥。
  2. 签名验证缺失

    • 原理:服务器未验证签名直接解码载荷,导致攻击者可篡改数据。
    • 防护:始终验证签名,且使用安全库(如java-jwt、pyjwt)。
  3. 敏感信息泄露

    • 原理:JWT载荷仅Base64URL编码(非加密),可被中间人解码。
    • 案例:载荷包含{"user":"admin","password":"123456"},直接解码暴露密码。
    • 防护
      • 避免在载荷中存放敏感信息(如密码、密钥)。
      • 敏感数据传输使用HTTPS加密通道。
  4. 过期时间(exp)过长

    • 原理:exp设置过长(如30天),增加令牌被盗用风险。
    • 防护:设置较短过期时间(如15分钟),结合刷新令牌机制。
  5. 密钥管理不当

    • 风险:使用弱密钥(如"secret")或硬编码密钥易被破解。
    • 防护
      • 使用强随机密钥(长度≥256位)。
      • 密钥定期轮换,且不同服务使用不同密钥。

四、安全最佳实践

  1. 算法选择:优先使用非对称算法(如RS256)避免密钥分发风险。
  2. 声明验证:强制校验iss(签发者)、aud(受众)、exp(过期时间)等关键声明。
  3. 存储安全:客户端使用HttpOnly Cookie存储JWT,防止XSS窃取。
  4. 日志监控:记录JWT验证失败事件,及时发现攻击尝试。

通过严格遵循上述规范,可有效提升JWT在身份认证场景中的安全性。

JWT安全详解 一、JWT基础概念 JWT(JSON Web Token)是一种开放标准(RFC 7519),用于在各方之间安全传输信息。它由三部分组成: 头部(Header) :包含令牌类型(如"JWT")和签名算法(如HS256、RS256)。 载荷(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在身份认证场景中的安全性。