一、基于redis+cookie的单点登录
- 传统单机应用登录
传统单机应用,一般是结合session和cookie实现认证、授权。用户通过输入账号密码登录系统,登录成功后在系统创建一个session来保存用户登录状态。因为session是key-value的数据结构,因此我们需要将key返回给浏览器,用cookie进行存储。当用户再次访问系统时可以,根据cookie获取到登录状态的key,通过key获取session中的value判断是否已经登录。 - 分布式下单点登录
在分布式下如果继续用session保存登录信息,并判断用户是否登录。这显然是不可行的,因为在不同的主机(子服务)中session不同的。除非将session同步到所有子服务中。
同步session实现比较复杂,并且会消耗更多的内存。我们可以将session(用户登录信息)从系统中提取出来,放到一个中心平台存储(redis)。用户登录系统后,将登录信息存储到redis中,同时在浏览器生成一个cookie,存储登录信息的key。只要所有子服务都连接到同一个redis(集群),就能实现登录状态共享。
(1)redis:在key:生成唯一随机值(ip、用户id等等) ,在value:用户数据(登录信息)
(2)cookie:把redis里面生成key值放到cookie里面
二、基于jwt+cookie的单点登录
Json web token(JWT)是为了网络应用环境间传递声明而执行的一种基于JSON的开发标准(RFC 7519),该token被设计为紧凑且安全的,特别适用于分布式站点的单点登陆(SSO)场景。
简单理解:JWT是可以存储数据的一种token。它无法被篡改(篡改后jwt就失效了)。
因为JWT本身就能存储数据,因此可以去除redis存储用户的信息这个过程。只需要校验,解析就能获取登录状态。
JWT存储登录状态,本地浏览器利用cookie存储JWT。只要JWT没有失效就能正常访问系统的各个子服务。