![](https://iknow-base.cdn.bcebos.com/lxb/notice.png)
浅谈单点登录
1个回答
展开全部
心血来潮,探讨一下cookie和session机制,以及单点登录的原理。不到之处欢迎指正。
要谈单点登录,还要从cookie机制说起。这块知识也是面试中的高频题,小马以前如有辅助也会喜欢聊。只是大部分同学不是概念模糊就是完全抛弃了这块知识点,经常被秒。
cookie机制是一种会话机制,源于HTTP协议是无状态的。当浏览器发起的http请求要和服务端保持会话状态的时候,需要借助中间介质,而cookie机制刚好合适。
我们来举个栗子,假设我现在访问王者农药官网。
1.打开浏览器输入xxx域名;
2.浏览器会在硬盘中查找关于xxx 的Cookie,一般登录态标识存储的是session_id,然后把Cookie 放到 HTTP Request 中,再把Request 发送给 Web 服务器;
3.服务端识别到cookie,会在服务端查询对应session_id的用户会话记录并校验,如果存在并且有效,则进行本次登录态数据操作(比如写基本的登录态session数据),处理用户为正常登录状态,此时浏览器看到的就是已登录的状态。如果没有相关信息,则用户处于未登录状态。
4.如果未登录,用户会在浏览器操作登录。登录成功后往浏览器写cookie(session_id),同时服务端会有相应的session_id会话记录(默认是文件存储)。当浏览器关闭或者用户操作注销(服务端删除登陆态session),则本次会话结束,本次会话信息(session_id)失效。当然,这也有例外,那就是如果设置了cookie的有效期,那么该会话消息将会保存到到期为止,客户端的cookie和服务端的session会话信息都会保持有效期 。想想我们平时登录时看到的“自动登录”勾选,下次访问就可以直接就是已登录状态,就是这个原理。
好了,以上就是cookie和session的会话机制了。
从上面可以看到cookie大致可分为两大类:会话Cookie和持久Cookie。
会话Cookie是一种临时的Cookie,它记录了用户访问站点,它记录了用户访问站点时的设置和偏好;关闭浏览器,会话Cookie 就被删除了。
持久 Cookie 存储在硬盘上,不管浏览器退出或计算机重启,持久Cookie 都继续存在。持久Cookie 有过期时间。
他们的共同点是,都是存储在客户端(浏览器)的,是存在硬盘上的,不同浏览器,不同操作系统存储 Cookie 的地方可能不一样。那么自然的session就是存储在服务端的(注意,敲黑板必考题)。session有哪几种存储方式呢?浏览器禁用cookie后session还能用吗?
session默认是存文件,当然也可以配置为DB存储或者cache存储,比如redis。浏览器禁用cookie后session还能用吗?能,将session_id放在url参数中,服务端也能识别session会话信息,但处理起来就不是那么优雅,说白了,cookie只是一种比较合适的客户端存储媒介。对于一些禁用了浏览器cookie的用户可以这样兼容,但少见,基本无视。
于是我们聊到正题,单点登录是什么?
单点登录(Single Sign On),简称为 SSO,是比较流行的企业业务整合的解决方案之一。SSO的定义是在多个 应用 系统中,用户只需要登录一次就可以访问所有相互信任的应用系统。
先丢一个问题出来助助兴。假如我现在服务端是个集群,怎么处理登录态问题呢?比如我还是农药官网,我登录成功了网站xxx,但是第二次访问的时候又告诉我已经登录了,再刷一下,又显示已登录,这是什么鬼呢?原因是假如xxx域名下的服务端是分布式集群,并且同时又采用了默认的文件存储方式存储session会话信息。于是第一次处理请求的是机器A存储了文件会话信息,当第二次会话带着cookie去服务端,这时正好处理请求的是机器B,于是寻找不到会话信息文件,自然浏览器就认为未登录。
以上问题可以通过服务端共享登录态信息实现,修改session存储方式为DB或者redis等cache,来达到多机器共享,单域名下的分布式集群登录态共享即可解决。
如果是同一个域名下的几个server,把cookie的路径设置成顶级域名下(比如域名xxx下面有a.xxx,b.xxx子域名),这样所有子域都能读取cookie中的token(或者是session-id)即可。但这里有个问题,如果是跨域,那取不到cookie,要怎么办呢?
因为cookie没有跨域性质,如果不同域名xxx和ccc要共享登录态无法通过共享同一个cookie来解决。于是就有了令牌的机制,统一用一个令牌凭证来在各个系统之间保持登录态。
采用令牌验证机制
要实现SSO,需要以下主要的功能(本段描述参考自百科):
所有应用系统共享一个身份认证系统。统一的认证系统是SSO的前提之一 。认证系统的主要功能是将用户的登录信息和用户信息库相比较,对用户进行登录认证;认证成功后,认证系统应该生成统一的认证标志(ticket),返还给用户。另外,认证系统还应该对ticket进行效验,判断其有效性。
所有应用系统能够识别和提取ticket信息。要实现SSO的功能,让用户只登录一次,就必须让应用系统能够识别已经登录过的用户。应用系统应该能对ticket进行识别和提取,通过与认证系统的通讯,能自动判断当前用户是否登录过,从而完成单点登录的功能。
小马认为有点类似微信接口调用的access_token机制。
要谈单点登录,还要从cookie机制说起。这块知识也是面试中的高频题,小马以前如有辅助也会喜欢聊。只是大部分同学不是概念模糊就是完全抛弃了这块知识点,经常被秒。
cookie机制是一种会话机制,源于HTTP协议是无状态的。当浏览器发起的http请求要和服务端保持会话状态的时候,需要借助中间介质,而cookie机制刚好合适。
我们来举个栗子,假设我现在访问王者农药官网。
1.打开浏览器输入xxx域名;
2.浏览器会在硬盘中查找关于xxx 的Cookie,一般登录态标识存储的是session_id,然后把Cookie 放到 HTTP Request 中,再把Request 发送给 Web 服务器;
3.服务端识别到cookie,会在服务端查询对应session_id的用户会话记录并校验,如果存在并且有效,则进行本次登录态数据操作(比如写基本的登录态session数据),处理用户为正常登录状态,此时浏览器看到的就是已登录的状态。如果没有相关信息,则用户处于未登录状态。
4.如果未登录,用户会在浏览器操作登录。登录成功后往浏览器写cookie(session_id),同时服务端会有相应的session_id会话记录(默认是文件存储)。当浏览器关闭或者用户操作注销(服务端删除登陆态session),则本次会话结束,本次会话信息(session_id)失效。当然,这也有例外,那就是如果设置了cookie的有效期,那么该会话消息将会保存到到期为止,客户端的cookie和服务端的session会话信息都会保持有效期 。想想我们平时登录时看到的“自动登录”勾选,下次访问就可以直接就是已登录状态,就是这个原理。
好了,以上就是cookie和session的会话机制了。
从上面可以看到cookie大致可分为两大类:会话Cookie和持久Cookie。
会话Cookie是一种临时的Cookie,它记录了用户访问站点,它记录了用户访问站点时的设置和偏好;关闭浏览器,会话Cookie 就被删除了。
持久 Cookie 存储在硬盘上,不管浏览器退出或计算机重启,持久Cookie 都继续存在。持久Cookie 有过期时间。
他们的共同点是,都是存储在客户端(浏览器)的,是存在硬盘上的,不同浏览器,不同操作系统存储 Cookie 的地方可能不一样。那么自然的session就是存储在服务端的(注意,敲黑板必考题)。session有哪几种存储方式呢?浏览器禁用cookie后session还能用吗?
session默认是存文件,当然也可以配置为DB存储或者cache存储,比如redis。浏览器禁用cookie后session还能用吗?能,将session_id放在url参数中,服务端也能识别session会话信息,但处理起来就不是那么优雅,说白了,cookie只是一种比较合适的客户端存储媒介。对于一些禁用了浏览器cookie的用户可以这样兼容,但少见,基本无视。
于是我们聊到正题,单点登录是什么?
单点登录(Single Sign On),简称为 SSO,是比较流行的企业业务整合的解决方案之一。SSO的定义是在多个 应用 系统中,用户只需要登录一次就可以访问所有相互信任的应用系统。
先丢一个问题出来助助兴。假如我现在服务端是个集群,怎么处理登录态问题呢?比如我还是农药官网,我登录成功了网站xxx,但是第二次访问的时候又告诉我已经登录了,再刷一下,又显示已登录,这是什么鬼呢?原因是假如xxx域名下的服务端是分布式集群,并且同时又采用了默认的文件存储方式存储session会话信息。于是第一次处理请求的是机器A存储了文件会话信息,当第二次会话带着cookie去服务端,这时正好处理请求的是机器B,于是寻找不到会话信息文件,自然浏览器就认为未登录。
以上问题可以通过服务端共享登录态信息实现,修改session存储方式为DB或者redis等cache,来达到多机器共享,单域名下的分布式集群登录态共享即可解决。
如果是同一个域名下的几个server,把cookie的路径设置成顶级域名下(比如域名xxx下面有a.xxx,b.xxx子域名),这样所有子域都能读取cookie中的token(或者是session-id)即可。但这里有个问题,如果是跨域,那取不到cookie,要怎么办呢?
因为cookie没有跨域性质,如果不同域名xxx和ccc要共享登录态无法通过共享同一个cookie来解决。于是就有了令牌的机制,统一用一个令牌凭证来在各个系统之间保持登录态。
采用令牌验证机制
要实现SSO,需要以下主要的功能(本段描述参考自百科):
所有应用系统共享一个身份认证系统。统一的认证系统是SSO的前提之一 。认证系统的主要功能是将用户的登录信息和用户信息库相比较,对用户进行登录认证;认证成功后,认证系统应该生成统一的认证标志(ticket),返还给用户。另外,认证系统还应该对ticket进行效验,判断其有效性。
所有应用系统能够识别和提取ticket信息。要实现SSO的功能,让用户只登录一次,就必须让应用系统能够识别已经登录过的用户。应用系统应该能对ticket进行识别和提取,通过与认证系统的通讯,能自动判断当前用户是否登录过,从而完成单点登录的功能。
小马认为有点类似微信接口调用的access_token机制。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询