JWT 在线解析 / 解码 / 签名校验

粘贴 JSON Web Token,即可拆分 Header / Payload / Signature 三段并解码为可读 JSON, 自动换算 exp / iat / nbf 时间并标记过期状态,支持 HMAC 密钥验签。 所有处理均在浏览器本地完成。

输入 JWT

等待输入
形如 xxxxx.yyyyy.zzzzz 的三段 base64url 字符串,通常来自 Authorization: Bearer 请求头。
签名算法
-
令牌类型
-
过期状态
-

Header(头部)

Header(头部)会显示在这里。

Payload(载荷)

载荷是公开可读的声明集合,请勿放入敏感信息。
Payload(载荷)会显示在这里。

Signature(签名段)

Signature(签名)会显示在这里。

签名校验(HS256 / HS384 / HS512)

输入与签发方一致的对称密钥,本地重算 HMAC 并比对签名段。不知道密钥就无法伪造签名,但注意:验签只证明「未被篡改」,不代表内容保密。
输入密钥后点「校验签名」,结果显示在这里。

JWT 的三段结构:能读,不等于能信

JWT(JSON Web Token)是一个把 JSON 数据放进 URL 安全字符串的开放标准(RFC 7519), 最常见的用途是登录后的会话凭证:服务端签发一个 Token,之后每个请求都带着它,服务端无需查库就能确认「这是谁、有什么权限」。 它的结构极其简单——三个用 . 连接的base64url 段: Header 声明签名算法(alg,如 HS256)和类型(typ); Payload 是声明(claims)的集合; Signature 是用密钥对前两段算出的签名。

base64url 与 Base64 的差异只有两处:用 - 和 _ 替换 + 和 /, 并省略末尾的 = 填充——这样 Token 可以直接放进 URL 而不会被转义规则破坏。 它是编码而不是加密,所以本工具不做任何密钥就能把 Header 和 Payload 还原成 JSON。 这也引出最重要的一条安全常识:Payload 是公开可读的。 任何拿到 Token 的人(浏览器插件、日志、代理服务器、共享链接)都能看到里面的全部内容, 密码、手机号、身份证号这类敏感信息绝对不能放进去。

签名解决的是「防篡改」而不是「防偷看」:签发方用密钥对 Header + Payload 计算 HMAC, 校验方用同一密钥重算并比对。改动任何一个字符都会导致签名对不上。 本工具的验签功能用 WebCrypto 在本地完成这一过程,密钥不会离开你的设备。 HS256 / HS384 / HS512 是对称算法(一个密钥同时负责签与验); RS256 等是非对称算法(私钥签发、公钥验证),适合第三方接入场景,本站只提供解析。

Payload 里有一组标准化的时间声明值得单独说明: exp(expiration time)是过期时刻,iat(issued at)是签发时刻, nbf(not before)是生效时刻,单位都是Unix 秒。 调试时最容易犯的错是把 exp 当成毫秒时间戳,换算出的日期差了整整一千倍—— 本工具自动识别秒 / 毫秒,并同时给出本地时间与 UTC,过期直接标红、十分钟内即将过期标黄。 此外 iss(签发者)、aud(受众)、sub(主体)用于多系统间的边界校验, 正规实现在验签之外还必须检查这几个字段,否则会犯经典的「A 系统的合法 Token 被拿到 B 系统使用」错误。

还有一个历史悠久的攻击面值得每个开发者知道:none 算法降级攻击。 早年一些库允许 Header 里写 "alg": "none" 并跳过验签,攻击者便把签名段换成 none、 任意伪造 Payload。如今主流库已默认拒绝,但审查自建服务时仍要确认代码里存在算法白名单—— 只接受预期的那一个 alg,而不是读 Token 里说什么就算什么。 解析全程在浏览器本地完成,你的 Token 不会经过任何服务器。

JWT 使用小贴士

  • JWT 的 Payload 只是 base64url 编码,公开可读,不要放密码、手机号等敏感信息。
  • exp 通常以「秒」为单位,看到 10 位数字就是秒、13 位就是毫秒,本站自动识别。
  • 验签通过只说明「未被篡改」,还需校验 iss / aud 是否属于你的系统。
  • 服务端必须固定期望算法,拒绝 alg: none,防止签名校验被绕过。
  • Token 出现在 URL 里会被日志与浏览器历史记录,高敏场景优先使用 HttpOnly Cookie。