互联网用户登录模式变迁史(一)

单体架构

在单体服务的时候,登录和注册是很常见的一个功能。

大家都知道,HTTP 是无状态的协议,那么服务器无法确认用户的信息,也就是说服务器不知道客户端谁是谁,这个问题难不倒聪明的人类,W3C 就提出了:给每一个用户都发一个通行证,无论谁访问的时候都需要携带通行证,这样服务器就可以从通行证上确认用户的信息。通行证就是Cookie

只有客户端带着通行证Cookie,服务器也是一脸蒙啊,于是服务器就使用Session,服务器向用户浏览器发送了一个 SESSION_ID 的 Cookie,它的值是 Session 的 id 值。其实 Session 是依据 Cookie 来识别是否是同一个用户

也就是说,服务器和每个客户端会建立一个 session,然后返回这个 session 的 id,当做 Cookie,当用户使用浏览器再次请求服务器的时候,服务器会检查这个 cookie,也就是会去服务器查找是否存在这个 session 的 Id。Session 本身也需要配合 cookie 来使用的。

所以,一般我们单体服务系统实现登录会这样做:

  • 登录:将用户信息保存在 Session 对象中

  • 如果在 Session 对象中能查到,说明已经登录
    如果在 Session 对象中查不到,说明没登录(或者已经退出了登录)

  • 注销:从 Session 中删除用户的信息

  • 记住我 关闭掉浏览器后,重新打开浏览器还能保持登录状态

001

从上图可以看到,早期的时候 2 个系统,session 是不共享的,如何解决这个问题?

解决方案:

  1. 后端集群 Session 全局复制。集群内每个后端服务的 session 都完全同步。(集群性能不高,不建议)
  2. 根据 Ip 进行 Hash 映射,也就是说同一个 ip 会一直映射到一个服务器上。(如果服务器宕机,丢失 session 数据,不建议)
  3. 把 session 放到 redis 中。

单点登录 SSO

SSO=Single Sign On,在多个应用系统中,只需要登录一次,就可以访问其他相互信任的应用系统。

同域名下的单点登录

002

  1. sso 登录以后,可以将 Cookie 的域设置为顶域,即:go-edu.cn。

  2. 把 seesion 放到一个共享的地方。

    003

不同域名下的单点登录

下面是标准的单点登录的标准流程。

第一个应用完整流程

2061660533865_.pic

(图 1)
  1. 用户想要访问 app。
  2. Get 请求 https://app.example.com/
  3. App 发现用户没有登录,需要登录,使用 302 状态码重定向到 CAS Server,并把 app.example.com 当成参数。
  4. Get 请求https://acs.example.com/cas/login?service=https://app.example.com到CAS Server.
  5. CAS Server 返回一个登录的表单。
  6. 填写用户名和密码,提交表单。
  7. Post https://cas.example.com/cas/login?service=https://app.example.com/,携带用户名和密码。
  8. CAS Server 验证用户名和密码。
  9. 验证用户通过,设置 Cookie CASTGC=TGT-2345678,并跳转https://app.example.com/?ticket=ST-123456
  10. Get 请求 https://app.example.com/?ticket=ST-123456
  11. app.example.com 接收到请求后,发送给 CAS Server https://cas.example.com/serviceValidate?service=http://app.example.com/&ticket=ST-12345678
  12. CAS Server 验证通过,返回 200
  13. app.example.com 设置 Cookie JSESSIONID=ABC1234567,重定向到 app.example.
  14. 请求 app.example.com 携带 Cookie JSESSIONID=ABC1234567
  15. 验证 Session Cookie
  16. 返回请求资源
  17. 显示资源

第二个应用完整流程

2071660533876_.pic

(图 2)
  1. 请求 app2
  2. Get 请求 https://app2.example.com
  3. app2 发现没有登录,返回 https://cas.example.com/cas/login?service=https://app2.example.com
  4. Get 请求 https://cas.example.com/cas/login?service=app2.example.com 携带 Cookie CASTGC=TGT-2345678
  5. CAS Server 验证 Cookie TGT
  6. 验证通过,重定向 https://app2.example.com/?ticket=ST-2345678
  7. Get 请求https://app2.example.com/?ticket=ST-2345678
  8. app2 发送 Get 请求 https://cas.example.com/servcieValidate?service=https://app2.example.com&ticket=ST-2345678
  9. CAS Server 验证成功
  10. 设置 Cookie MOD_AUTH_CAS_S=XYZ1234567,重定向https://app2.example.com
  11. Get 请求https://app2.example.com 携带 Cookie MOD_AUTH_CAS_S=XYZ1234567
  12. 验证 Session 和 Cookie
  13. 返回内容
  14. 显示 app2

添加微信 公众号更多内容
wechat gzh