JWT 解析:解开三段不等于验证通过
解析 JWT 只需要 base64url 解码,不需要任何密钥——因为 Header 与 Payload 本来就是明文,只是编了个码。所以「解析成功」证明不了任何事,它只说明这段字符串格式正确。
三段分别是什么
header.payload.signature
- Header:JSON,通常含
alg(签名算法)与typ(类型,一般是 JWT)。 - Payload:JSON,放声明(claims),如
sub、exp、iat与业务字段。 - Signature:对前两段的签名,用密钥算出,不是 JSON 也不是可读文本。
前两段用 Base64URL 编码(+ / 换成 - _,去掉填充 =),所以能直接解成 JSON。
为什么解析不需要密钥
因为 Payload 从来没被加密过。JWT(更准确说是 JWS)提供的是完整性而不是机密性:签名保证「内容没被改」,但不保证「内容别人看不到」。
把 Token 贴进任何解析工具、甚至手动 base64url 解码,都能读到里面的用户 ID、角色、过期时间。所以不要把敏感信息放进 Payload——手机号、身份证、内部密钥都不该出现在这里。
需要机密性时要用 JWE(加密的 JWT),那是另一套格式,五段而不是三段。
解析成功说明什么、不说明什么
说明:这三段符合 JWT 的格式,Header 与 Payload 是合法 JSON,能解出来。
不说明:签名有效、签发方可信、没有过期、没有被篡改。任何人都能改 Payload 后重新编码,前两段照样能解析成功——只是签名对不上。
这个工具把解析、生成、验证拆成三件事,解析结果旁会明确提示「尚未验证签名」。这个提示不是多余的话,它区分了「看到一个 Token」和「信任一个 Token」。
Payload 里的标准声明
iss:签发者。验证时要与你期望的签发方一致。sub:主体,通常是用户 ID。aud:受众,只能被指定的接收方接受。exp:过期时间(Unix 秒)。nbf:生效时间,早于它不能用。iat:签发时间。jti:唯一 ID,用于防重放。
时间是 Unix 秒(10 位),不是毫秒。看到 13 位的时间戳基本可以判定签发方把毫秒塞进来了,这类 Token 的 exp 检查会永远通过(因为数值大得离谱)。
上面这些都不用装软件,也不用注册:打开页面就能用。
打开 JWT 在线解析与签名验证生成 →常见问题
JWT 是加密的吗?
不是。普通 JWT(JWS)只是编码加签名,Payload 是明文,谁都能读。需要加密请用 JWE。
为什么我的 Token 解析失败?
常见原因:被截断(复制少了字符)、多了 Bearer 前缀、段数不是 3、某段不是合法 base64url。先确认拿到的是完整的三段字符串。
能解析过期的 Token 吗?
能。解析不检查时间,过期只是语义上的失效,格式依然合法。要看是否过期请用「验证签名」并检查 exp,或直接看 Payload 里的 exp 与当前时间。