JWT 常用于登录态和接口鉴权,但它不是加密容器。Header 和 Payload 可以被直接解码查看。
xxxxx.yyyyy.zzzzz
header.payload.signatureJWT 通常由三段组成,中间用点号分隔:第一段是 Header,第二段是 Payload,第三段是 Signature。
三段分别代表什么?
| 部分 | 内容 | 是否加密 |
|---|---|---|
| Header | 算法和 token 类型,例如 alg、typ | 不是加密 |
| Payload | 业务声明,例如 sub、exp、role | 不是加密 |
| Signature | 用密钥或私钥计算出的签名 | 用于验证完整性 |
解码和验证是两件不同的事
解码只需要把前两段从 Base64URL 还原成 JSON,不需要密钥,所以攻击者也能任意制作一个看起来合理的 Payload。验证则必须由服务端根据允许的算法和可信密钥检查 Signature,并同时校验 exp、nbf、iss、aud 等声明。调试工具显示出字段,只能说明 token 结构可读,不能授予任何信任。
解码成功 ≠ 签名有效
签名有效 ≠ 当前请求有权限
完整判断 = 签名 + 时间 + 签发方 + 受众 + 业务权限服务端验证时的关键边界
- 由服务端配置允许的算法,不要直接接受 Header 中 alg 指定的任意算法。
- exp 和 nbf 通常使用秒级 Unix 时间戳,比较时要考虑小幅时钟偏差。
- RS256 等非对称算法使用公钥验签,HS256 则要求验证方持有同一个 secret。
- token 撤销、用户停用和权限变化不会自动写回旧 token,需要额外的会话策略。
- 签名只保护内容未被修改,不会隐藏 Payload,也不会证明终端设备安全。
排错时可以使用脱敏 token,或在本地查看 Header 与 Payload。生产密钥不应放进浏览器代码、截图、工单或第三方页面。需要验证真实签名时,优先在受控后端或本地开发环境使用与生产相同的验证库和算法白名单。
安全查看 JWT 的注意事项
- 不要把真实生产 token 粘贴到不可信网站。
- Payload 里不要放密码、身份证号、银行卡号等敏感信息。
- 看到 Payload 不代表 token 有效,还需要检查过期时间和签名。
- HS256 验签需要密钥;不要把生产密钥暴露给前端或第三方页面。
- 本地浏览器解码比上传到服务器的在线工具更适合排查敏感 token。
常见字段怎么看?
| 字段 | 含义 | 排查重点 |
|---|---|---|
| sub | 主体或用户 ID | 确认是不是当前用户 |
| exp | 过期时间 | 通常是 Unix 时间戳 |
| iat | 签发时间 | 判断 token 是否过旧 |
| aud | 受众 | 确认是否给当前服务使用 |
| iss | 签发方 | 确认来源是否可信 |
总结
JWT 的 Header 和 Payload 便于调试,但不应被当作保密空间。安全使用 JWT 的关键是控制签名密钥、过期时间和敏感字段。