浏览器第一个请求服务器,服务器会创建一个会话,并将会话的ID作为响应的一部分发送给浏览器,浏览器存储会话ID,并在后续的请求中带上会话ID,服务器取得请求中的会话ID就知道是不是同一个用户了。
浏览器存储会话ID的两种方式
登录状态
浏览器第一次请求时需要用户输入用户名,密码等身份信息。服务器接收到身份信息之后进行校验,校验成功之后,将会话状态 更新为已登录或已注册状态,并返回受保护的资源。
每次请求受保护资源时都会检查会话对象中的登录状态,只有通过验证的会话才能访问,登录机制因此而实现。
web系统早已从久远的单系统发展成为如今由多系统组成的应用群,面对如此众多的系统,用户难道要一个一个登录,一个一个注销?
web系统由单系统发展成多系统组成的应用群,复杂性应该由系统内部承担,而不是用户。无论web系统内部多么复杂,对用户而言,都是一个统一的整体,也就是说,用户访问web系统的整个应用群与访问单个系统一样,登录/注销只要一次就够了。
虽然单系统的登录解决方案很完美,但对于多系统应用群已经不再适用了,为什么呢?
单系统登录解决方案的核心是cookie,cookie携带会话id在浏览器与服务器之间维护会话状态。但cookie是有限制的,这个限制就是cookie的域(通常对应网站的域名),浏览器发送http请求时会自动携带与该域匹配的cookie,而不是所有cookie。
既然这样,为什么不将web应用群中所有子系统的域名统一在一个顶级域名下,例如“*.baidu.com”,然后将它们的cookie域设置为“baidu.com”,这种做法理论上是可以的,甚至早期很多多系统登录就采用这种同域名共享cookie的方式。
然而,可行并不代表好,共享cookie的方式存在众多局限。首先,应用群域名得统一;其次,应用群各系统使用的技术(至少是web服务器)要相同,不然cookie的key值(tomcat为JSESSIONID)不同,无法维持会话,共享cookie的方式是无法实现跨语言技术平台登录的,比如java、php、.net系统之间;第三,cookie本身不安全。
因此,我们需要一种全新的登录方式来实现多系统应用群的登录,这就是单点登录
什么是单点登录?单点登录全称Single Sign On(以下简称SSO),是指在多系统应用群中登录一个系统,便可在其他所有系统中得到授权而无需再次登录,包括单点登录与单点注销两部分
相比单系统登录,sso需要一个独立的认证中心,只有认证中心可以接受用户的用户名,密码等身份信息,其他系统不提供登录入口,只接受认证中心的间接授权。间接授权通过令牌实现,sso认证中心验证用户的用户名密码无误后,创建授权令牌,在接下来的跳转过程中 ,授权令牌作为参数发送给各个子系统。子系统拿到令牌,即得到了授权,可以借此创建局部会话,局部会话登录方式于但系统登录方式相同。
用户认证成功之后,会于sso认证中心以及各个子系统创建会话,用户与sso认证中心创建的会话称为全局会话,用户与各个子系统之间创建的会话称为局部会话,局部会话建立之后,用户访问子系统受保护的资源将不再通过sso认证中心。
全局会话和局部会话有如下约束关系
单点登录自然也要单点注销,在一个子系统中注销,所有子系统的会话都将被销毁