2019-02-18 · Develop

Cookie、Session和Token

在 Web 的发展中,我们知道浏览器和服务器之间采用 HTTP 协议进行通信,但是这个协议是无状态的,为了知道用户的状态,发展了很多的技术,其中常用又比较容易混淆的有三个 Cookie、Session 和 Token。这里对其进行下总结,如有理解偏差的地方,请指正。

Cookie 是浏览器中以 Key-Value 键值对的形式保存来保存的用户状态信息。数据通过请求头进行客户端和服务器间的传输。 Cookie 有以下的一些属性来控制其行为

cookie

Session

Session是另一种记录客户状态的机制,它是在服务端保存的一个数据结构。
用户第一次登录后,浏览器会将用户信息发送给服务器,服务器会为该用户创建一个SessionId,并在响应内容(Cookie)中将该SessionId一并返回给浏览器,浏览器将这些数据保存在本地。当用户再次发送请求时,浏览器会自动的把上次请求存储的Cookie数据自动的携带给服务器。
服务器接收到请求信息后,会通过浏览器请求的数据中的SessionId判断当前是哪个用户,然后根据SessionId在Session库中获取用户的Session数据返回给浏览器。

session

这里的 SessionId 保存在 Cookie 中,除了依赖 Cookie 外,也可以使用 URL重写,隐藏表单域等方式进行传递 SessionId。

Token

相较于前两个, token 一般用于短期的验证和跨域验证。Token是服务端生成的一串字符串,以作客户端进行请求的一个令牌。当客户端第一次访问服务端,服务端会根据传过来的唯一标识userId,运用一些算法,并加上密钥,生成一个Token,然后通过BASE64编码一下之后将这个Token返回给客户端,客户端将Token保存起来(可以通过数据库或文件形式保存本地)。下次请求时,客户端只需要带上Token,服务器收到请求后,会用相同的算法和密钥去验证Token。和 Cookie 进行比较就能很好的提现其跨域的能力

cookie-token

以上三张图片均来着 Google