session和cookie
为什么要使用session和cookie,他的流程是怎么样的
因为浏览器是无状态的,相当于每一次访问都是一次全新的访问,我们一般是登录来进行校验获取他的全部信息,所以会出现这个情况
这样当然也可以使用,但是很繁琐,并且影响性能,所以出现了session和cookie,他会生成一个标识符sessionid传给前端存在cookie中
这样就可以解决浏览器无状态的问题
为什么有了session和cookie还要使用JWT
问题一
但是这个时候会出现一个问题,那么假如是分布式呢?
现在想一个例子,如果我做了集群,出现了一个新的服务器,我要怎么保证负载均衡可以把请求发送到我的原服务器呢?如果请求发到新服务器,会出现什么结果呢?
如果用户将请求发送到新服务器,会导致找不到sessionid对应的session,从而导致用户丢失登录状态,从而必须重新登录,这是大忌
那么我们是怎么解决的呢,我们也可以使用redis,将session和sessionid存入redis中,从而保证分布式也可以共享session数据
但是这样又会出现一个问题
问题二
依赖性太高了,如果出现问题会导致,所有用户登录失效
所以JWT出现了
JWT
JWT的工作原理和流程
工作原理:就是后端返回给前端一个JWT,前端每次发请求会带上这个token
流程:
其中JWT的结构图
其中头部就是存的比如算法,使用的什么类型
荷载存的就是我们的主要内容,一般有发起人,用户,失效时间,还有我们想存的都可以存
签名就是将头部和荷载进行一个加密
JWT的缺点
虽然JWT可以解决我们上面的问题,但是他也有一些缺点
1.因为无状态,token如果没有到期,我无法主动修改令牌来使用户下线
(什么叫无状态,
- 每个请求自包含: 每个请求都包含了所有需要的信息(如 JWT),使得服务器能够理解请求而无需保持会话状态。
- 服务器不需要存储会话信息: 服务器不需要在内存中保存有关用户会话的信息。所有的用户数据和会话信息都包含在 JWT 中,由客户端提供。
)
2.不加密,会暴露头部和荷载的信息
3.占内存,因为会转为base64格式,在网络传输中会比较大
如果不使用他们,能不能做一个登录校验和令牌
也可以的,我们可以使用一个唯一标识,比如时间戳,然后充当他的Token,并且放入redis,这样也可以解决浏览器无状态问题