在当下的现代 Web 开发与微服务架构中,JWT(JSON Web Token)已经成为了用户无状态身份认证(Stateless Authentication)的标准技术规范。每当我们在 HTTP 请求头中携带 Authorization: Bearer eyJhbGci... 时,服务器便能直接识别出当前用户的身份与权限。
本文将为你全面拆解 JWT 的底层结构、标准声明字段含义,并说明为什么可以在没有密钥的情况下查看其内容。
1. 什么是 JWT?为什么它是“无状态”的?
传统的 Session 认证模式中,服务器必须在 Redis 或内存中保存每位用户的 SessionID 与用户信息;而 JWT 采用自包含(Self-Contained)设计——Token 自身就已经明文包含了当前用户的 ID、角色权限以及过期时间戳。
服务器只需使用私钥验证签名是否有效,无需查询任何数据库,即可直接放行请求,因此具有极高的可扩展性。
2. JWT 三段式核心结构深入拆解
仔细观察任何一段标准的 JWT 字符串,你会发现它由两个英文圆点 . 分割成了三大部分:
Header(头部).Payload(负载).Signature(防篡改签名)
① 第一段:Header(标头)
通常是一个 JSON 对象,包含所采用的签名算法(如 HMAC SHA256 或 RSA)以及令牌类型(通常为 "JWT")。经由 Base64Url 编码后形成第一段。
② 第二段:Payload(有效载荷 / Claims)
用于存放实际的业务实体数据与系统签发参数。例如用户的唯一 ID、用户组以及权限列表等。这也是我们在解析 Token 时最关注的内容。
③ 第三段:Signature(数字签名)
服务器利用第一段的 Header、第二段的 Payload 以及服务端私密保管的Secret 密钥,通过指定的哈希算法计算出的签名摘要。任何中间人如果擅自修改了 Payload 里的用户 ID,由于他不知道服务端的 Secret 密钥,服务器验签时都会立即失败并拒绝请求。
3. Payload 常用标准声明字段含义速查表
| 字段名(Claim) | 全拼 | 字段含义与作用 |
|---|---|---|
exp |
Expiration Time | Token 过期时间戳(秒),超过此时间后接口将返回 401 认证失败 |
iat |
Issued At | Token 签发时间戳,用于记录用户何时登录 |
nbf |
Not Before | 生效时间,在此时间戳之前该 Token 不可用 |
sub |
Subject | 所面向的主题,通常填写用户的唯一 ID |
iss |
Issuer | 签发者标识,如 yichuli-auth-service |
4. 为什么没有私钥也能解码 JWT?安全警示!
很多刚接触 JWT 的开发者容易产生一个严重误解:“只要生成了 JWT,别人就看不到里面的内容”。
重点安全须知:JWT 的 Header 和 Payload 仅仅是通过 Base64Url 算法进行了格式映射,根本没有做任何对称或非对称加密!任何人拿到你的 Token,都能直接把第二段还原为明文 JSON。因此:
切勿在 JWT 的 Payload 中存放用户登录密码、银行卡号或敏感商业机密!
5. 如何使用在线工具安全解析并核验过期时间?
排查登录态异常时,打开易处理 JWT 在线解析工具,粘贴 Token 后:
- 工具会在本地浏览器纯前端环境中完成解码,不会向任何远程服务器发送你的敏感 Token;
- 自动将
exp与iat时间戳实时转换为可读的北京时间,并高亮标明“距离过期还有多长时间”或“已过期多久”; - 格式化展示完整的 Payload 权限载荷,方便前后端快速定位联调问题。