广西壮族自治区市场监督管理局官网网站推广优化招聘
一、cookie是用来解决什么问题的?
假如现有业务需求:当浏览器发起一个url请求之后,在一个会话周期内,服务端需要判断这个用户是否第一次发起请求,第一次请求展示的页面跟第N次请求需要响应的页面不同的。现在我们大部分请求使用的都是http协议,而http协议是无状态的,用户发起请求之后服务端无法根据已知信息判断是否第一次请求,而做出正确的响应,这时,cookie就出现了。
当用户在浏览器发起第一次请求之后,服务端做出响应,在响应头返回set-cookie的值key=value(任何浏览器都是支持的)。当用户再次在浏览器发起请求时,这次请求的请求头会带着之前返回的cookie发送给服务端。若服务器后续需要更新这个状态,同理可以在后续的响应头里面设置set-cookie,将key=value进行更新和扩充,都是可以的。
虽然服务器使用的http协议本身不支持状态,但是服务端把需要的状态以cookie的形式返回给了浏览器,让浏览器帮忙用cookie把这个请求会话做一个标记,然后把它的状态在后续的请求里面原封不动的返回,那么服务端对于整个的这个session会话就有了一个状态。
以上便是cookie的由来。
cookie的局限性:首先cookie是明文,cookie的这个规范是每个懂开发的可以看到获取到的,相当于泄露了很多后台管理的一些状态,是有一定的安全问题的;其次,有些企业为了安全性,会在浏览器把cookie给禁掉,那么依靠cookie的一些功能就失效了。
二、session
在浏览器打开一个页面和关掉期间跟服务端进行一系列的交互就是一个session会话。基于以上cookie的局限性,会有一个新的方案,就是服务端将这些信息保存在后台,然后将这些信息的状态的id也就是说session-id放在set-cookie中返回给浏览器,这时在浏览器端保存的只是一个session-id,没有任何实质性的key-value信息,很大程度避免了信息的泄露。
session的局限性:若服务是多地部署的,第一次请求是地点A的服务器响应的,第二次请求时,服务器A有点忙,由地点B的服务器响应,这个时候服务器B只拿到了一个session-id,对应的状态还需要去服务器A上面查,那么就造成了很多性能的开销。(session-id可以存在redis中避免多地部署的问题)
三、token
目前,前后端分离技术越来越普遍,前后端数据交互就用到了json这种数据格式。
token不是一个标准协议的一部分,只是前后端自己去协商定义的。后端可以把上下文的状态打包成一个加密token,存在浏览器。浏览器给服务端发送请求时,就带着这个token,后端接收到带着token的请求之后,解包之后就可以拿到token的内容。