Cookie、Session和Token

本文重在对比cookie、session和token,并介绍它们的由来,不具体介绍这三个技术更深层次的细节。

写在前面

先进行一个宏观总结,再掰开看看细节:

  1. Cookie
    • 存储在浏览器的一个小文件,每次发http请求都会带上cookie,让服务器了解客户的状态。
    • 大小、数量有限制,有跨域问题,根据是否有过期时间分为会话cookie和持久cookie。
  2. Session
    • 存储在服务器的一个结构,客户首次和服务器建立连接时,由服务器创建;
    • 每个session有自己唯一的sessionid,服务器可以将sessionid放到cookie中发给客户,这样客户每次请求时,服务器都能从cookie中拿到该客户对应的sessionid。
  3. Token
    • 令牌,更多的用来做登陆验证,不存在使用cookie、session作登陆验证时存在的csrf等问题;
    • token是无状态的,如果要存状态信息,可以联合session一起使用。

Cookie和Session

为什么有Cookie和Session

HTTP协议是无状态协议,即每次请求完就完事儿了,服务器不保存客户端的状态,不知道不同请求之间有没有什么关联。因此如果想让服务器知道自己的状态,客户端每次必须带上自己的状态去请求服务器。

早期的Web主要用于文档浏览,所有服务器不需要知道客户端的状态,客户端也不需要把自己的状态告知服务器。这种场景下,无状态http协议能够很好的工作。

但是现阶段随着互联网不断发展,各类交互式Web开始需要保持用户状态,入电商、社交网站等等,都需要保存用户的登陆状态、用户身份信息等等。因此需要一种技术能够保存用户状态,解决http无状态的问题。

Cookie是浏览器存储在本地的数据文件, 对于用户而言是具体存在的。一般是从服务端接收到,然后保存在本地,当再次请求对应的网站,会带上该域名下的cookie,这样就可以让服务器知道自己的状态。

Cookie的作用通俗的说就是当一个用户通过HTTP协议访问一个服务器的时候,这个服务器会将一些Key/Value键值对返回给客户端浏览器,并给这些数据加上一些限制条件,在条件符合时这个用户下次访问这个服务器的时候,数据又被完整地带回给服务器。

由于cookie是存在客户端上的,所以浏览器加入了一些限制确保cookie不会被恶意使用。cookie限制大小一般是4K,保证不会占据太多磁盘空间。另外出于对隐私安全的考虑,Cookie设计为不可跨域名。即www.google.com颁发的Cookie不会被提交到域名www.baidu.com,即使提交过去也不可用。

Session

通过把数据放在cookie中,可以让服务端知道自己的作用,但是由于每个请求都会带上cookie,增加了数据传输量,而且随着交互的不断进行,cookie的体量可能越来越大。另外Cookie存储在客户端,有被篡改、盗取的风险,而Session的出现就是为了解决这个问题。

当用户首次打开某个Web应用时,服务器会为当前会话创建一个session,可以在session中存储用户状态信息。那当客户再次发起请求时,如何知道这个客户对应哪个session呢?每个session都已独一无二的sessionid,服务器创建完session后通过set-cookie,将sessionid放到cookie中返回给客户。当客户再次发起请求时,服务器就可以从cookie中获取到该客户对应的sessionid。

但是cookie可以被认为禁止,如果禁止使用cookie的话,session就无法工作了吗?

当然不是,我们还有其他机制让客户把sessionid传给服务器:

  1. URL重写,cookie被禁用的话,服务器仍会将sessionId以cookie的方式发送给浏览器,但是浏览器不会保存cookie。这时可以直接把sessionid附加在URL路径的后面。
  2. 表单隐藏字段, 服务器会自动修改表单,添加一个隐藏字段,以便在表单提交时能够把session id传递回服务器。

Token

Token,即令牌,在很多大型网站中都有所应用,比如 Facebook,Twitter,Google,Github 等等,比起传统的身份验证方法,Token 的扩展性更强,也更安全点,非常适合用在 Web 应用或者移动应用上。

一个简单的应用场景:用户输入密码登陆,服务器为该用户生成一个token,把token返回给用户。用户再次发起请求时,只需要带上这个token,服务端对该token进行验证,如果是合法的,说明这个用户已经登陆过,否则重定向到登陆页面。

一个简单的token可能会:uid、time、ip等信息组合到一起,然后使用加密算法加密生成一个字符串。这样服务器拿到用户传来的token,不仅可以验证用户的合法性,还能获得用户的uid。

参考资料

  1. https://www.jianshu.com/p/54c69103f245

  2. https://wuch886.gitbooks.io/front-end-handbook/content/session-cookiehe-token-san-zhe-de-guan-xi-he-qu-bie.html

  3. https://www.cnblogs.com/cxuanBlog/p/12635842.html

打赏
  • 版权声明: 本博客所有文章除特别声明外,著作权归作者所有。转载请注明出处!
  • Copyrights © 2021-2022 Yin Peng
  • 引擎: Hexo   |  主题:修改自 Ayer
  • 访问人数: | 浏览次数:

请我喝杯咖啡吧~

支付宝
微信