JWT Token 安全检查清单:开发者自查手册
JWT(JSON Web Token)几乎是前后端登录鉴权的事实标准:服务端签发、客户端携带、无状态校验。但它只是一种数据格式,本身并不保证安全——用错了,敏感信息会泄露、账号会被伪造。本文整理一份 JWT 安全自查清单,帮你逐项排查。
先搞懂 JWT 的三段结构
一个 JWT 长这样:xxxxx.yyyyy.zzzzz,用点号分隔成三段:
- Header:声明签名算法和类型,比如
{"alg":"HS256","typ":"JWT"}。 - Payload:存放声明(claims),比如用户 ID、过期时间、角色。
- Signature:服务端用密钥对前两段签名,用于验证 Token 没被篡改。
最关键的一点:Header 和 Payload 是 Base64URL 编码,不是加密。任何人拿到 Token 都能解码看到 Payload 内容。所以 Payload 里绝不能放敏感信息。
7 条安全自查清单
1. Payload 里绝不放敏感信息
密码、密钥、身份证号、银行卡号——这些一律不能进 Payload。它能被任何人读取,等于明文公开。
2. 拒绝 alg 为 none
alg 字段为 none 表示不验签,任何人都能伪造一个「有效」Token。服务端必须强制校验算法,明确拒绝 none 和不在白名单里的算法。
3. 校验时间字段
签发后必须校验:
exp:过期时间,过了必须拒绝。nbf:生效时间,没到不能使用。iat:签发时间,可用来排查异常。
不校验 exp 等于 Token 永久有效,一旦泄露无法挽回。
4. 密钥要足够长、绝不泄露
对称算法(如 HS256)的密钥至少 256 位(32 字节),且绝不能写进前端代码、提交到 Git 或硬编码在配置里。密钥泄露等于任何人都能伪造 Token。
5. 只在 HTTPS 下传输
Token 通常放在 Authorization 请求头里传输。HTTP 下会被中间人截获,全站 HTTPS 是底线。
6. 不要用 JWT 当长会话
JWT 一旦签发,在 exp 之前无法主动失效(这是无状态设计的代价)。所以正确的做法是:
exp设短一点(比如 15 分钟到 2 小时)。- 配合 refresh token 续期,refresh token 记录在服务端、可主动撤销。
这样即便 Token 泄露,攻击窗口也很短。
7. 校验签发方和受众
iss(issuer,签发方)和 aud(audience,受众)这两个声明用来限定 Token 的使用范围。多个服务共用一套密钥时,务必校验它们,防止 A 服务的 Token 被 B 服务误用。
调试时怎么查看 Token
排查接口 401/403 时,往往需要确认 Token 的 Payload 到底装了什么、exp 是否已过期。把 Token 粘进 UPTools JWT 解析工具,可以直接看到 Header、Payload 的内容,以及 exp/iat 等时间字段转换成的本地时间,方便快速定位问题。
总结
JWT 安全的核心是三句话:Payload 不存敏感信息、服务端严格验签、设置合理的过期时间。沿着上面 7 条清单逐项排查,能挡住绝大多数 JWT 相关的安全漏洞。
相关文章