cookie、session、token

2021-07-01 计算机网络

知识扫盲啦,看完这篇文章带你弄懂 cookie、session 和 token~

# 发展史

  • http 无状态
  • 登录网站等场景需要管理回话 session,记住哪些人登录系统,把每个人区分开,个每个人发 session id 回话标识,请求时带上就能区分了
  • 每个人只要保存自己的 session id 而服务器要保存所有人的 session id,对于服务器是巨大的开销;另一方面也严重限制了服务器的扩展能力,请求转发到另一台机器,没有 session id 又要从原机器做 session 的复制保存
  • 后面又想到了将 session id 集中存储到一个地方来进行访问,这样就不用复制了,但是负责 session 的机器挂了那后果不堪设想
  • 为什么要保存这个可恶的 session 呢?不保存怎么验证客户端发给我的 session id 却是是我生成的呢?
  • 关键就是验证,登录后服务器通过算法对数据做一个签名,把签名和数据一起作为 token 发给客户端,并且我这个 token 不保存,下次请求发过来的时候,我在通过同样的算法和秘钥再对数据签名,和 token 中签名对比相同则验证成功

由服务器生成发给浏览器,浏览器把 cookie 保存下次请求同一网站时会把 cookie 发给服务器。Cookies 保存在客户端,主要内容包括:名字,值,过期时间,路径等等。

# session

Session 是在服务器端保存用户数据。浏览器第一次发送请求时,服务器自动生成了 Session ID 来唯一标识这个并将其通过响应发送到浏览器。浏览器第二次发送请求会将前一次服务器响应中的 Session ID 放在请求中一并发送到服务器上,服务器从请求中提取出 Session ID,并和保存的所有 Session ID 进行对比,找到这个用户的信息。Session id 存在 Cookie 中,每次访问的时候将 Session id 传到服务器进行对比。

# LocalStorage

localStorage 接替了 Cookie 管理购物车的工作,同时也能胜任其他一些工作。比如 HTML5 游戏通常会产生一些本地数据,localStorage 也是非常适用的。

# SessionStorage

sessionStorage 与 localStorage 的接口类似,但保存数据的生命周期与 localStorage 不同。它只是可以将一部分数据在当前会话中保存下来,刷新页面数据依旧存在。但当页面关闭后,sessionStorage 中的数据就会被清空。

# token

token 的意思是“令牌”,是用户身份的验证方式,最简单的 token 组成:uid(用户唯一的身份标识)、time(当前时间的时间戳)、sign(签名,由 token 的前几位+盐以哈希算法压缩成一定长的十六进制字符串,可以防止恶意第三方拼接 token 请求服务器)。还可以把不变的参数也放进 token,避免多次查库

# 服务器验证暴露的问题

  1. Seesion:每次认证用户发起请求时,服务器需要去创建一个记录来存储信息。 当越来越多的用户发请求时,内存的开销也会不断增加。
  2. 可扩展性:在服务端的内存中使用 Seesion 存储登录信息,伴随而来的是可扩展性问题。
  3. CORS(跨域资源共享):当我们需要让数据跨多台移动设备上使用时,跨域资源的共享会是-个让人头疼的问题。在使用 Ajax 抓取另一个域的资源,就可以会出现禁止请求的情况。
  4. CSRF(跨站请求伪造):用户在访问银行网站时,他们很容易受到跨站请求伪造的攻击,并且能够被利用其访问其他的网站。在这些问题中,可扩展行是最突出的。因此我们有必要去寻求- -种更有行之有效的方法。

# token 的优点

1.无状态 2.支持移动设备 3.跨程序调用 4.安全

  • 无状态、可扩展
    • 在客户端存储的 Tokens 是无状态的,并且能够被扩展。基于这种无状态和不存储 Session 信息,负载负载均衡器能够将用户信息从一个服务传到其他服务器上。
    • 如果我们将已验证的用户的信息保存在 Session 中,则每次请求都需要用户向已验证的服务器发送验证信息(称为 Session 亲和性)。用户量大时可能会造成-些拥堵。
    • 但是不要着急。使用 tokens 之后这些问题都迎刃而解,因为 tokens 自己 hold 住了 用户的验证信息。
  • 安全性
    • 请求中发送 token 而不再是发送 cookie 能够防止 CSRF(跨站请求伪造)。即使在客户端使用 cookie 存储 token, cookie 也仅仅是- 一个存储机制而不是,用于认证。不将信息存储在 Session 中,让我们少了对 session 操作。
    • token 是有时效的,-段时间之后用户需要重新验证。我们也不一定需要 等到 token 自动失效,token 有撤回的操作,通过 tokenrevocataion 可以使-一个特定的 token 或是一组有相同认证的 token 无效。
  • 多平台跨域
    • 我们提前先来谈论一下 CORS(跨域资源共享),对应用程序和服务进行扩展的时候,需要介入各种各种的设备和应用程序。
    • 只要用户有一个通过了验证的 token,数据和资源就能够在任何域上被请求到。
更新时间: 2022-8-2 5:53:05 ├F10: PM┤
大鱼-钢琴版
赵海洋