Session登录、Redis Token、JWT认证的对比
文章目录
- Session登录、Redis Token、JWT认证的对比
- 前言
- 基于Redis的Session登录
- Session、Cookie会话
- 利用Redis解决分布式的问题
- 基于Redis的Session登录与JWT的比较
- 总结
前言
黑马点评里面用到了基于Redis实现Session共享登录的方式,我们展开讲讲。
基于Redis的Session登录
Session、Cookie会话
首先我们要明白,为什么有Session的存在。
Http是无状态的,也就是说 客户端发出的每次请求 服务端都会把他当作陌生的请求。
而Session登录,在用户登录之后,服务器创建Session,里面存放id以及用户信息。
并把SessionID返回给浏览器的cookie。
Cookie本质:浏览器保存的一小段数据
以后该客户端发送请求的时候就会携带Cookie,服务端接受到里面的SessionID,就会去Session池里面查找。
这就是Session的登陆状态验证。
利用Redis解决分布式的问题
但是Session有个问题,无法共享信息。
在实际业务中,后端有多个服务器。
如果你登录时,负载均衡请求到服务器A,A里面有你的Session
但是你下次别的请求,到了服务器B,B里面没有Session,就校验失败了。
因此出现了基于Redis的Session登录
就是把SessionID放在Redis里面,然后查找的时候也在Redis里面查找。
还有"Token + Redis"方案。
这种方法就是在用户登录之后,生成一个Token返回给前端。
然后以Token为键,用户信息为值放入Redis。
浏览器下次发送请求的时候,带上token,后端拦截器拦截请求的时候校验token,完成校验。
JWT的具体实现原理可以看看我的另一篇文章:从点击登录到访问接口:一文看懂苍穹外卖JWT认证全流程
基于Redis的Session登录与JWT的比较
| Redis Session: | JWT |
|---|---|
每次请求可expire续期,支持"活跃不过期" | 过期时间写死,无法续期 |
| 删 Redis key 可以实现踢出用户 | 无法主动失效 只能等待过期 |
| 服务器有状态 | 服务器无状态,不用存储一堆信息 |
| 适合需要登录态可控、滑动续期、踢人下线的 Web/APP | 适合微服务间认证、开放 API、一次性令牌 |
JWT实现登出:① token 有效期设很短(如15分钟),靠自然过期;② Redis 维护黑名单,登出时把 token 加入黑名单(这已不是纯无状态);
总结
本文介绍了基于 Session、Redis Token 和 JWT 的登录认证机制。不同方案在状态管理、分布式支持、续期与主动失效等方面各有优缺点,实际开发中应根据业务需求与安全要求选择合适的方案。