JWT 解码完整指南:结构、claims、安全实践
JSON Web Token 是现代 Web 鉴权事实标准。本指南讲清楚 JWT 的三段结构、常用 claims、安全风险与最佳实践。
JWT(JSON Web Token)是一种紧凑的、URL 安全的令牌格式,常用于 API 鉴权、单点登录(SSO)、信息交换。本指南从结构入手,讲清楚每段的含义、常见 claim 字段、何时该用 JWT、以及最容易出的安全问题。
JWT 的三段结构
JWT 由 header.payload.signature 三段组成,每段是 Base64URL 编码:
eyJhbGciOiJIUzI1NiJ9.eyJzdWIiOiIxMjMifQ.SflKxw...
- Header:算法(HS256、RS256...)+ 类型
- Payload:实际数据(claims)
- Signature:用 secret 对前两段签名的结果
本工具粘贴 token 自动分别显示三段,并把 payload 中的时间字段(iat/exp/nbf)转为可读时间。
常用 Claims(声明)
issIssuer 签发者(如 https://api.example.com)subSubject 主题(通常是用户 ID)audAudience 受众(哪个服务可用)expExpiration 过期时间(Unix 秒)nbfNot Before 生效时间iatIssued At 签发时间jtiJWT ID(防重放)
业务自定义 claim 也可以放,如 name、role、tenantId。
解码 ≠ 验签
Header 和 Payload 是 Base64 编码的明文,不需要密钥即可读取。本工具就是只解码不验签。
服务端必须用 secret/公钥验证签名才能信任 token 内容。验签失败就拒绝,否则 JWT 就成了废纸。
安全启示:敏感信息不要放 payload,因为客户端能看到。
过期与刷新
exp决定过期时间,常见 15 分钟到 24 小时- 短期 access token + 长期 refresh token 是行业最佳实践
- 客户端在 access token 过期前用 refresh token 换新 token
- refresh token 应只在受保护接口使用,可吊销(数据库黑名单)
常见安全坑
- alg=none 攻击:旧库允许 alg 设为 none 跳过验签。生产中必须强制指定算法
- 密钥太弱:HS256 至少 256 位密钥;生产推荐 RS256(非对称,私钥仅服务端)
- 不验 exp:忘记检查过期,token 永远有效
- payload 含敏感数据:客户端能 base64 解码读到,密码绝不能放
- 太长:JWT 越长 cookie/header 越大,影响每次请求
常见问题
JWT vs Session 怎么选?
JWT 无状态、易横向扩展,但难撤销;Session 易撤销但需要后端存储。短期 token 用 JWT,长期会话用 Session 更灵活。
能在浏览器存 JWT 吗?
可以但要注意:localStorage 易遭 XSS;HttpOnly Cookie 安全但要防 CSRF。综合推荐 HttpOnly Cookie + SameSite=Strict + CSRF token。
什么时候用 RS256 而不是 HS256?
微服务架构下:签发者持私钥,多个验证方持公钥,避免共享 secret。