Loading

Before SSO: Session, Cookie, Token

Before SSO: Session, Cookie, Token

在单点登录这种设计出现之前,人们如何保证打开浏览器登录网站(如博客园)一次之后,新建标签页再次打开网站而不用登录了呢?

image-20210306172358979

HTTP是无状态的网络协议,在服务端我们开辟一块叫做 Session 的内存/ 磁盘/ 数据库来记录这次连接的一些信息,这就保持了请求的状态。

a 用户登录博客园,在服务器端我们为 a 用户开辟一块叫做 a_session 内存来记录 a 用户的一些信息,同时把这个 a_session 的 id 通过 Cookie 返回给浏览器,浏览器会记录下这个 Cookie 放入自己的一个空间里,这个空间里存放了各类网站的 cookies

当 a 用户再次请求博客园网站的地址时,浏览器在 cookie 所属的空间(域)里包含了该网址(域),则这次 HTTP 请求 会带上 cookie 信息 a_session_id。服务端的过滤器 Filtersession_id 和这个 id 是刚刚用户登录产生并且有效的,则直接返回资源给浏览器,而不是再次进行登录。

优点:

  • 设置 http-only 属性,js 脚本将无法获取,可以避免 XSS 攻击。
  • 客户端不用编写额外代码。

缺点:

  • 开销问题,因为通过 session 来维持连接的状态,每个用户都要新建一个 session

  • 扩展性不好,session 不能共享。

  • 不能跨域(可以通过反向代理实现)。

    • 易受 XSRF/CSRF 攻击。
  • 每个请求都会带有 cookie ,即使访问不需要登录的资源(固定,通用)也必须验证。

Token-Based Authentication

TokensessionId 类似,由服务端生成但是服务端并不保存,交由 RedisMongoDB ,并返回给浏览器并保存在某个位置(localStorage, sessionStorage, cookie)。当下次请求时,客户端代码把 token 加入 http 请求,服务端去验证本次请求中的 token 的有效性。

优点:

  • 可以选择自己需要授权的请求去完成身份验证。
  • XSRF 免疫。
  • 可以跨域。

缺点:

  • 必须找个自己在浏览器找个地方保存。

    • localStorage(浏览器关闭后依然存在)
    • sessionStorage(浏览器关闭后丢弃)
    • cookie(每次请求都发,如果不是 http-only 易受 XSS 攻击)。
  • 更易受 XSS 攻击(通过脚本获取 token ,被标记未 http-onlycookie 依然能发出授权请求。

posted @ 2021-03-06 19:21  齐玉  阅读(73)  评论(0)    收藏  举报