浅谈单点登录
单点登录:用户只需要登录一次,就可以访问多个系统,避免频繁授权
单系统登陆功能主要是用 Session
保存用户信息来实现,但我们清楚的是:多系统可能有多个 Tomcat,而 Session
是依赖当前的 Tomcat,所以 A 的 Session
和 B 的 Session
是不共享的。
Session 不共享解决方案
解决系统之间 Session
不共享问题有以下几个方案:
- Tomcat集群
Session
全局复制(集群内每个 tomcat 的session
完全同步)【会影响集群的性能,不建议】 - 根据请求的 IP 进行 Hash 映射到对应的服务器上(这就相当于请求的 IP 会一直访问同一个服务器)【如果服务器宕机,会丢失一大部分
Session
的数据,不建议】 - 把
Session
数据存放到Redis
中(使用Redis
模拟Session
)【建议】
结论:
- SSO系统生成一个 Token,并将用户信息存在
Redis
中,并设置过期时间 - 其它系统请求 SSO 系统进行登录,得到 SSO 返回的 Token,写到
Cookie
中 - 每次请求时,
Cookie
都会带上,拦截器得到 Token,判断是否已经登录
到这里,其实我们会发现就两个变化
- 将登录功能抽取未一个系统(SSO),其它系统请求 SSO 进行登录
- 本来将用户信息存储到
Session
,现在将用户信息存储到Redis
但我们会发现,如果我们请求的是 https://www.google.com 时,浏览器会自动把 google.com 的 Cookie
带过去给 google 服务器,而不会把 https://www.baidu.com 的 Cookie
带过去给 google 服务器。
这意味着,由于域名不同,用户登录系统 A 后,系统 A 返回给浏览器的 Cookie
,用户再请求系统 B 的时候不会讲系统 A 的 Cookie
带过去。
Cookie 存在跨域解决方案
针对 Cookie
存在跨域问题,有几种解决方案:
- 服务端讲
Cookie
写到客户端后,客户端对Coolie
进行解析,讲 Token 解析出来,此后请求都把这个 Token 带上即可 - 多个域名共享
Cookie
,在写到客户端的时候设置Coolie
的 domain - 讲 Token 保存在
SessionStrong
中(不依赖Cookie
就没有跨域问题了)
参考
什么是单点登录(SSO)
阿里P8架构师谈:单点登录的原理、来源、实现、以及技术方案比较
JSON Web Token 入门教程