跳到正文
DevTools / JWT 解析与验证

JWT 解析与验证

JWT 是由点号连接的三段 Base64URL,调试它有一半的困难仅仅在于看清里面是什么。本解析器把 token 拆成头部、载荷和签名,解释每一个注册声明,把过期时间与生效时间渲染成人类可读的倒计时,并能用 HMAC 密钥或 RSA 公钥验签,从而判断拒绝到底来自 token 本身还是来自服务端配置的密钥。

完全在浏览器本地运行——不会上传任何内容。

工作原理

JWT 的形式是 header.payload.signature,前两段是 Base64URL 编码的 JSON。头部用 alg 声明签名算法,用 kid 标识密钥;载荷承载声明,本质上就是一组 JSON 键值对。签名是对 header.payload 这个字面字符串——包含编码后的确切字节——使用头部所指算法和颁发方持有的密钥计算出来的。解析前两段不需要任何密钥,这也是常见困惑的来源:Base64URL 是编码,不是保护。

注册声明有固定含义:iss 标识颁发方,aud 标识预期接收方,sub 标识主体,exp 是以 Unix 时间戳表示的过期时刻,nbf 是生效时刻,iat 是签发时刻,jti 是用于吊销列表的唯一标识。校验不只是解码:服务端必须确认签名通过、当前时间位于 nbf 与 exp 之间、iss 与自身身份一致、aud 包含自己。一个能够正常解析且尚未过期的 token 仍可能因为其他任何一条被拒绝。

算法分为两族。HS256、HS384、HS512 属于 HMAC:同一把密钥既签名又验签,这在单一后端同时掌握两端时没问题,但意味着任何能验签的一方也能伪造。RS256 与 ES256 是非对称的:颁发方用私钥签名,各服务用公钥验签,因此被攻破的验签方无法凭空签发 token。none 算法意味着完全不签名,而 JWT 的经典漏洞就是某库从 token 头部读取 alg 并接受 none,或是在服务端其实用 RSA 公钥验签时接受了 HS256。

验签之所以重要,是因为单独解析出的载荷不能证明任何事情。任何人都能伪造一个带管理员角色和未来过期时间的 token,只有签名把这些声明绑定到颁发方。本工具在本地重算签名——HS* 走 Web Crypto 的 HMAC,RS* 走 RSA-PSS 或 RSASSA-PKCS1-v1_5——并逐字节比对,从而把生产环境的“签名无效”定位到密钥错误、算法错误或 token 被截断,而不用靠猜。

常见应用场景

  • 解析从 Authorization 请求头里复制出的 token,确认它携带的是哪个租户或角色。
  • 把 exp 时间戳读成日期,判断“令牌过期”报错是否属实。
  • 用共享密钥验证 Webhook 签名,确认自己的 HMAC 代码写对了。
  • 检查身份提供方发送的 audience 是否确实是 API 所期望的。
  • 比对 token 头部的 alg 与 kid 和服务端已配置的密钥,追踪 401 的成因。
  • 在把 token 写进日志前确认其中不含敏感个人信息。

最后更新: 2026-10-14

常见问题解答

把生产环境的 JWT 粘进来安全吗?

解析完全在浏览器中进行,token 不会被传输,打开网络面板即可确认。但无论如何都应当把 token 本身视为凭证:有效的 JWT 是持有者令牌,任何持有它的人都能以该主体身份行事直到过期。尽量使用测试环境的 token;如果必须用生产环境的,事后应吊销或等其过期,而不是把它留在聊天记录或浏览器历史里。

token 能正常解析,接口却返回 401,为什么?

解析和校验是两码事。三种常见原因是 exp 已过期、aud 或 iss 不匹配、以及签名无法用服务端持有的密钥验证通过。先看 exp 和 nbf,因为它们不需要密钥就能看到,再比对头部的 alg 与 kid 和服务端配置。颁发方与校验方之间超过一两分钟的时钟偏差,也足以让一个看起来完全正常的 token 被拒绝。

既然有签名,为什么载荷还是可读的?

因为签名证明的是来源与完整性,不是机密性。载荷经过 Base64URL 编码,任何人一步就能还原,签名并不加密。JWT 好比颁发方签署的一份声明,像护照,不是密封信封。绝不要把机密、个人数据或任何你不愿出现在 URL 里的内容放进 JWT 载荷;如果声明确实需要保密,请使用加密的 JWE。

应该接受 none 算法吗?

不应该,你的库也不应该。接受 alg: none 等于接受未签名的 token,任何人都可以伪造任何身份。相关的攻击是算法混淆:攻击者把 alg 从 RS256 改成 HS256,再用公钥作为 HMAC 密钥签名,服务端若照做就会被骗过。两种情况的防御方式相同——在校验配置中固定期望的算法,永不从 token 头部读取它。

相关工具