关于cookie,session和token

一.理解HTTP“无状态”的含义

  我们知道,HTTP是一种无状态的协议,客户端与服务器建立连接并传输数据,数据传输完成后,连接就会关闭。

  举个栗子,如果在无状态情况下访问淘宝,会出现以下场景:

  1)打开淘宝的url,在这一步输入用户名和密码;

  2)在首页选择一样商品,点击进去,又提示需要重新登录。因为HTTP是无状态的,虽然在第1步中已经输入了用户名和密码,但我们的客户端不会记住上一步输入的用户名和密码,而服务器也不会记住已登录的状态;

  经过上述例子,我们可以把“无状态”理解为:不会对本次会话设置缓存区,来分别记录客户端和服务器在临时会话中产生的数据

  理解了HTTP无状态的含义,再去看cookie,session和token的概念。

二.cookie的概念

  Cookie是客户端保存用户信息的一种机制,仅仅是浏览器实现的一种数据存储功能。

  Cookie由服务器生成,发送给客户端的,客户端把cookie以kv形式保存到某个目录下的文本文件内,下一次请求同一网站时会把该cookie发送给服务器。由于cookie是存在客户端上的,所以浏览器加入了一些限制确保cookie不会被恶意使用,同时不会占据太多磁盘空间,所以每个域的cookie数量是有限的。

 

三、session

  Session是在服务器端保存的一个数据结构,用来跟踪用户的状态,这个数据可以保存在集群、数据库、文件中:

  

   

  1)客户端第一次请求服务器;

  2)服务器在内存中开辟一块空间,并返回Session ID;

  3)因为服务器需要记录用户状态,故在响应信息中包含一个SetCookie的响应头,要求客户端在Cookie中记录Seesion ID;

  4)客户端根据SetCookie中的响应头信息,将sessionID存储在Cookie中;

  5)再次请求服务器,客户端会在请求信息中携带Cookie请求头;

  6)服务器根据客户端携带的请求头进行用户身份、状态等较验。

四、token

  token是存储在客户端的令牌,一般用于身份校验。

   

  值得一提的是,在上述步骤②生成token时会加入有效期,而在步骤⑥解析token时,也会去判断token是否过期。

  步骤④存储token时,可以存储在cookie或者redis中。

  步骤⑤携带token时,可以在url中携带,也可以在post请求或http的header中携带。

五、session和token的区别

   1)token和session都用于身份验证,session是会话,token是令牌;

  2)身份认证 token的安全性要高于session,因为每个请求都有签名还能防止监听以及重放攻击,而session必须靠链路层来保障通讯安全。

  3)session和token都需要去管理过期时间。

HTTP“无状态”的解释:https://www.cnblogs.com/bellkosmos/p/5237146.html

cookie,session,token的概念:https://blog.csdn.net/lcgoing/article/details/86754955

https://www.zhihu.com/question/19786827/answer/28752144

猜你喜欢

转载自www.cnblogs.com/May-study/p/11649816.html