一、何为jwt
jwt全称JSON Web Token,是用于前后端登录鉴权,传递用户信息的令牌格式
二、jwt的三段式结构
头部一般存储加密算法和令牌类型
{
"alg":"HS256",
"typ":"JWT"
}
这个就是个例子,alg表示加密算法,这里用的是HS256(对称加密),常用的还有RSA(非对称加密)
载荷一般用于存放自定义业务数据,采用的是Base64编码,只是编码!!!可以被破译,所以不建议在载荷存放敏感信息
{
"sub": 10086,
"username": "admin",
"source": "web",
"exp": 1786408800
}
这里唯一需要注意的就是exp代表的过期时间显示的一定秒级的时间戳(如果有签发时间(iat)则一定要大于iat)
计算公式:签名 = HMAC‑SHA256( 头部base64 + "." + 载荷base64, 密钥secret )
如果有人篡改了头部或是载荷内容,这个计算结果就会发生变化与原来的签名对不上,该令牌就会直接作废
三、jwt完整工作流程
1.用户提交账号密码登录
2.后端校验账号密码是否正确
4.将token返回给前端
5.前端把token存放在浏览器本地存储(localStore)或是请求头 (token:xxxxxxxx)
6.之后每一次的请求都会携带这个token
7.后端拦截器拿到这个token,将其拆分成三段,先校验签名,再根据过期时间判断是否过期,最后再取出载荷中的用户信息,放入上下文
8.鉴权通过后放行接口的请求
四、JWT的优缺点;
优点
无状态:服务器不需要存储登录会话,减轻内存压力
适配分布式、微服务,所有服务共用密钥即可解析 token
跨域方便,不像 session 依赖 cookie
缺点(面试高频)
token 一旦签发,无法主动作废,只能等到过期时间结束
解决思路:redis 黑名单、设置较短过期时长 + 刷新 token
payload 仅 base64 编码,不能存放隐私数据
token 字符串很长,每次请求携带,增加请求体积
五、何为cookie
一段存放在客户端的键值对,可以存放任意自定义的键值对,每次访问该网站浏览器会自动带上然后发给后端
六、cookie的运行流程
1.用户访问该网站,浏览器第一次访问网站后端
2.服务器返回响应头(例如:Set‑Cookie: JSESSIONID=abc123)
3.浏览器本地存下这条cookie
4.之后的每次请求,自动带上该cookie
七、cookie的特点
1.数据保存在浏览器
2.有大小限制,一般 4KB
3.用户能够查看、修改、删除 cookie
4.可以设置过期时间;会话 cookie 关闭浏览器就失效
八、何为Session
就是后端服务器上和一块用来保存当前登录用户数据的存储空间,主要依靠JSessionID来找到对应的会话
九、Session和cookie完整登录流程
1.用户提交账号密码
2.服务器校验通过后,会创建一个Session会话,分配一个为一亿的JSESSIONID
3.服务器把这个id通过cookie发给浏览器保存
4.浏览器之后每次请求都会携带这个cookie
5.后端拿到JSESSIONID,根据这个id查询登录用户的西信息
十、cookie和session的缺点
cookie
1.容易被劫持,造成CSRF劫持
2.跨域处理麻烦
session
1.多台服务器分布式部署的时候:用户第一次访问服务器 A 创建 session;下次请求落到服务器 B,B 没有该 session → 用户掉线需要做 session 共享,Redis 存储会话,增加麻烦
2.用户量大之后,服务器存放大量 session 占用服务器内存
十一、两者快速选择的口诀
- 小型单体项目、需要频繁强制下线——> cookie+session
- 前后端分离、微服务、多客户端、用户基数大——> JWT