浅谈session,token和cookie的区别与联系

发布于 2021-03-29  282 次阅读


前阵子纠结了很久这三样东西的关系,最近大约的确是理顺了,现在写这篇帖子,若是以后忘记了可以及时查阅。

历史遗留问题

这三样东西的出现都是因为某种历史遗留问题,即:HTTP是无状态协议。在很早以前,查阅网站功能还不如现在丰富,所以每次建立连接后就是一个新的HTTP,服务器也不需要记住用户信息,反正用户看完就直接关掉了。

但是随着技术的发展,越来越多的网上服务兴起,如电商等平台,他们需要记住用户的信息,一遍区分开不同用户,因此就需要一个标记符号来进行区分,这就是最早的session(字面意思:维持一个会话)。

而session,token和cookie(大体上)都是与维持会话这个功能息息相关的。

Session

session从字面意思上来说就是会话,它的作用就是维持会话。打个比方说,当你和别人聊天的时候,要有一些诸如声音,口音之类的特征来辨别你在和谁对话,而session就是我们服务器手动添加的一个特征。

session会被服务器生成,并被存储在服务器本地。并通过HTTP中的set-cookie字段以key-value对的形式发给客户。每次客户进行访问的时候,将自己的session发给服务器,服务器将其与本地信息进行比对,便可以知道是哪个用户在对其进行访问了。

通常情况下,用户断开连接后session就会销毁。

并且,随着用户数量的发展,许多厂商进行了负载均衡部署,这时候,如果session只存在一个服务器里面,就很容易出现用户突然无法登录的情况,如果存在所有的服务器上,则会消耗大量的资源(况且就算只有一个服务器,在用户多的情况下,服务器也会存储大量的用户信息资源,造成极大浪费)。

Token

为了解决上述问题,Token被引入了。类似于许多其他的验证机制,Token会对用户信息进行一个散列(类似的还有各种数字签名),并将散列后的值,通过HTTP的set-cookies字段传给客户,客户存在自己本地,而服务器不需要进行任何存储。

由于单向散列函数基本上无法逆推(虽然存在很小的哈希碰撞的可能性),所有这种方法是较为安全的。

每次用户发起请求的时候,都会把cookie中的token以key-value的形式发给服务器,服务器会根据用户信息,再次进行一次散列计算,并与用户发来的信息进行比对。如果比对成功,则说明用户是本人;若比对失败,则说明信息被篡改,用户不能登录。

Cookie

cookie就是一种用于辨别用户身份的文本文件,通常被存储在客户本地,上文的Session和Token都是通过cookie的方式储存在用户本地并实现验证的。


你好哇!欢迎来到雷公马碎碎念的地方:)