1. JWT 是什么
JWT(JSON Web Token)是一种 轻量级的认证与授权机制,常用于前后端分离系统中用户身份的安全传递。它通过数字签名保证 Token 的完整性和不可篡改性。
2. JWT 的结构
JWT 由三部分组成,用 .
分隔:
Header.Payload.Signature
-
Header(头部)
-
说明使用的算法与 Token 类型
-
例如:
{"alg": "HS256", "typ": "JWT"}
-
-
Payload(负载)
-
携带用户相关数据(claims,声明)
-
常见字段:
-
iss
:签发者 -
sub
:用户标识 -
exp
:过期时间(Unix 时间戳) -
iat
:签发时间
-
-
⚠️ 注意:Payload 是 明文可解码的,所以不要存放敏感信息。
-
-
Signature(签名)
-
防止数据被篡改
-
计算公式:
HMACSHA256( base64UrlEncode(header) + "." + base64UrlEncode(payload), secretKey )
-
3. JWT 的签发流程
-
用户登录(提交账号密码)
-
服务端验证成功后,根据用户信息生成
Header
+Payload
-
使用服务端的密钥对前两部分签名,生成
Signature
-
拼接成最终的
JWT
返回给客户端 -
客户端存储(一般放在 LocalStorage 或 HTTP Header 中)
4. JWT 的验证流程
-
客户端携带
JWT
(一般放在请求头Authorization: Bearer <token>
) -
服务端接收 Token 后拆分成三部分:
Header
、Payload
、Signature
-
服务端使用相同的算法和
secretKey
对前两部分重新计算Signature
-
对比客户端传来的
Signature
和服务端重新计算的签名:-
一致 → 说明 Token 未被篡改
-
不一致 → 拒绝请求(Token 可能被伪造)
-
-
校验
Payload
中的时间字段(如exp
是否过期)
5. 如何检测 Token 是否有效
-
签名验证:服务端重新计算 Signature 并对比
-
过期检测:检查 Payload 中的
exp
-
黑名单机制(可选):
-
某些场景下(如用户主动注销、修改密码),即使 Token 未过期也需要立即失效
-
可以将失效 Token 存入 Redis 黑名单,校验时查询
-
6. 常见问题与注意事项
-
明文问题:Payload 可以解码 → 不要放敏感信息
-
时效性:尽量设置合理的过期时间
exp
-
刷新机制:
-
短期 Token + Refresh Token 机制
-
避免长期有效 Token 被盗用
-
-
存储方式:
-
推荐存储在
HTTP Only Cookie
(防止 XSS 攻击) -
或 LocalStorage(需要额外防御 XSS)
-
7. 面试答法(简洁版)
👉 面试官问「JWT 是如何验证 Token 是否有效的?」可以这样答:
JWT 由三部分组成:Header、Payload、Signature。服务端不会存储 Token,而是通过 签名校验来验证。
当客户端请求时,服务端会拿到 Token,重新用密钥对 Header+Payload 计算签名,然后和 Token 中的 Signature 对比,如果一致说明没有被篡改;再检查 Payload 里的过期时间exp
等字段,确认 Token 是否还有效。如果需要即时失效,可以用 Redis 黑名单机制。