欢迎光临
我们一直在努力

JWT vs Session

文章目录

  • JWT 和 Session
    • 一、核心原理
      • 1. Session
      • 2. JWT
    • 二、关键区别对比
    • 三、结合你之前学的 RESTful
    • 四、通俗比喻
  • JWT
    • 先把核心逻辑拆成3步(全程不查库、不存状态)
      • 1. 登录时:服务器用**同一个秘钥**签发 JWT
      • 2. 后续请求:客户端请求头带上 JWT
      • 3. 服务器接收请求:只做「验签+解析」,不查库、不存会话
    • 回答疑问:
      • 1. 是不是服务器一把钥匙,所有用户共用?
      • 2. 那怎么区分不同用户?
    • 为什么不用查库、不用存状态?
    • 补充一个关键点(避坑)
    • 极简一句话总结
  • 正规开发就是直接弃用 Session
    • 为什么用了 JWT 就不需要 Session?
    • 什么时候会两个一起用?
    • 直白对比选型
    • 一句话记住

JWT 和 Session

Session:状态存在服务器 JWT:状态存在客户端

一、核心原理

1. Session

  • 登录成功,服务器生成唯一 SessionID
  • 服务器存一份会话数据(存在内存/Redis/数据库)
  • 把 SessionID 发给浏览器,存在 Cookie 里
  • 后续请求带 SessionID,服务器根据ID查自己存的会话
  • 👉 有状态:服务端要保存用户登录状态

    2. JWT

  • 登录成功,服务器生成一个加密字符串(JWT令牌)
  • 服务器不存任何会话数据
  • 把 JWT 发给客户端(存在本地存储/Cookie)
  • 后续请求头里带上 JWT,服务器只解析校验签名,不用查库、不用存状态
  • 👉 无状态:服务端不存用户信息,信息都藏在JWT里

    二、关键区别对比

    维度SessionJWT
    状态存储 存服务端 存客户端
    是否无状态 有状态 天生无状态,契合RESTful
    服务器压力 集群要共享Session,麻烦 不用存,天生适合分布式、微服务
    过期注销 服务端可控,随时销毁 令牌没过期就一直能用,无法主动作废
    占用带宽 每次只传SessionID(很小) JWT字符串较长,每次请求都带
    跨域/移动端 依赖Cookie,跨域麻烦 放Header,天生适合APP、小程序、前后端分离

    三、结合你之前学的 RESTful

    • RESTful 要求无状态,所以优先用 JWT
    • Session 是传统 JavaWeb 有状态方案,不符合 REST 无状态规范

    四、通俗比喻

    • Session:去网吧办会员卡,网吧后台记着你的身份,你只带卡号就行
    • JWT:拿一张加密的身份通行证,纸上面写好你是谁、权限多少,店家不用记你,只验真伪

    JWT

    服务器手里有一把「万能密钥/密码」,所有用户都用这同一把密钥加解密、验签名;只是每个用户生成的JWT令牌内容不一样。

    先把核心逻辑拆成3步(全程不查库、不存状态)

    1. 登录时:服务器用同一个秘钥签发 JWT

    流程:

  • 用户输入账号密码登录,服务器校验账号密码正确
  • 服务器用自己保管的固定秘钥(Secret)
  • 把用户信息(id、账号、角色、过期时间)打包,加密签名,生成一串字符串 = JWT
  • 把这串 JWT 发给客户端存起来
  • 👉 关键点: 所有用户的JWT,都是用服务器「同一个秘钥」签出来的

    2. 后续请求:客户端请求头带上 JWT

    前端每次接口请求,在请求头里放:

    Authorization: Bearer 这一大串JWT字符串

    3. 服务器接收请求:只做「验签+解析」,不查库、不存会话

    服务器拿到JWT后做两件事:

  • 用自己手里那把固定秘钥,校验签名
    • 校验通过:说明这串JWT没被篡改、不是伪造的
    • 校验失败:直接拦截,401未授权
  • 解析JWT里自带的用户信息 JWT 本身里面就藏好了:用户ID、用户名、角色、过期时间 解析完直接能用,不用去Redis、数据库查用户会话,也不用在服务器存任何用户状态
  • 回答疑问:

    1. 是不是服务器一把钥匙,所有用户共用?

    是的 HS256 这种常用方式:

    • 服务端配置一个固定 secretKey(比如:abc123456)
    • 所有人的JWT都是用这一个密码签的
    • 验签也只用这同一个密码

    2. 那怎么区分不同用户?

    钥匙是同一把,但「令牌里装的个人信息不一样」 好比:

    • 学校统一用**同一个公章(秘钥)**开证明
    • 每个人的证明纸张(JWT)内容不一样:姓名、班级、权限都写在上面
    • 门卫只看:公章真不真(验签),不用去教务处查你是谁,看证明纸上内容就知道你是谁、能进哪栋楼

    为什么不用查库、不用存状态?

    因为用户身份、权限、过期时间,全部自己打包存在JWT令牌里了

    • Session:服务器存用户数据,客户端只带一个 SessionID,必须查表
    • JWT:用户数据自带在令牌里,服务器只要验真伪,拆开就能用

    补充一个关键点(避坑)

  • JWT payload 是Base64编码,不是加密 任何人都能解码看到里面的内容,不能放密码、敏感隐私数据
  • 安全靠的是签名: 别人随便改JWT里的角色、权限,没有服务器的秘钥,重新签不了名,服务器一验就失败。
  • 极简一句话总结

    服务器有唯一固定秘钥,给所有用户发通行证(JWT); 每次请求服务器只用这把秘钥验真伪、拆信息,不用存用户、不用查库,完美契合 RESTful 无状态。

    正规开发就是直接弃用 Session

    结论:做前后端分离、微服务、RESTful 接口,用 JWT 就完全不用 Session 了 而且正规开发就是直接弃用 Session。

    为什么用了 JWT 就不需要 Session?

  • Session 是有状态 服务端要存会话、存 SessionID,集群还要做 Session 共享,麻烦、不适合分布式。

  • JWT 是无状态 用户信息、权限全塞在令牌里,服务端不用存、不用查表,完全符合 RESTful 无状态规范。

  • 适用场景天然分开

    • 传统 JSP/网页老项目:用 Session + Cookie
    • 现在主流:前后端分离、Vue/React、APP、小程序、微服务:统一 只用 JWT,抛弃 Session

    什么时候会两个一起用?

    几乎没有正规项目这么干,纯属多此一举、画蛇添足。

    • 没必要既在服务端存 Session,又在客户端带 JWT
    • 占带宽、增加复杂度、还破坏无状态设计

    直白对比选型

    场景选哪个
    前后端分离、APP、小程序、微服务、REST接口 只用 JWT
    老式 JSP 项目、不分离的传统网页 用 Session

    一句话记住

    新项目、接口开发、RESTful 风格:JWT 干掉 Session,彻底不用。 只有老旧遗留项目才继续用 Session。

    顺带帮你串起来: HTTP无状态 → RESTful要求无状态 → 所以不用有状态的Session → 改用无状态的JWT。

    赞(0)
    未经允许不得转载:171主机测评 » JWT vs Session
    分享到: 更多 (0)

    评论 抢沙发

    • 昵称 (必填)
    • 邮箱 (必填)
    • 网址