单点登录知识点

单点登录

多系统,单一登录,实现多系统同时登录的一种技术。

常出现在互联网应用和企业级平台。列如:京东。

单点登录一般是用于互相授信的系统,实现单一位置登录,全系统有校。

三方登录,某系统,使用其它系统的用户,实现本系统登录的方式,主要是解决信息孤岛和用户不对等的实现方案。

一、Session跨域

所谓Session跨域就是摒弃了系统(Tomcat)提供的Session,而使用自定义的类似Session的机制来保存客户端数据的一种解决方案。

如:通过设置cookies的domain来实现cookie的跨域传递。在cookie中传递一个自定义的session_id。这个session_id是客户端的唯一标识,将这个标识作为key,将客户端需要保存的数据作为value,在服务端进行保存。这种机制就是Session的跨域解决。

什么是域:在应用模型,一个完整的,有独立访问路径的功能集合称为域。如:百度称为一个应用或者系统。百度下有若干的域,如搜索引擎(www.baidu.com)、百度贴吧(tie.baidu.com)等。

什么是跨域:客户端请求的时候,请求的服务器不是同一个ip、端口、域名、主机名的时候,都称为跨域。

例如:在hosts文件配置www.test.com和sso.test.com都映射本地IP。

1、请求过来以后获取域名(不许前缀如:www、sso),.test.com和.test.com。

2、设置cookie的域名(cookie.setDomain(XXX)),为cookie设置有校范围。

3、域名相同就不存在跨域

 

二、Spring Session共享 了解

Spring Session技术是Spring提供的用于处理集群会话共享的解决方案。Spring Session技术是将用户session数据保存到第三方存储容器中,如:mysql、redis等。

Spring Session技术是解决同域名下的多服务器集群session共享问题的,不能解决跨域session共享问题。

三、Nginx Session共享

做反向代理服务器,可以为反向代理的服务器集群管理和负载均衡。

正向代理:客户端已知,对服务器透明的代理应用,称为正向代理,如:FQ软件

反向代理:服务器已知,对客户端透明的代理应用,称为反向代理,如:nginx

这个主要是配置一个域名,域名下存在多个服务器ip地址,客户端直接通过域名访问,类似百度。

四、Token 机制

1、传统身份认证

HTTP是一种没有状态的协议,也就是并不知道是谁访问应用。这里我们把用户看成客户端,客户端使用用户名和密码通过了身份验证,不过下次该客户端再次请求仍需验证。

解决的方法就是,当用户请求登录的时候,如果登录成功,我们在服务端生成一条关于该用户的记录,然后将该记录的id返回给客户端,客户端收到以后将该记录id记录到cookies中,该用户再次请求只需带着cookies中的id,服务器获取cookies中的id验证,如果存在则验证通过,否则需要重新登录。

上面说的id,可以理解为sessionId,但是我们需要将该SessionId存储在redis、mysql或者内存中等。并且需要定期区清理过期的sessionId。

这种认证的弊端

Session存储问题:每次认证用户发送请求时,服务器都需要创建一条记录来存储信息,当越来越多的用户发送请求时,内存开销也会不断增加。

可扩展问题:在服务端的内存中使用Session存储用户信息,可扩展困难。各服务器之间的session无法共享

CORS(跨域资源共享):

CSRF(跨站请求伪造):

2、Token身份认证

使用基于token的身份验证方法,在服务端不需要存储用户的登录记录,大致流程如下

客户端通过用户名密码登录,

服务端收到请求,去验证用户名密码,

验证成功以后,服务端会签发一个token,再把token返回给客户端,

客户端收到token以后将其存储起来,例如放入cookies、local storage

客户端每次请求都需带着token,服务端验证token。

使用token验证的优势

无状态、可扩展(体现服务器之间可以传递)、安全性(cookie只作存储机制,而不是用于认证)

五、JSON Web Token (JWT)机制

JWT是一种紧凑且自包含的,用于在多方传递JSON对象的技术,传递的数据可以使用数字签名增加其安全行。可以使用HMAC加密算法或者RSA公钥/私钥加密方式。

紧凑:数据小,可以通过URL,POST参数,请求头发送。且数据小代表传输快。

自包含:使用payload数据块记录用户必要且不隐私的数据,可以有效的减少数据库访问次数,提高应用性能。

JWT一般用于处理用户身份验证数据信息交换

JWT数据结构:A.B.C(A= header头信息,B=payload 有效荷载,C=Signature签名)

 

 

posted @ 2020-03-07 18:56  码农的进击  阅读(266)  评论(0编辑  收藏  举报