JWT 详解:结构、原理与常见误区
WebTool 团队 · 发布于 2026-08-28 · JWT / 认证 / 安全
JWT(JSON Web Token)是一种自包含的令牌格式:三段 Base64Url 文本用点号连接,任何人都能解码,但只有持钥者能伪造。 本文拆解其结构并澄清高频误区。拿到一个 JWT 可以用本站解码工具边看边学。
三段结构
eyJhbGci... . eyJzdWI... . dBjftJeZ...
Header Payload Signature
- Header:算法与类型,如
{"alg":"HS256","typ":"JWT"}。 - Payload:声明(claims)。标准声明见下表,其余为自定义业务字段。
- Signature:对前两段的签名,
HMACSHA256(base64(header) + "." + base64(payload), secret)。
标准声明
| 声明 | 含义 | 示例 |
|---|---|---|
| iss | 签发者 | "https://auth.example.com" |
| sub | 主题(通常是用户 ID) | "1234567890" |
| aud | 受众 | "web" |
| exp | 过期时间(Unix 秒) | 1900000000 |
| nbf | 生效时间 | 1700000000 |
| iat | 签发时间 | 1700000000 |
| jti | 令牌唯一 ID(防重放) | "abc123" |
三个最常见的误区
误区一:解码 = 验证。 Base64Url 只是编码,任何人都能解开 Payload 看到内容——所以 JWT 里不要放密码等敏感信息。验证签名的合法性必须持有密钥。
误区二:JWT 能主动吊销。 无状态意味着服务端默认不存令牌,签发后在 exp 之前一直有效。需要吊销时要引入黑名单/短时效+刷新令牌等机制。
误区三:alg none 无所谓。 2015 年著名的 alg=none 攻击:把算法改为 none 并去掉签名,校验不严的库会直接放行。服务端必须白名单指定算法,禁止从 token 里读算法。
排查"登录态莫名失效"的清单
- 解码看
exp是否已过(工具会自动换算成本地时间); - 看
iat判断是不是签发了新 token 但前端还在用旧的; - 确认服务端时钟没有漂移(exp/nbf 都依赖时钟)。
最后更新:2026-08-28