基于cookie的单点登录解决方案
概述
用户登录之后 , 将认证信息存储至 Cookie ,当再次访问本服务或者访问其他应用服务时,直接从
Cookie 中传递认证信息,进行鉴权处理。
问题
1. 如何保障Cookie内用户认证信息的安全性?
- 第一, Cookie内不能存放用户名和密码等敏感信息, 可以生成一串Token进行替代;
- 第二, 通过加密方式存储Cookie信息,并且采用https加密方式传输,设定Cookie有效期,在 服务端设定Token的有效期,避免攻击者伪造用户身份。
2. 如何解决跨域问题?
在实际应用中, 经常会存在各种服务需要鉴权处理, 但受浏览器同源策略限制,无法去正常
操作 Cookie 数据 , 解决方式有两种 :
- 第一种,采用iframe方式解决跨域问题, 实现Cookie共享,但要注意,父窗口获取子窗口在跨域下可以正常获取,子窗口后去父窗口仍会存在跨域问题,这点在实现的时候要注意。
- 第二种,采用JSONP方式实现跨域传输,这需要在服务端设置允许跨域请求, response.setHeader("Access-Control-Allow-Origin", "*"); 设置允许任何域名跨域访问,服务端返回数据时,再设置callback,才能完成跨域请求。
设计方案架构图
这里以淘宝SSO的架构为例
基于分布式Session的单点登录解决方案
概述
大型应用服务无论是整体拆分,还是集群部署,都会涉及到统一会话问题,
- 如何保障各服务节点都能够统一有效鉴权?
- 某个服务节点宕机,重启后如何恢复登录状态?
- 在Cookie禁用的情况下如何实现SSO?
由此产生了分布式 Session 设计方案。 分布式 Session 方案,实质是通过自定义的Session机制来处理用户的登录鉴权信息,实现单点登录。
实现流程
常用技术框架
Spring Session :
它是目前主流的 Session 管理解决方案, Spring Session 并非特定应用于HTTP, 它是一种广义的分布式统一Session ,支持 WebSocket 和 WebSession 等,并且可以基于Redis、 MongoDB 等多种高性能缓存来实现。
XXL-SSO :
它是一个分布式单点登录框架。只需要登录一次就可以访问所有相互信任的应用系统。 拥有” 轻量级、分布式、跨域、 Cookie+Token 均支持、 Web+APP 均支持 ” 等特性。现已开放源代码,开箱即用。架构图:
基于客户端令牌Token的单点登录解决方案
概述
根据客户端身份信息由认证服务生成签名令牌,令牌中会包含基本的用户信息,客户端在请求资源
服务时会附带令牌,资源服务根据加密协议在本地进行验证,或者发送给认证服务端进行校验。它可以解决分布式会话的安全性问题,比如会话劫持,同时不需要集中统一维护session ,能够做到无状态化处理。OAuth2 和 JWT 都是基于令牌 Token 实现的认证方案。
适用场景
JWT (JSON Web Token) 是一个开放安全的行业标准 , 用于多个系统之间传递安全可靠的信息。它由三部分组成,头部(Header)、载荷 (playload)与签名(Signature) 。
Token 实质是一个无意义的UUID,需要服务端做记录与认证。
但JWT 则赋予了用户的身份信息,可以采用自定义算法进行加密与解密,直接实现信息的传输交换。
那具体适用于哪些场景?
- 可以适用于微服务应用,无论是内部服务节点的认证与授权,或是令牌与API网关结合的认证。
- 可以适用于开放式的API接口访问,比如前后分离API对接,第三方API接口对接等。