面试中常被问到,cookie和session的区别是什么,token又是什么?
大家都知道cookie是存放在前端,session是存在后端的,token也是属于后端的,那它们到底有哪些区别呢?
一、Cookie
当用户登录一个网站时,Cookie的设置以及发送会经历以下4个步骤:
1、客户端发送一个登录HttpRequest请求到服务器(告知哪个用户);
2、服务器响应返回给客户端,其中包含了set-Cookie的头部(用户会话信息);
3、客户端保存Cookie之后再次向服务器发送请求时,该请求包含此Cookie;
4、服务器返回此用户响应数据;
Cookie的特点
1、cookie是在服务端创建;
2、cookie是保存在浏览器这一端;
3、cookie的生命周期可以设置,如果不设置生命周期,cookie的生命周期当浏览器关闭时就消亡;
4、cookie存放时候是以明文方式存放,因此安全性较低,可以通过加密后存放。
二、Session
session是存放在服务器端的,当浏览器第一次发送请求时,服务器自动生成了一个Session和一个Session ID用来唯一标识这个Session,并将其通过响应发送到浏览器。当浏览器第二次发送请求,会将前一次服务器响应中的Session ID放在请求中一并发送到服务器上,服务器从请求中提取出Session ID,并和保存的所有Session ID进行对比,找到这个用户对应的Session。
session的优点
1、可以是任何格式,存储量理论上是无限的,数据难以被获取、篡改、不易丢失;
2、可以不用声明就使用,且不用考虑它的释放问题;
session的缺点
1、session是存放在服务器的内存中,所以会占用服务器资源;
2、没有分布式架构,无法支持横向扩展;如果使用服务器集群,则需要一个统一的session数据库来保存会话数据实现共享,这样负载均衡下的每个服务器才可以正确的验证用户身份。维护和保存都不太方便;
3、若存放session的服务器或redis故障,则会导致所有用户登录失效;
三、Token
浏览器第一次访问服务器,根据传过来的唯一标识userId,服务端会通过一些算法,如常用的HMAC-SHA256算法,然后加一个密钥,生成一个token,然后通过BASE64编码一下之后将这个token发送给客户端;客户端将token保存起来,下次请求时,带着token,服务器收到请求后,然后会用相同的算法和密钥去验证token,如果通过,执行业务操作,不通过,返回不通过信息;
听起来token和session很像,那两者有什么区别?
1、token和session其实都是为了身份验证,session一般翻译为会话,而token更多的时候是翻译为令牌;
2、session需要保存,token不需要保存;session是空间换时间,而token是时间换空间!
简单理解就是:token只需要生成和验证就行,用CPU计算时间获取(节省)了session 存储空间!