单点登录下如何保存用户登录状态

原文:https://mp.weixin.qq.com/s/S9UtWCv_lZ0Hmj1eTfSyUw

目前市面上很多公司是分布式系统架构,这种架构下采用的是单点登录方式来实现用户的一次登录多处使用,那么单点登录下使用什么方案来存储用户的登录状态呢?下面介绍几种常见的实现方案。

1、认识单点登录

单点登录是为了实现在分布式系统当中,用户登录了其中的一个子系统后就可以正常的去访问其他的子系统,如下图所示:

=用户在A系统中登录之后,再去请求B系统的时候就无需用户再次执行登录操作,大大的提高了用户的体验。

2、cookie+session实现用户登录状态的存储

实现单点登录最简单的是cookie+session的方案,方案的实现原理图如下图所示:

当用户请求后端系统的时候,此时在分布式系统环境下,用户的请求首先会到达网关进行统一的认证授权,网关解析请求的cookie中存储的sessionId,如果sessionId不存在,或者在认证中心检测到sessionId无效,以及session已经过期等情况下,系统会重定向到登录页面要求用户登录。

当用户执行登录请求的时候会将用户名密码发送给认证中心进行用户名和密码的验证,如果验证成功,认证中心会存储session信息。然后认证中心将sessionId存入到客户端的cookie当中,这样就完成了用户状态的存储。

当用户再次访问后端系统,网关首先获取cookie中的sessionId,然后携带sessionId去请求认证中心,认证中心验证sessionId是否有效,如果验证成功会返回用户信息给网关,然后网关再去转发请求到后端对应的服务上执行。

虽然cookie+session实现单点登录是一种非常简单的实现方案,但是这样方案存在一定的缺陷,如果网站的用户量非常的大,此时认证中心服务的压力变大,为了保证认证中心服务的高可用,此时需要对认证中心做进行集群部署,如下图所示:

对认证中心做集群部署后,每个认证中心服务上的session信息是不同步的,此时cookie+session实现单点登录就会存在问题。

其实认证中心的session不同步的问题是可以解决的,如下的整理的session同步的方案:

整理分布式Session的解决方案

业界使用较多的是将登录状态存入到Redis中的方案,Redis存储session的实现的原理图如下所示:

Redis存储用户的登录状态方案能够减少认证中心单点故障引发的一些问题(如认证中心重启之后导致的session丢失问题)。

3、JWT方案

JWT方案可以完全不存储用户信息,从而进一步减少了数据存储和访问的压力。通过JWT的实现方案,认证中心不需要依赖任何的存储,完全由JWT来保持用户的信息。

JWT是由header,payload和signature等三部分组成的,如下图所示:

(1)header:用来保存加密的算法
(2)payload:用来存储用户的信息
(3)signature:用来存储通过header当中指定的算法进行加密后的密文,如下图所示的signature密文生成过程:

最后生成一个完整的jwt的token,如下图所示的一个完成的密文:

eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ7XCJhZ2VcIjoxMX0iOlt7IntcIm5hbWVcIjpcInpoYW5zYW5cIn0iOiJodHRwczovL3Rvb2x0dC5jb20ifV0sImlhdCI6MTc1NjAwODEwNiwiZXhwIjoxNzU2MDU0Nzk5LCJhdWQiOiIiLCJpc3MiOiIiLCJzdWIiOiIifQ.V2kDOIkXcDig1fFqjDfi5T0vnV64OADjAGWJpo8bGiQ

JWT主要是通过服务器上的私钥来保证JWT的安全性,当然JWT也不是一定的安全的。通过JWT实现单点登录中保存用户状态的实现流程图如下所示:

实际上,JWT实现方案可以替代原先使用Redis存储session的方案,因为用户的信息存储在JWT当中;但是前端的cookie还是需要的,如果在前端不存储token的话,每次请求的时候就无法携带token到后端了。

总结:

单点登录保存用户的登录状态实现方案比较典型有cookie+session的方案、JWT的方案,具体使用什么方案实现要根据实际的下项目环境决定。

作者:Jeebiz  创建时间:2025-10-19 11:12
最后编辑:Jeebiz  更新时间:2025-10-19 11:16