因为现在的服务器基本都不是单机类型的嘛,基本都会做成一个服务器集群,那么此时会话状态的同步就是一个问题了,就是说对于一个网页,我在一个服务器上登陆了,访问集群别的服务器的时候总不能再登陆一次吧?单点登陆解决的就是这样的问题,就是说我在一个服务器上登陆了,那么其他服务器也应该能得知这个客户端的连接状态才对
一个方法就是可以使用Cookie去做。就是客户端持有这个储存着登陆信息的cookie,然后每次发送请求的时候都带上这个cookie,就可以做到。但是这个方法并不好,首先一点是Cookie它是不安全,有可能会被恶意修改或者替换。再者就是,Cookie并不是全局的,它是域名级别的。也就是说客户端发送请求并不会把所有Cookie带上,只会带上域名对应的cookie。这个是最致命的。
所以一个比较好的方案,就是使用单点登陆认证中心。这个认证中心专门负责去做登陆注销相关的业务,并且负责生产权限令牌。
举个例子,比如说客户端进行登陆,这个请求最终会落在单点登陆认证中心上,如果校验通过了,那么认证中心就会生成与客户端的一个全局会话,并且创建一个权限令牌(这个权限令牌可以是一个随机的序号来做,比如说UUID),之后客户端向集群中的某个服务器请求资源,这个服务器首先要去认证中心查看,这个客户端是否有相关的权限令牌,如果有的话说明已经登陆过了,那么就会记录一下这个状态,然后把资源发送给客户端。集群中的每个服务器都会做类似的操作,从而完成单点登陆的功能。