~码铃薯~

  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

JWT简单介绍

一句话:JWT 就是一张带防伪签名的“电子通行证”。
用户登录成功后,服务器发给他一张 JWT;之后用户每次请求都带着这张通行证,服务器只要验一下签名和有效期,就知道“你是谁、能不能进”,不用再查 session。


一、生活比喻:游乐园手环

你去游乐园买票,工作人员给你戴一个手环。手环上写着:

  • 你是谁:张三
  • 你能玩什么:过山车、鬼屋
  • 有效期:今天 18:00 前
  • 防伪标记:工作人员的特殊印章

之后你玩每个项目,入口只看手环:
印章是真的 + 没过期 + 项目允许,就放你进去。
门口不需要再打电话问售票处“张三买票了吗”。

JWT 就是这个手环。
服务器就是游乐园,JWT 就是手环,签名就是防伪印章。


二、JWT 长什么样?

JWT 是一个很长的字符串,由三部分组成,用两个点 . 分开:

xxxxx.yyyyy.zzzzz

分别是:

  1. Header:头,说明用什么算法签名
  2. Payload:载荷,装用户信息和过期时间
  3. Signature:签名,防篡改

例如:

eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.
eyJzdWIiOiIxMjMiLCJuYW1lIjoi5byg5LiJIiwiaWF0IjoxNTE2MjM5MDIyfQ.
SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c

看起来像乱码,其实前两段只是 Base64 编码,不是加密,谁都能解码看内容。


三、三部分分别是什么?

1. Header

一般长这样:

{
  "alg": "HS256",
  "typ": "JWT"
}
  • alg:签名算法,比如 HS256、RS256
  • typ:类型,就是 JWT

它会被 Base64Url 编码成第一段。

2. Payload

装真正想传的信息,叫 claims。比如:

{
  "sub": "123",
  "name": "张三",
  "role": "admin",
  "exp": 1710000000
}

常见字段:

  • sub:用户 ID
  • name:用户名
  • role:角色
  • exp:过期时间
  • iat:签发时间
  • jti:唯一编号

它会被 Base64Url 编码成第二段。

注意:Payload 只是编码,不是加密。
任何人拿到 JWT,都能解开看到里面的内容。所以绝对不能放密码、身份证号、银行卡号等敏感信息

3. Signature

签名用来防篡改。服务器用密钥对前两段做签名:

HMACSHA256(
  base64UrlEncode(header) + "." + base64UrlEncode(payload),
  secret
)

生成第三段。
别人改了 Payload 里的 role: user 改成 role: admin,签名就对不上,服务器立刻发现。


四、JWT 怎么用?登录流程

  1. 用户输入账号密码,请求登录。
  2. 服务器验证通过,生成 JWT,返回给客户端。
  3. 客户端保存 JWT,比如 localStorage 或 Cookie。
  4. 之后每次请求,在请求头带上:
Authorization: Bearer <jwt>
  1. 服务器收到后:
    • 验签名:是不是我发的?
    • 验过期时间:exp 过了没?
    • 验权限:这个角色能不能访问?
  2. 都通过,就放行。

服务器不需要存 session,所以叫“无状态”。


五、JWT 的优点

  • 无状态:服务器不用存 session,适合分布式、微服务。
  • 自包含:用户信息都在 token 里,不用反复查库。
  • 跨域友好:前后端分离、移动端、多语言系统都能用。
  • 可扩展:想加字段就加进 Payload。
  • 防篡改:签名保证内容没被改过。

六、JWT 的缺点和坑

  1. 不能主动失效
    传统 session 可以删掉,用户立刻下线。
    JWT 签发后,在过期前一直有效。除非做黑名单,但黑名单又变成有状态了。

  2. Payload 可读
    不要放敏感信息,因为 Base64 不是加密。

  3. Token 被盗用
    别人偷到 JWT,就能冒充你。所以:

    • 必须用 HTTPS
    • 设置较短过期时间
    • 配合刷新令牌 refresh token
  4. 续期麻烦
    过期后一般用 refresh token 换新的 access token。

  5. 体积较大
    比普通 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主动失效才行。

  1. 用户本人点击退出,通常是可以退出的:客户端把 JWT 删掉,后续请求不再带这个 token,服务端自然认为你没登录。
  2. 服务端默认无法“吊销”这个 JWT:如果 token 已经被复制或盗走,攻击者拿着它,在 30 分钟内照样能访问。服务端只验签名和过期时间,不知道你已经点了退出。

所以准确说法是:

JWT 默认做不到“服务端主动作废”。退出登录依赖客户端删除 token;已泄露的 token 在过期前仍然有效。不是必须等到过期才能退出,而是必须等到过期,才能让所有副本自动失效。

posted on 2026-09-15 14:20  ~码铃薯~  阅读(9)  评论(0)    收藏  举报