SSO

Posted by Liber Sun on May 30, 2019

SSO

单点登陆,就是用户只需要一次登陆,各个子系统都可感知该用户完成了登陆。

HTTP无状态协议

众所周知,HTTP是一种无状态的协议,这意味着服务器是无法确认HTTP的发起者的信息。于是为了给用户一个标识,给每一个用户都发一个通行证,无论谁访问的时候都需要携带通行证,这样服务器就可以从通行证上确认用户的信息。 通行证就是Cookie

如果说Cookie是检查用户身上的”通行证“来确认用户的身份,那么Session就是通过检查服务器上的”客户明细表“来确认用户的身份的。Session相当于在服务器中建立了一份“客户明细表”。

我们这里需要区分Cookie和Session。

  • Cookie一般用于保存用户信息(保存在客户端),下次访问时页面就可以从Cookie中取值。我们一般将服务器生成的token保存在其中
  • Session的作用是通过服务器端记录用户的状态(保存在服务器端)。

实现SSO

基本思路是利用Session来保存用户信息,但我们清楚的是:多系统即可能拥有多个Tomcat,Session在不同的Tomcat中是无法共享的。

我们可以考虑如下的方案: 1.Tomcat集群的session全局复制,实现同步。(集群同步,不建议) 2.将Session数据放置mysql或者redies中(导致频繁的数据库操作) 3.使用JWT实现

JWT机制的优点:所有的数据不在由服务器保存,而是通过相应的私钥加密以后保存在头文件中,而服务器只保存秘钥即可,这样增加了相应的拓展性,无状态、可扩展,还可以防止CSRF(跨站请求伪造)

认证的过程:客户端使用用户名、密码请求登录,服务端收到请求,去验证用户名、密码,验证成功后,服务端会签发一个 Token,再把这个 Token 发送给客户端,客户端收到 Token 以后可以把它存储起来,比如放在 Cookie 里或者 Local Storage 里(cookie保存方式,可以实现跨域传递数据。localStorage是域私有的本地存储,无法实现跨域。webstorage可保存的数据容量为5M。且只能存储字符串数据),客户端每次向服务端请求资源的时候需要带着服务端签发的 Token,服务端收到请求,然后去验证客户端请求里面带着的 Token,如果验证成功,就向客户端返回请求的数据