← 返回题目列表

JWT 有哪些安全风险?生产环境如何正确使用?

高频 中等 第 17 / 27 题 更新于 2026/07/31
JWTToken认证安全

简化版

JWT 是自包含的签名 Token,适合无状态认证,但风险包括密钥泄露、算法混淆、过期时间过长、无法及时撤销、把敏感信息放进 payload。生产中要校验签名、算法、过期时间、签发方和受众,使用 HTTPS 传输,并设计刷新与撤销机制。

详细版

JWT 通常由 Header、Payload、Signature 三部分组成。Payload 只是 Base64URL 编码,不是加密,任何拿到 Token 的人都能解码看到内容。因此不要放密码、身份证号、内部权限细节等敏感数据。

服务端验证 JWT 时不能只解码,要验证签名和声明,如 expissaud。访问 Token 应短期有效,刷新 Token 单独管理并可撤销。Token 放哪里也要谨慎:放 localStorage 易受 XSS 读取,放 HttpOnly Cookie 要处理 CSRF。

完整版教学

一、JWT 的结构和安全边界

JWT 由三段组成:Header 描述算法和类型,Payload 放声明,Signature 用密钥对前两段签名。签名保证内容没有被篡改,但不保证内容保密。

header.payload.signature

例如 payload 中的 {"user_id":42,"role":"user"} 可以被任何持有 Token 的人解码看到。签名的作用是让攻击者不能把 role 改成 admin 后骗过服务端。

二、签名验证不能省

JWT 的核心安全点是验证签名。只把 Token 解码出来读 payload,不验证签名,就等于相信用户自己提交的身份声明。

错误流程: decode payload -> trust user_id
正确流程: verify signature -> verify claims -> trust limited claims

服务端还应固定允许算法,比如只允许 RS256HS256 中明确的一种,避免历史上常见的 none 算法和算法混淆问题。

记忆钩子:JWT 的可信度来自“签名验证 + 声明校验”,不是来自三段字符串长得像 Token。

三、常见声明要校验

JWT 里常见的安全声明包括 expnbfiatissaudsubjti。它们共同回答 Token 是否过期、是否到生效时间、谁签发、给谁用、代表哪个主体、是否可追踪撤销。

Claim含义安全作用
exp过期时间防长期盗用
iss签发方防接受错误来源
aud受众防 Token 被跨系统误用
sub主体表示用户或客户端
jti唯一 ID支持黑名单和审计

exp 不是装饰字段,服务端必须严格校验。

四、过期时间和刷新机制

访问 Token 过期时间通常较短,例如 15 分钟或 1 小时。刷新 Token 有效期更长,但要更严格保存、轮换和撤销。

access token: 15min
refresh token: 7d / 30d
refresh each time -> rotate refresh token

这样即使访问 Token 被盗,窗口也较短。刷新 Token 一旦泄露危害更大,所以要能在服务端撤销,并检测重复使用。

五、JWT 放在哪里

Token 放 localStorage,前端读取方便,但 XSS 能直接偷走。放 HttpOnly Cookie,脚本读不到,但浏览器会自动携带,需配合 SameSite、CSRF Token 或 Origin 校验。

localStorage: 易被 XSS 读取
HttpOnly Cookie: 降低窃取,注意 CSRF
Authorization Header: 常用于 API

没有绝对万能位置。选择要结合应用形态、前后端域名、CSRF 防护和 XSS 防护水平。

六、撤销为什么困难

JWT 自包含意味着服务端不查 Session 也能验证身份,这带来无状态优势,也带来撤销困难。用户退出登录、改密码、封号后,如果旧 Token 未过期,理论上仍能通过签名验证。

无状态验证: 快,但难撤销
服务端黑名单: 可撤销,但又引入状态

常见方案是短有效期、维护 jti 黑名单、记录用户 Token 版本号、关键操作实时查权限。

七、密钥管理和轮换

JWT 的签名密钥如果泄露,攻击者就可以伪造 Token。生产环境密钥不能写进代码仓库,要放在密钥管理系统或部署平台 Secret 中,并支持定期轮换。

kid=2026-07
verify with public key 2026-07
rotate to kid=2026-08

使用非对称算法时,可以用 kid 标识当前公钥,让验证方按 key id 选择对应公钥。轮换时要保留旧公钥一段时间,直到旧 Token 过期。

八、权限变化后的处理

JWT 里如果放了角色或权限,用户权限变更后,旧 Token 可能仍带着旧权限。关键系统通常不把完整权限长期写进 Token,而是写用户 ID 和少量声明,敏感权限实时查服务端。

low risk: trust token role for short time
high risk: query current permission

如果必须把权限放进 Token,就要缩短有效期,并在权限变更时提高用户 Token 版本号让旧 Token 失效。

九、常见误区与追问

  • 误区:JWT payload 是加密的。 默认只是 Base64URL 编码,不能放敏感明文。
  • 误区:JWT 可以永久有效。 被盗后长期可用,风险极高。
  • 误区:只要能 decode 就说明 Token 合法。 必须验证签名、算法和声明。
  • 追问:JWT 如何撤销? 短过期、黑名单、Token 版本号、刷新 Token 轮换。
  • 追问:HS256 和 RS256 有什么区别? HS256 共享密钥签名,RS256 私钥签名公钥验证,更适合多服务验证。
  • 追问:为什么要校验 aud? 防止发给 A 系统的 Token 被 B 系统接受。
  • 追问:Token 泄露怎么办? 立即撤销刷新 Token、提高版本号、缩短访问 Token 窗口并排查日志。

十、加强记忆

JWT 要记住“签名不等于加密,无状态不等于无风险”。安全使用 JWT 的主线是:不放敏感信息,固定算法并验证签名,校验 exp/iss/aud,访问 Token 短期有效,刷新 Token 可撤销可轮换。它适合分布式认证,但撤销和泄露后的治理必须提前设计。