Session 和 Token

Cookie 、Session 和Token

Cookie、Session和Token是当下互联网的两个非常重要的东西

起源

众所周知,http协议是无状态的,每个http请求(http 1.0)从浏览器发起请求到服务器处理完请求后,就结束了,客户端和服务器的TCP链接就断开了。一个网站服务器程序是要服务很多用户的,每天要处理非常多的这种http请求,其中每个人又会发很多这种请求,那么服务器程序如何识别哪些请求是来自与同一个用户呢,是否可以每个请求带上一些玩家的特征信息呢?答案是,对的,这就是今天要讲的主题了,Cookie、Seesion和Token。

cookie是http协议的一部分,服务器程序回应客户端的http请求时,依据http协议规范可以向客户端的cookie写入内容。相应的客户端浏览器每次给服务器程序发请求时候,请求内容都会携带cookie内容

Session

用户登录成功后,浏览器和服务器就建立了一条会话,再接下来的交互中就不用再去验证用户的帐号密码了。具体实现就是,服务器程序对密码检验成功后就给浏览器的cookie中设置了Session-key和Session-info(可以包含一些用户信息,比如用户id之类的),同时设置cookie的Max-Age,即过期时间。这样子的话,服务器程序处理http请求的时候,先去http中带上来的cookie中找Session信息,如果没有则该用户没有登录,则返回未登录的内容给他,如果有信息,则取出用户信息,根据用户信息返回相应的内容给他。

当然实际情况并没有这么简单,因为存在cookie中的内容是很容易获取的,所以为了安全性,会把Session-info放在服务器上,而不是放到客户端浏览器的cookie中,这样子的话,cookie中只有一个Session-key,每次服务器程序收到http请求后会拿出cookie中的Session-key去索引对应的Session-info。常见的做法是把Session-info存到redis中,这样存取效率高。

为了提高安全性,防止Session-key被破解出来,可以再在cookie中设置一个Session-key的签名Session-key.sig字段,当服务器程序收到http请求后,就去用相应的算法计算Session-key的签名,然后比较是否和Session-key.sig一致,不一致则说明Session-key被篡改过,则本次请求无效。

由上可知,如果被不法分子盗取(不管是劫网络包还是xss等行为)了cookie中的这些值,那么还是会不安全。可以使用https来防止劫持行为。

Token

Token有点类似Session的机制。玩家登录成功后,服务器程序会根据某种算法生存一个Token值(字符串)和一些Token信息(用户id,过期时间,是否有效)等等,以Token为主键存到数据库中或Redis中,然后设置Token到cookie中。当有http请求时,服务器程序则把Token从cookie中取出,然后用Token去索引Token信息、检验是否过期,校验通过后,拿着用户id去处理后面的流程。

Session和Cookie区别

  1. 安全性:使用Cookie来保存状态信息的话,容易被篡改,而Session机制,状态信息可以存放在服务器,更安全
  2. 储存容量性质:Cookie有最大容量上限,所以储存不了太多状态信息,而Session机制则可无限存储

虽然Session优点更多,但是实际使用时候,不要把所有信息都存Session,因为这样子会增加服务器压力,建议把登录相关的重要信息放在Session,其他信息放在Cookie中

Session 和 Token

其实Session和Token总体上还是很相似的,但是也有以下区别:
1. 过期时间:Session的过期时间存在cookie的Max-age字段,Token的过期时间存在服务器
2. 使用范围:Session-key的储存依赖cookie机制,不能脱离浏览器;而Token可以不依赖cookie,哪怕是在get/post请求的参数中带上来都可以,所以很多第三方的登录\支付等API接口都是用Token这种机制

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章