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
操作步骤
- 打开 JWT 解码工具
- 粘贴 JWT 字符串
- 查看解码后的 Header 和 Payload JSON
- 检查过期时间、签发者等字段
常见 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 中的 alg 为 none,去掉 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 问题的步骤
- 解码 JWT:使用 JWT 解码工具 查看 Header 和 Payload
- 检查 exp:Token 是否已过期?
- 检查 alg:签名算法是否符合预期?
- 检查 iss/aud:签发者和受众是否正确?
- 验证签名:使用 JWT 生成器 用相同密钥重新签名对比
- 检查传输:Authorization 头格式是否为
Bearer <token>?
相关工具
- JWT 解码 — 解析 Header 和 Payload
- JWT 生成器 — 自定义生成 JWT 用于测试
- HMAC 计算 — 理解 HMAC 签名原理
- Base64 编解码 — JWT 使用的编码方式
总结
JWT 是现代 API 认证的基石,但其 Base64 编码而非加密的特性带来了独特的安全挑战。理解 JWT 的结构、签名机制和常见漏洞,是每一个全栈开发者的必备知识。工具库的 JWT 解码工具让你可以快速排查认证问题,但请记住——解码不等于验证,生产环境必须在服务端验证签名。
#JWT#认证#安全#OAuth#API