JWT 解析工具
在线解析 JWT 头部与载荷,逐条解释声明并本地验证签名
JWT 令牌
令牌只在本机浏览器解码,不会发送到任何服务器。粘贴时多余的空格、引号与 Bearer 前缀会自动去除。
Header 头部
—
—
Payload 载荷
—
—
声明逐条解读
| 声明 | 值 | 含义与本工具的处理 |
|---|
值列保持令牌中的原始类型:字符串带引号、数字与布尔值不带。自定义声明无法逐一预置含义,会标注为业务方自定义字段。
时间戳换算
| 声明 | 本地时间 | 相对当前 |
|---|
签名验证
验签在浏览器内用 WebCrypto 完成,密钥不会离开本机。签名验证只证明「内容未被篡改」,令牌能不能用还要看有效期、签发者、受众与业务权限。
工具介绍
调试 JWT 最常见的需求只有两个:看清里面到底装了什么,以及确认它有没有被改过。这个工具把两件事都放在本地浏览器里完成,令牌不必交给任何第三方服务。
- 三段拆解:Header、Payload、Signature 分别显示解码后的字节数与字符数,结构一眼看清
- UTF-8 正确还原:中文姓名、带重音的字符按字节解码后还原,不会出现乱码
- 声明逐条解释:注册声明、OIDC 常用声明与头部参数都给出含义,自定义字段标注为业务约定
- 有效期换算:exp、nbf、iat、auth_time 同时显示本地时间、UTC ISO 与倒计时,并随秒刷新
- 本地验签:支持 HS256/384/512、RS256/384/512、PS256/384/512、ES256/384/512,密钥与公钥通过 WebCrypto 在本机运算
- 公钥格式宽容:PEM 公钥与单个 JWK 都能导入,证书与错误格式会说明原因而不是直接失败
- 异常输入容错:自动去掉
Bearer前缀、首尾引号、换行与结尾逗号;两段令牌、空签名、alg:none、载荷不是 JSON、5 段 JWE 都有对应的明确提示 - 敏感字段提醒:载荷里出现密码、手机号、证件号等键名时提示改用 ID 到服务端查询
- 示例令牌:有效、已过期、可验签的 RS256、alg=none、非 JSON 载荷五种一键载入
使用场景
- 接口返回 401 时先确认令牌是否已经过期或受众填错
- 前端登录后检查 id_token 里的角色、权限范围是否按预期签发
- 对接第三方登录时核对 iss、aud、kid 与 JWKS 公钥是否匹配
- 安全自查:
alg:none或不校验签名的服务端配置风险 - 教学演示:解释为什么 JWT 只防篡改而不防偷看
常见声明速查
| 声明 | 位置 | 必须校验吗 |
|---|---|---|
| alg | Header | 要。服务端应固定接受白名单,而不是按令牌自报的算法验签,这正是算法混淆攻击的入口 |
| kid | Header | 用它选密钥,但要确认密钥来源是自己的 JWKS,而不是 jku 里给的地址 |
| exp / nbf | Payload | 要,并留 30–60 秒时钟偏移容忍 |
| iss | Payload | 要精确比对,多环境共用密钥时最容易漏 |
| aud | Payload | 要。不校验受众会让给 A 服务的令牌直接访问 B 服务 |
| jti | Payload | 需要吊销或防重放时才有意义,纯靠有效期做失效通常不够 |
常见问题
- 解码成功说明令牌有效吗?不说明。解码只是 Base64URL 还原,任何人不需要密钥都能做。有效性必须由服务端验证签名并检查有效期、签发者与受众
- 为什么载荷能被明文看到?JWT 只签名不加密。要放敏感内容请改用 JWE(本工具识别到 5 段结构时会说明需要私钥解密),或者只在载荷里放 ID
- alg=none 是漏洞吗?标准里没有合法的 none 验签流程。风险在于老库会「按令牌声明的算法」验签,于是攻击者把签名去掉并改 alg 就能伪造身份
- HS256 和 RS256 该用哪个?单个服务自己签发自己验证时 HMAC 更省事;需要把公钥分发给多个验证方(微服务、开放平台)时用 RS256/ES256,避免共享密钥外泄
- 验签提示需要安全上下文?WebCrypto 只在 https 或 localhost 下可用,通过普通 http 的局域网地址访问时只能解码,不能验签
- 为什么 exp 显示时间和文档里差 8 小时?令牌里的时间戳是 UTC 秒数,本工具按你本机时区换算,中国时区会显示为 UTC+8
想单独还原某一段 Base64URL 内容请用 Base64 编解码;把 exp 之类的秒数换算成可读日期可用 时间戳转换;解码后的 JSON 需要进一步整理与查重复请使用 JSON 格式化。令牌与密钥全部留在本机浏览器处理,不会上传,也不会写入日志。