Cookie 、 Session 和 Token 又是作为什么原因出现呢?

_Octocat
  • 8

Cookie 和 Session 有什么本质区别呢?Token 又是作为什么原因出现呢?

回复
阅读 430
4 个回答
✓ 已被采纳

回话是围绕一件相关事情所进行的请求与响应,其中需要一定的数据传递,即是需要进行回话状态跟踪的。

然而http协议是一种无状态协议,在不同请求间无法数据传递。因此次诞生cookie

cookie是为了实现浏览器和服务器状态的记录,用于在提交一次请求后,有服务端生产cookie并封装到响应头发送给客户端,客户端收到cookie并保存进客户端。客户端再次发送同类请求会携带保存的cookie,然后服务器进行跟踪

但是cookie并非完美。cookie体积过大,可以在前后端进行修改,数据容易被篡改和伪造。为了解决cookie敏感数据的问题,seession应运而生。session的数据只保留在服务端。

对于session来说,服务器是有状态的,在分布式部署服务时,需要共享服务器之间状态,总不能让用于不停地重复登录吧。token解决了此问题,token也称作令牌,它将状态保存在客户端,采用加密算法保证安全性

https://www.zhihu.com/questio...

不太同意楼上的说法

  1. cookie 也是存在 header 里,虽然会有跨域问题,但可以通过增加header 协商来允许跨域
  2. session 是服务端,通过cookie 里的 sessionid 关联,哪有什么跨域的概念
  3. token 放在 header 里,仍然会有跨域问题,还是需要 allow header来解决

token 一般用两种用法:

  1. 和 cookie 机制相同,服务端不用 session 的机制,自己实现 token -> data 的数据存储,优点是相比cookie/session来说比较轻量(不过轻量的代价就是功能少,非标准接口)
  2. jwt 这种,纯前端存储,token中包含了完整的认证信息,对于服务端来说是无状态的,服务端无压力

综上,无状态(stateless)的token有意义,但服务端不可控;有状态的token只有一个轻量的优点

cookie :存储在客户端,也就是浏览器中,并且有大小限制
session:存储在服务端,没有大小限制
但是以上两种都会有跨域的限制
而token的出现就是为了解决跨域的问题,将认证信息经过加密后放在header中

黄枫谷有一片地肺火脉,修仙者都可以来炼丹,没有任何限制,唯一的限制是火脉的容量和同时炼丹的修仙者数量。这是原始http。

后来有一波修仙者把黄枫谷占为己有,开宗立派,规定只有注册的本派弟子可以使用,再给内门弟子和外门弟子分配不同等级的炼丹房,这是用户鉴权。
散修只能在外围吃些门内弟子流出的残羹冷炙,这是匿名用户。

炼丹房管事发现每次有弟子来或者临时进出,都要去藏经阁查名册太麻烦了,就在第一次查证符合后,给弟子一块腰牌,这个腰牌上有弟子的名字相貌,下次进入就不用查名册了,方便进出。一般还会给这个牌子加一个有效时间,防止有人调换腰牌。这是cookie。

再后来,有些散修学会了伪造腰牌,经常能混进来。炼丹房管事只好改进他的认证方法,查证名册后不再给弟子发放腰牌,而是改成一道符纸,它有特殊的纹路,弟子的名称相貌记录在另外一张有同样纹路的符纸上,由管事自己保存。以后弟子进出的时候他只要比对一下符纸就好了。这是session。

后来一韩姓弟子改良了筑基丹方,筑基丹产量激增,炼丹房开始对外售卖成丹,引得不少弟子前来购买。与黄枫谷交好的其他五大派眼馋不已,联手逼迫黄枫谷将年产量的三层拿出来售卖给其他派弟子。
炼丹房管事工作量剧增,他要给每个购丹人制作一对符纸,哪怕他们很多只是过来打个转并不久留。还有外派弟子,查证他们的信息是比较麻烦的。管事殚精竭虑之下,发明了一种新的方法,把腰牌和符禄结合在一起,先把六大派弟子的信息封印在里面,再以自己的本源气息把它画成符禄,变成外面的一层封印,他管这种东西就叫令牌。

令牌通过正规渠道发出去之后,就什么也不用管了,以后有人持令牌来购丹,就按照里面的修仙者信息画一道符禄,如果跟外层的封印对不上,那这令牌就是伪造的。

当然,后来某韩姓修仙者仗着神识强大,抢夺破解了不少这种令牌,这就是后话了。

你知道吗?

宣传栏