JWT 安全完全指南:解码、验证与常见漏洞防范

实用工具(更新于 2026年5月1日)

JWT 是什么?

JWT(JSON Web Token)是一种开放标准(RFC 7519),用于在各方之间安全地传输信息。它是目前最流行的 API 认证方案,被 OAuth 2.0、OpenID Connect 广泛采用。

JWT 的结构

一个 JWT 由三部分组成,用 . 分隔:

eyJhbGciOiJIUzI1NiJ9.eyJzdWIiOiIxMjM0NTY3ODkwIn0.SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c
│        Header        │.│         Payload        │.│        Signature        │
部分 内容 编码方式
Header 算法 + 类型 Base64URL
Payload 声明(claims) Base64URL
Signature 签名 算法(Header + Payload, Secret)

⚠️ Header 和 Payload 只是 Base64URL 编码,不是加密。任何人都可以解码查看内容。


使用工具库解码 JWT

操作步骤

  1. 打开 JWT 解码工具
  2. 粘贴 JWT 字符串
  3. 查看解码后的 Header 和 Payload JSON
  4. 检查过期时间、签发者等字段

常见 Payload 字段

字段 含义 示例
sub 主题(用户 ID) "user_12345"
iss 签发者 "https://auth.example.com"
aud 受众 "api.example.com"
exp 过期时间(Unix 秒) 1717200000
iat 签发时间 1717196400
nbf 生效时间 1717196400
jti JWT ID(唯一标识) "a1b2c3d4"

JWT 签名算法

算法 类型 安全性 使用场景
HS256 对称 单服务、内部 API
HS384/HS512 对称 中高 高安全要求
RS256 非对称 多服务、OAuth
ES256 非对称 移动端、IoT
none 无签名 ❌ 危险 绝不应使用

对称 vs 非对称

HS256(对称):
  签名: HMAC-SHA256(header.payload, shared_secret)
  验证: 同一个 shared_secret
  问题: 所有服务共享密钥,泄露影响全部

RS256(非对称):
  签名: RSA-SHA256(header.payload, private_key)
  验证: RSA-SHA256(header.payload, public_key)
  优势: 公钥可以公开分发,私钥仅签发方持有

常见安全漏洞

1. alg: none 攻击

攻击者修改 Header 中的 algnone,去掉 Signature 部分:

// 原始 Header
{"alg": "HS256", "typ": "JWT"}

// 攻击修改
{"alg": "none", "typ": "JWT"}

防御:服务端必须白名单允许的算法,拒绝 none

2. 密钥混淆攻击

RS256 改为 HS256,使用公钥作为 HMAC 密钥:

攻击者获取公钥 → 修改 alg 为 HS256 → 用公钥签名 → 服务端用公钥验证 HMAC → 通过

防御:严格校验 Header 中的 alg 与预期一致。

3. 敏感信息泄露

因为 Payload 只是 Base64 编码,绝不应在 JWT 中存储

  • ❌ 密码、信用卡号
  • ❌ 个人隐私信息
  • ✅ 用户 ID、角色、权限

4. 过期时间设置不当

// ❌ 无过期时间 — Token 永久有效
{"sub": "user_123"}

// ❌ 过期时间过长 — 泄露后长期有效
{"sub": "user_123", "exp": 1893456000}  // 2030年

// ✅ 合理过期 + 刷新机制
{"sub": "user_123", "exp": 1717200000}   // 15-60 分钟

JWT 最佳实践

1. 使用短期 Access Token + Refresh Token

Access Token:  15-60 分钟过期,用于 API 调用
Refresh Token: 7-30 天过期,用于获取新的 Access Token

2. 存储位置

存储方式 XSS 风险 CSRF 风险 推荐
localStorage
sessionStorage
HttpOnly Cookie ⚠️ 需 CSRF 防护
内存变量 ✅ SPA 推荐

3. 验证清单

服务端验证 JWT 时必须检查:

  • 签名是否有效
  • exp 是否过期
  • nbf 是否已生效
  • iss 是否为预期的签发者
  • aud 是否包含当前服务
  • alg 是否在白名单中

调试 JWT 问题的步骤

  1. 解码 JWT:使用 JWT 解码工具 查看 Header 和 Payload
  2. 检查 exp:Token 是否已过期?
  3. 检查 alg:签名算法是否符合预期?
  4. 检查 iss/aud:签发者和受众是否正确?
  5. 验证签名:使用 JWT 生成器 用相同密钥重新签名对比
  6. 检查传输:Authorization 头格式是否为 Bearer <token>

相关工具


总结

JWT 是现代 API 认证的基石,但其 Base64 编码而非加密的特性带来了独特的安全挑战。理解 JWT 的结构、签名机制和常见漏洞,是每一个全栈开发者的必备知识。工具库的 JWT 解码工具让你可以快速排查认证问题,但请记住——解码不等于验证,生产环境必须在服务端验证签名

#JWT#认证#安全#OAuth#API