cookie和session说白了就是前后端通信的两个工具,cookie存在于浏览器,session存在于服务端。
前后端通信,拿登录最为典型:
1.首先,前端若想登录,肯定要发送一个字段名证明是你啊,当然了肯定要发送ajax请求,携带信息传给后端。怎么证明是你,比如你是这个网站的会员,你是这个公司的员工,会员有用户名,员工有工号,这些都是证明是你的唯一标识,就拿工号把。如wokerID=123456。
2.然后正常的ajax请求登录接口,不管是get还是post请求(只是传参的位置url和请求体的不一样),带上这个workerID=123456,接着接口请求返回成功后,我们会拿到一个可以保持登录态的,以后访问任何接口都要携带的传给后端的token,那么这个token是怎么来的?
后端要做什么?
后端在接收到用户的请求后,会验证工号对不对,错的话,返回错误状态码和信息给前端,前端告知用户错了。对的话:
后端会通过散列算法或者别的什么算法生成一个签名,目的就是为了确保这个是唯一的,接着:
不管node还是php还是别的语言,都可以设置cookie,并把这个cookie的对应的值就是刚才通过算法得到的签名或者说是密钥。
注意:本质上服务端是无法操作cookie的,服务端是通过设置响应报文,浏览器根据响应报文自行设置的,所以cookie的设置还是浏览器自己的行为。
3.然后呢,因为上面说了,如果服务端设置了cookie,那么浏览器会自动把cookie存储起来,以后浏览器再发请求的时候,会自动携带上cookie(这是浏览器的默认行为,并且是放在请求头中),其实这是服务端传给后端token(也可以说是sessionID)的一种方式。
另一种方式:因为cookie容量比较小,只有4Kb,后端还可以通过前端登录接口请求,以响应内容的方式告诉前端(当然后端不设置cookie也可以这样,只不过前端可以自行拿到token存储在cookie中),前端呢就可以拿到返回来的token存储在localStorage中。
前端拿到这个token就相当于拿到了一个通行证,以后发送任何请求都要携带,证明是你发的,而不是别人随便就可以向后端请求,这也是安全性的一种表现。
前端层面如vue中可以在请求拦截器中统一在header中设置token,这样以后访问所有接口都会自动带上这个头信息,这也相当于后端设置cookie,浏览器自动设置存储,每次请求也是在请求头中自动携带一个道理。
4.最后,服务端在设置cookie的同时(上面说了,也可以不设置),也要设置session,这个session是干啥用的呢?
说白了就是建立与cookie一一对应的关系,那么多员工,那么多用户,怎么知道谁是谁?
php中会自动生成一个返回给前端同名的sessionID(如果是以接口返回那就叫token)文件。
node中也会生成一个文件。存储用户信息。
所以,当不同的用户登录或者请求的时候,服务端就会自动去寻找同名的sessionID文件(token)看是否与前端发来的一致。如果对上号了,就可以接着下面的接口请求,该怎样就怎样了。
直到token被清除掉,登录态就没有了。