jwt与session和cookie详解和对比以及jwt在项目中的应用(一)

一、何为jwt

jwt全称JSON Web Token,是用于前后端登录鉴权,传递用户信息的令牌格式

二、jwt的三段式结构

头部(Header).载荷(PayLoad).签名(signature)

头部一般存储加密算法和令牌类型

{
  "alg":"HS256",
  "typ":"JWT"
}

这个就是个例子,alg表示加密算法,这里用的是HS256(对称加密),常用的还有RSA(非对称加密)

载荷一般用于存放自定义业务数据,采用的是Base64编码,只是编码!!!可以被破译,所以不建议在载荷存放敏感信息

{
  "sub": 10086,
  "username": "admin",
  "source": "web",
  "exp": 1786408800
}

这里唯一需要注意的就是exp代表的过期时间显示的一定秒级的时间戳(如果有签发时间(iat)则一定要大于iat)

签名一般用于防止别人篡改header和payload的内容

计算公式:签名 = HMAC‑SHA256( 头部base64 + "." + 载荷base64, 密钥secret )

如果有人篡改了头部或是载荷内容,这个计算结果就会发生变化与原来的签名对不上,该令牌就会直接作废

三、jwt完整工作流程

1.用户提交账号密码登录

2.后端校验账号密码是否正确

3.组装Headers,payload,使用密钥生成签名,拼接成JWT令牌

4.将token返回给前端

5.前端把token存放在浏览器本地存储(localStore)或是请求头 (token:xxxxxxxx)

6.之后每一次的请求都会携带这个token

7.后端拦截器拿到这个token,将其拆分成三段,先校验签名,再根据过期时间判断是否过期,最后再取出载荷中的用户信息,放入上下文

8.鉴权通过后放行接口的请求

四、JWT的优缺点;

优点

无状态:服务器不需要存储登录会话,减轻内存压力

适配分布式、微服务,所有服务共用密钥即可解析 token

缺点(面试高频)

token 一旦签发,无法主动作废,只能等到过期时间结束

解决思路:redis 黑名单、设置较短过期时长 + 刷新 token

payload 仅 base64 编码,不能存放隐私数据

token 字符串很长,每次请求携带,增加请求体积

五、何为cookie

一段存放在客户端的键值对,可以存放任意自定义的键值对,每次访问该网站浏览器会自动带上然后发给后端

六、cookie的运行流程

1.用户访问该网站,浏览器第一次访问网站后端

2.服务器返回响应头(例如:Set‑Cookie: JSESSIONID=abc123)

3.浏览器本地存下这条cookie

4.之后的每次请求,自动带上该cookie

七、cookie的特点

1.数据保存在浏览器

2.有大小限制,一般 4KB

八、何为Session

就是后端服务器上和一块用来保存当前登录用户数据的存储空间,主要依靠JSessionID来找到对应的会话

九、Session和cookie完整登录流程

1.用户提交账号密码

2.服务器校验通过后,会创建一个Session会话,分配一个为一亿的JSESSIONID

3.服务器把这个id通过cookie发给浏览器保存

4.浏览器之后每次请求都会携带这个cookie

5.后端拿到JSESSIONID,根据这个id查询登录用户的西信息

十、cookie和session的缺点

1.容易被劫持,造成CSRF劫持

2.跨域处理麻烦

session

1.多台服务器分布式部署的时候:用户第一次访问服务器 A 创建 session;下次请求落到服务器 B,B 没有该 session → 用户掉线需要做 session 共享,Redis 存储会话,增加麻烦

2.用户量大之后,服务器存放大量 session 占用服务器内存

十一、两者快速选择的口诀

  • 小型单体项目、需要频繁强制下线——> cookie+session
  • 前后端分离、微服务、多客户端、用户基数大——> JWT
posted @ 2026-08-11 20:32  霜华序  阅读(16)  评论(0)    收藏  举报