http|Cookie、Session和Token的区别与联系

以下是本人的一些笔记,助于理解概念,并不详细,详细内容可以参考文中提供的链接。
一、HTTP的无状态性 HTTP是无状态协议,它不对之前发生过的请求和响应的状态进行管理。也就是说,无法根据之前的状态进行本次的请求处理。
假设要求登录认证的Web页面本身无法进行状态的管理(不记录已登录的状态),那么每次跳转新页面不是要再次登录,就是要在每次请求报文中附加参数来管理登录状态。
不可否认,无状态协议当然有它的优点。由于不必保存状态,自然可减少服务器的CPU及内存资源的消耗。从另一个角度来讲,也正是因为HTTP协议本身是非常简单的,所以才会被应用在各种场景里。
二、Cookie 保留无状态协议这个特征的同时又要解决类似的矛盾问题,于是引入了Cookie技术。
Cookie技术通过在请求和响应报文中写入Cookie信息来控制客户端的状态。Cookie会根据从服务器端发送的响应报文内的一个叫做Set-Cookie的首部字段信息,通知客户端保存Cookie。当下次客户端再往该服务器发送请求时,客户端会自动在请求报文中加入Cookie值后发送出去。
服务器端发现客户端发送过来的Cookie后,会去检查究竟是从哪一个客户端发来的连接请求,然后对比服务器上的记录,最后得到之前的状态信息。
cookie的特点:

  • cookie 存储在客户端。 cookie 是服务器发送到用户浏览器并保存在本地的一小块数据,它会在浏览器下次向同一服务器再发起请求时被携带并发送到服务器上。
  • cookie 是不可跨域的。 每个 cookie 都会绑定单一的域名,无法在别的域名下获取使用,一级域名和二级域名之间是允许共享使用的(靠的是 domain)。
关于Cookie的更多内容可以查看:https://developer.mozilla.org/zh-CN/docs/Web/HTTP/Cookies
三、Session Session是另一种记录客户状态的机制,不同的是Cookie保存在客户端浏览器中,而Session保存在服务器内存中(也可以保存在redis中,便于集群共享使用)。
严格来说,Session并非属于http协议中的内容,Session是web开发里一个重要的概念,但它们之间相互联系。
一般情况下,
  • 当浏览器第一次请求Session对象时,服务器会创建一个Session,并通过算法得出一个SessionID,用来标识该Session对象,然后将SessionID放置在Set-Cookie的首部字段中返回给客户端。
  • 浏览器下次发请求的时候,这个SessionID会被放置在请求头中,和Cookie一起发送回来,服务器再根据SessionID找到之前创建的Session对象,提供给请求使用,也就是服务器会通过Session保存一个状态记录。
四、Cookie与Session 一般而言,Cookie和Session是混合使用的。Session的实现常常依赖于Cookie机制,通过Cookie机制回传SessionID。
Cookie与Session的区别:
  1. 安全性: Session 比 Cookie 安全,Session 是存储在服务器端的,Cookie 是存储在客户端的。
  2. 存取值的类型不同:Cookie 只支持存字符串数据,想要设置其他类型的数据,需要将其转换成字符串,Session 可以存任意数据类型。
  3. 有效期不同: Cookie 可设置为长时间保持,比如我们经常使用的默认登录功能,Session 一般失效时间较短,客户端关闭(默认情况下)或者 Session 超时都会失效。
  4. 存储大小不同: 单个 Cookie 保存的数据不能超过 4K,Session 可存储数据远高于 Cookie,但是当访问量过多,会占用过多的服务器资源。
五、Token Cookie与Session机制可以解决http协议的无状态问题,但是,如果客户较多,服务端保存的session数据就会很多,也就需要花费大量的内存来保存session。
为了解决这个问题,可以将相关信息保存在客户端,但对相关信息进行加密,而服务端只需要在获取到请求时解密就可以直接得到信息内容,而无需进行查询,这样就解决了内存消耗大的问题,这本质上是一种以时间换空间的策略,而这种策略就是Token机制。
Token机制有现成的解决方案,即Json Web Token。
5.1、Json Web Token
Json Web Token 的简称就是 JWT,通常可以称为 Json 令牌。它是RFC 7519 中定义的用于安全的将信息作为 Json 对象进行传输的一种形式。JWT 中存储的信息是经过数字签名的,因此可以被信任和理解。可以使用 HMAC 算法或使用 RSA/ECDSA 的公用/专用密钥对 JWT 进行签名。
【http|Cookie、Session和Token的区别与联系】关于jwt的内容,具体可参考https://jwt.io/introduction/
六、参考
  • 看完这篇 Session、Cookie、Token,和面试官扯皮就没问题了
  • 前端鉴权的兄弟们:cookie、session、token、jwt、单点登录
  • 你真的了解 Cookie 和 Session 吗
  • 详解 Cookie,Session,Token
  • 干掉状态:从session到token

    推荐阅读