JWT简单介绍
一句话:JWT 就是一张带防伪签名的“电子通行证”。
用户登录成功后,服务器发给他一张 JWT;之后用户每次请求都带着这张通行证,服务器只要验一下签名和有效期,就知道“你是谁、能不能进”,不用再查 session。
一、生活比喻:游乐园手环
你去游乐园买票,工作人员给你戴一个手环。手环上写着:
- 你是谁:张三
- 你能玩什么:过山车、鬼屋
- 有效期:今天 18:00 前
- 防伪标记:工作人员的特殊印章
之后你玩每个项目,入口只看手环:
印章是真的 + 没过期 + 项目允许,就放你进去。
门口不需要再打电话问售票处“张三买票了吗”。
JWT 就是这个手环。
服务器就是游乐园,JWT 就是手环,签名就是防伪印章。
二、JWT 长什么样?
JWT 是一个很长的字符串,由三部分组成,用两个点 . 分开:
xxxxx.yyyyy.zzzzz
分别是:
- Header:头,说明用什么算法签名
- Payload:载荷,装用户信息和过期时间
- Signature:签名,防篡改
例如:
eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.
eyJzdWIiOiIxMjMiLCJuYW1lIjoi5byg5LiJIiwiaWF0IjoxNTE2MjM5MDIyfQ.
SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c
看起来像乱码,其实前两段只是 Base64 编码,不是加密,谁都能解码看内容。
三、三部分分别是什么?
1. Header
一般长这样:
{
"alg": "HS256",
"typ": "JWT"
}
alg:签名算法,比如 HS256、RS256typ:类型,就是 JWT
它会被 Base64Url 编码成第一段。
2. Payload
装真正想传的信息,叫 claims。比如:
{
"sub": "123",
"name": "张三",
"role": "admin",
"exp": 1710000000
}
常见字段:
sub:用户 IDname:用户名role:角色exp:过期时间iat:签发时间jti:唯一编号
它会被 Base64Url 编码成第二段。
注意:Payload 只是编码,不是加密。
任何人拿到 JWT,都能解开看到里面的内容。所以绝对不能放密码、身份证号、银行卡号等敏感信息。
3. Signature
签名用来防篡改。服务器用密钥对前两段做签名:
HMACSHA256(
base64UrlEncode(header) + "." + base64UrlEncode(payload),
secret
)
生成第三段。
别人改了 Payload 里的 role: user 改成 role: admin,签名就对不上,服务器立刻发现。
四、JWT 怎么用?登录流程
- 用户输入账号密码,请求登录。
- 服务器验证通过,生成 JWT,返回给客户端。
- 客户端保存 JWT,比如 localStorage 或 Cookie。
- 之后每次请求,在请求头带上:
Authorization: Bearer <jwt>
- 服务器收到后:
- 验签名:是不是我发的?
- 验过期时间:
exp过了没? - 验权限:这个角色能不能访问?
- 都通过,就放行。
服务器不需要存 session,所以叫“无状态”。
五、JWT 的优点
- 无状态:服务器不用存 session,适合分布式、微服务。
- 自包含:用户信息都在 token 里,不用反复查库。
- 跨域友好:前后端分离、移动端、多语言系统都能用。
- 可扩展:想加字段就加进 Payload。
- 防篡改:签名保证内容没被改过。
六、JWT 的缺点和坑
-
不能主动失效
传统 session 可以删掉,用户立刻下线。
JWT 签发后,在过期前一直有效。除非做黑名单,但黑名单又变成有状态了。 -
Payload 可读
不要放敏感信息,因为 Base64 不是加密。 -
Token 被盗用
别人偷到 JWT,就能冒充你。所以:- 必须用 HTTPS
- 设置较短过期时间
- 配合刷新令牌 refresh token
-
续期麻烦
过期后一般用 refresh token 换新的 access token。 -
体积较大
比普通 sessionId 长很多,每次请求都带,增加带宽。
七、JWT 和 Session 的区别
| 维度 | Session | JWT |
|---|---|---|
| 状态 | 服务器存 session | 服务器不存,token 自包含 |
| 扩展性 | 分布式要共享 session | 天然适合分布式 |
| 主动失效 | 容易,删 session 即可 | 难,需黑名单 |
| 跨域 | 较麻烦 | 方便 |
| 安全 | sessionId 随机,不含信息 | payload 可读,不能放敏感数据 |
| 存储 | 服务器内存/Redis | 客户端 |
八、总结
JWT 就是一张带签名的电子通行证:
- 三段:Header、Payload、Signature
- 前两段 Base64 编码,能看不能改
- 第三段签名,防止篡改
- 登录后发给客户端,后续请求带着它
- 服务器验签名和过期时间,就知道你是谁
- 优点是无状态、跨域、适合分布式
- 缺点是难主动失效、Payload 不保密、被盗用有风险
记住一句话:
JWT 不是加密,而是签名;不是让你藏信息,而是让你证明“这信息是我发的,没被改过”。
question: 我可不可以这样理解:采用jwt这种方式,用户登陆成功,生成jwt,假设过期时间设置为30分钟,即使在30分钟之内,我点击了退出,也没有办法退出系统,必须要等到jwt主动失效才行。
- 用户本人点击退出,通常是可以退出的:客户端把 JWT 删掉,后续请求不再带这个 token,服务端自然认为你没登录。
- 服务端默认无法“吊销”这个 JWT:如果 token 已经被复制或盗走,攻击者拿着它,在 30 分钟内照样能访问。服务端只验签名和过期时间,不知道你已经点了退出。
所以准确说法是:
JWT 默认做不到“服务端主动作废”。退出登录依赖客户端删除 token;已泄露的 token 在过期前仍然有效。不是必须等到过期才能退出,而是必须等到过期,才能让所有副本自动失效。
浙公网安备 33010602011771号