一.理解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