JWT 解码完全指南:看懂 Header、Payload 与 Signature 三段结构
用一个真实 token 拆开 JWT 的三段结构,讲清 Base64URL 解码读 claims、解码不等于验签、exp 与 iat 的读法,以及本地解析不上传 token 为什么更安全。
JWT 解码完全指南:看懂 Header、Payload 与 Signature 三段结构
每次接口返回 401,我第一反应不再是翻代码,而是把那个长长的 token 粘进解码器看一眼。十有八九,问题就在 token 本身:要么过期了,要么签发时权限给错了。这篇文章把 JWT 的结构、读法和一个老生常谈但很多人踩坑的安全点讲清楚,用一个能真解出来的例子带你走一遍。
JWT 是哪三段
一个标准的 JSON Web Token(JWS 形式)由三段用点分隔的字符串组成,形如 header.payload.signature。RFC 7519 第 3 节明确写道,JWT 的紧凑序列化结果就是这三段经 Base64URL 编码后用 . 连接而成。三段各管一摊:
- Header:声明 token 的类型和签名算法。
- Payload:装载声明(claims),也就是这个 token 真正想表达的信息。
- Signature:用算法和密钥对前两段算出来的签名,用来证明 token 没被改过。
要注意,这里是 Base64URL 而不是普通 Base64。区别在于它把 + 换成 -、/ 换成 _,并且去掉了结尾的 = 填充,这样整段才能安全地放进 URL 里。
拿一个真 token 解开看看
下面这个 token 是可以真解的:
eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkxpIExlaSIsImlhdCI6MTcxNjIwMDAwMCwiZXhwIjoxNzE2MjAzNjAwfQ.signature
把它粘进 JWT 解码器,第一段 Base64URL 解出来是 header:
{ "alg": "HS256", "typ": "JWT" }
第二段是 payload:
{
"sub": "1234567890",
"name": "Li Lei",
"iat": 1716200000,
"exp": 1716203600
}
读到这里你已经知道:这是个用 HS256 签的 token,主体 sub 是 1234567890,签发时间 iat 是 1716200000,一小时后过期。整个过程就是对前两段做 Base64URL 解码再 JSON.parse,没有任何魔法。
exp 和 iat 怎么读才不出错
claims 里跟时间相关的几个字段最容易读错。iat(issued at)是签发时刻,exp(expires at)是过期时刻,nbf(not before)表示此刻之前 token 无效。三者都是 Unix 时间戳,单位是秒,不是毫秒。
上面例子里 exp 是 1716203600,换算过来是 2024 年 5 月,而不是 1970 年。我见过不止一次有人把它当毫秒喂进 new Date(),结果时间跑到了几万年前,然后开始怀疑人生。只有当你要交给 JavaScript 的 Date(ms) 构造器时,才需要乘以 1000。
排查 401 时,这一步特别省事:读出 exp,跟当前时间比一下。如果它就在几分钟前,那就是单纯过期,客户端刷新一下 token 即可,根本不是权限 bug。
解码不等于验签,这是底线
这是最关键、也最容易被误解的一点:能把 token 解开,不代表这个 token 是真的。
解码只是读字段。一个被篡改过 payload 的 token,照样能干干净净地解出来,显示一份看起来很正常的声明。真正决定 token 可不可信的是第三段 signature,而要核对签名,你需要签发方的密钥或公钥,用 HS256 这类对称算法时是共享密钥,用 RS256 时是公钥。
这件事必须放在服务端做,用成熟的库,比如 Node 的 jose、Python 的 pyjwt。把生产环境的密钥粘到任何网页里都是大忌。所以记住这条规则:解码是为了「看懂」,验签是为了「相信」,两者不能混为一谈。
为什么本地解析不上传 token 很重要
token 本质上是一张凭证,等同于一段时间内的登录态。它一旦泄露,拿到的人就能冒充你访问接口,直到它过期或被轮换。
所以一个负责任的 JWT 解码器应该全程在浏览器本地完成解析,token 不发往任何服务器。同样的道理,它也不该把 token 同步进 URL 的查询参数,否则你复制链接、加书签、甚至浏览器历史,都可能把凭证悄悄带出去。
我自己的习惯是:测试用的假 token 怎么解都行,但凡是生产环境真在用的 token,我一律在本机的可信工具里解,解完如果有过暴露的疑虑,顺手把对应密钥轮换掉。多花十秒,省掉一次可能的事故。
如果你还想顺手生成对照 token 做实验,可以用 JWT 编码器 自己签一个,再粘回解码器里看结构,正反走一遍,对三段的理解会牢固很多。
Made by Toolora · Updated 2026-06-13