本文介绍Cookie、Session和Token的应用。
首先HTTP本身是一个无状态协议,为了进行会话保持和管理,就需要借助一些特定的数据方案。
Cookie
- HTTP Cookie(也叫 Web Cookie或浏览器 Cookie)是服务器发送到用户浏览器并保存在本地的一小块数据,它会在浏览器下次向同一服务器再发起请求时被携带并发送到服务器上。
- Cookie 保存在客户端(浏览器)。
- Cookie 可设置为长时间保持。
- 单个 Cookie 保存的数据长度有限制。
- Cookie只是实现session的其中一种方案。虽然是最常用的,但并不是唯一的方法。禁用cookie后还有其他方法存储,比如放在url中。
- 如果只用Cookie不用Session,那么账户信息全部保存在客户端,一旦被劫持,全部信息都会泄露。并且客户端数据量变大,网络传输的数据量也会变大。
Session
- Session 代表着服务器和客户端一次会话的过程。Session 对象存储特定用户会话所需的属性及配置信息。
- Session 保存在服务器端。
- Session 中可以保持一些常用变量信息,比如说 UserId 等。
- Session 一般失效时间较短。
- Session 可存储数据量远高于 Cookie。
- 用Session只需要在客户端保存一个id,实际上大量数据都是保存在服务端。
- Session存储于服务器,可以理解为一个状态列表,拥有一个唯一识别符号SessionId,通常存放于Cookie中。服务器收到Cookie后解析出SessionId,再去Session列表中查找,才能找到相应Session。
- 为每个用户分配一个唯一的标识符,即SessionID。它的存放形式无非两种,一是经过url传递,二是保存在客户端的cookie里。当然,session也可以保存在数据库中,安全性高,不过效率会变低。
Token
- Token 机制多用于 App 客户端和服务器交互的模式,也可以用于 Web 端做用户状态管理。
- Token 的认证方式类似于临时的证书签名, 并且是一种服务端无状态的认证方式, 非常适合于 REST API 的场景. 所谓无状态就是服务端并不会保存身份认证相关的数据。
- Token在客户端一般存放于localStorage,cookie,或sessionStorage中。在服务器一般存于数据库中。
- Token可以抵抗CSRF,Cookie+Session不行。
- Cookie会被浏览器自动添加到请求头中。但Token不同,Token是开发者为了防范CSRF而特别设计的令牌,浏览器不会自动添加到headers里,攻击者也无法访问用户的Token,所以提交的表单无法通过服务器过滤,也就无法形成攻击。
- Token类似一个令牌,无状态,用户信息都被加密到Token中,服务器收到Token后解密就可知道是哪个用户。需要开发者手动添加。
- 最简单的Token组成
uid(用户唯一的身份标识)、time(当前时间的时间戳)、sign(签名,由Token的前几位+盐以哈希算法压缩成一定长的十六进制字符串,可以防止恶意第三方拼接Token请求服务器)。还可以把不变的参数也放进Token,避免多次查库。