JWT 解析(只解码,不验签)
粘贴 JWT 令牌,本地解析出头部 header 与载荷 payload,逐项列出 alg、typ、kid、iss、sub、aud、jti 等字段,并把 iat(签发时间)、nbf(生效时间)、exp(过期时间)换算成本地时间,同时标出「未过期 / 已过期 / 尚未生效」。只做 base64url 解码与 JSON 解析,不验证签名,也不会把令牌发送到任何服务器。
调试登录接口时经常需要看令牌里到底装了什么:用户 ID、签发方、过期时间对不对。JWT 的 header 与 payload 只是 base64url 编码,不是加密,所以本地拆开就能读。本工具把两段解成 JSON,逐项列出字段,并把 iat / nbf / exp 三个时间戳换算成本地时间,直接标出是否过期。
边界要记牢:只解码不验签。看到内容不代表令牌可信——签名段没验证,内容可以被任何人伪造。因此它适合开发调试与排查 401,不要把生产环境的真实令牌粘进来,也不要把解码结果当成鉴权依据。
这个工具解决你的问题了吗?
提交后会把工具名、你的输入与当前结果发送到服务器;请勿填写身份证号、手机号等隐私信息。
AI 助手 会结合你当前的输入与结果回答
追问会再次把当前输入与结果发送到服务器;请勿填写隐私信息。
使用步骤
- 把完整的 JWT(三段,用点号连接)粘进输入框。
- 看 header 确认算法(alg)与类型,看 payload 确认业务字段。
- 重点看 exp / nbf / iat 的本地时间换算与未过期、已过期标注。
- 排查 401 时先对时钟:本机时间与服务器差超过一个时间片就会误判过期。
计算原理与示例
JWT 的三段结构
JWT 由三段用点号连接:第一段是头部 header(声明签名算法 alg 与类型 typ),第二段是载荷 payload(业务声明),第三段是签名。三段都按 base64url 编码,因此可以直接本地解出 JSON,无需密钥。
为什么不验证签名
验证签名需要对应的密钥或公钥:HMAC 要密钥、RSA 与 ECDSA 要公钥验签,而这些都不应该交到网页上;本工具也不联网取公钥。所以这里只保证「结构合法、能解码」,不证明令牌没被篡改——看到结果请把它当「内容速览」,而不是「安全结论」。
exp / nbf / iat 怎么读
iat 是签发时间、nbf 是「在此之前不生效」的起始时间、exp 是过期时间,三者都是 Unix epoch 秒。本工具按本地时区展示,括号内保留原始秒数,便于和服务端日志对齐。
签名段与 alg=none
签名段只展示长度,不做任何校验。alg=none 表示不签名,第三段为空;这类令牌可被任意伪造,只应出现在完全可信的内部调试场景,正式服务端必须拒绝。
解析口径:JWT 为三段式 base64url 编码(RFC 7519),空签名段对应 alg=none;exp / iat / nbf 为 Unix epoch 秒,按本地时区展示,不校验时钟偏移,也不验证签名。
代码示例
JavaScript Node 里解码 JWT
// Node 15+ 直接支持 base64url 编码
const [h, p] = token.split(".");
const header = JSON.parse(Buffer.from(h, "base64url"));
const payload = JSON.parse(Buffer.from(p, "base64url"));
// 换算过期时间
console.log(new Date(payload.exp * 1000));
// 提示:这只解码不验签;服务端校验要用 jsonwebtoken 库的 jwt.verify()
Shell 命令行拆开 payload
# payload 是第二段;base64url 不带 = 号,解码前要补齐
PAY=$(echo "$TOKEN" | cut -d. -f2)
case $((${#PAY} % 4)) in 2) PAY="${PAY}==";; 3) PAY="${PAY}=";; esac
echo "$PAY" | tr "_-" "/+" | base64 -d | jq .
常见问题
解析 JWT 会上传令牌吗?
不会。解码与时间换算全部在浏览器本地完成,令牌不上传、不写入 localStorage,本工具也刻意没有「计算历史」区块。不过仍然建议:不要在生产环境把真实令牌粘到任何在线工具里,本地工具也一样。
为什么不验证签名?
验签需要密钥或公钥:HMAC 要对密钥、RSA 与 ECDSA 要对公钥,把它们放到网页上等于公开泄露;本工具也不联网取公钥。因此只保证能解码和结构合法,不能证明令牌未被篡改。
显示「已过期」还能用吗?
exp 只是令牌自己声明的过期时间。服务端若正确校验,过了 exp 就会拒绝;但若服务端不校验或存在时钟偏差,仍可能被接受。看到「已过期」应按失效处理。
iat、nbf、exp 有什么区别?
iat 是签发时间,nbf 是生效起始时间,exp 是过期时间。三者都是 epoch 秒;本工具按本地时区显示,并在括号里给出原始秒数,方便和服务端日志比对。
为什么有的令牌签名段是空的?
alg=none 表示不签名,令牌第三段为空。这类令牌任何人都能伪造,只应出现在完全可信的内部调试场景;正式环境的服务端必须显式拒绝 alg=none。
头部里的 alg 能直接相信吗?
不能。alg 由令牌自称,攻击者可以改成 none 或换成其它算法来绕过校验(算法混淆攻击)。服务端应按自己配置的算法验签,而不是跟随令牌里的 alg。
payload 里为什么没有我要的用户信息?
payload 的字段由签发方决定。JWT 标准只规定了 iss、sub、aud、exp、nbf、iat、jti 七个登记声明,业务字段如 name、role 属自定义声明;本工具会把解码出来的所有字段一并原样列出。
支持 JWE(加密令牌)吗?
不支持。JWE 是五段式(头部.加密密钥.初始向量.密文.认证标签),内容本身是密文;本工具只处理三段式 JWS。粘贴五段式会提示格式错误。
延伸阅读
来自本站原创文章,讲清这个工具背后的算法与口径。