与Cookie有关的疑问

其实,在平时的项目当中,早就遇到过很多关于Cookie的疑惑,我们先来从cookie是什么开始说起吧:

Cookie是什么?

HTTP协议是一个无状态协议,即它不会对发送的请求和响应状态进行保存,上一次请求和下一次请求是不是来自于同一个用户,它根本无法识别。但是,在项目当中,我们希望浏览器能够保持登录状态、记住购物车中的物品和数量等等,这就需要用到Cookie。

cookie就是一种浏览器管理状态的一个文件。浏览器会存储set-cookie字段里面的信息,并在该请求之后的所有请求,都添加cookie头部信息将信息返回服务器。

Cookie原理

image.png

在看这张图的时候,一直有几个疑惑:

  • 我在项目当中如何区分第一次请求?
  • 为什么没有看到返回set-cookie的请求?
  • set-cookie这个行为是客户端的意图还是服务器的意图呢?

当我打开项目中的登录页面的时候,发现有一个login的请求,原来set-cookie在这个请求当中,cookie的意图就很明显了。

客户端的意图是想要服务端记住自己的用户信息,通过登录接口向服务器提供用户名、密码等信息(第一次请求),服务端通过识别此次接口,意识到客户端想要自己记住某些信息,通过set-cookie字段将登录信息返回给客户端。

接下来,客户端发送的所有请求都会携带cookie字段,以证明自己的身份(避免重复登录)。

Cookie的限制

Cookie是绑定在某一个域名上的。当设定了一个cookie时,再给创建它的域名发送请求时,就会包含这个cookie。

例:当其中一个cookie的domain:.baidu.com(表示此cookie对baidu.com的所有二级域名都有效),那我访问xx.baidu.com的时候,都会携带此cookie。

应用:可以实现一级域名下所有的网站共用同一个登录态。

疑惑:一些cookie的expires(过期时间)为session,表示回话结束就删除cookie,为什么关掉浏览器还是会保存此cookie?

cookie的expires(过期时间)为session,表示在浏览器关闭之后就将cookie删除,但是chrome浏览器会默认保存cookie,需要设置“退出 Chrome 时清除 Cookie 及网站数据”,退出浏览器之后所有的cookie信息都会被删除。

Cookie属性

屏幕快照 2021-04-27 上午10.02.25.png

打开控制台Application中的cookies,就可以看到各个cookie字段的属性。

Name

cookie的名字,同一个域名下的cookie的名字不能相同,不然会被覆盖掉。

场景:同一个域名下用同一个登录态,a.baidu.com切换账号,b.baidu.com的登录态也会随之改变。

Value

表示cookie的值,由于cookie规定是名称/值是不允许包含分号,逗号,空格的,所以为了不给用户到来麻烦,考虑服务器的兼容性,任何存储cookie的数据都应该被编码。

Domain

表示该cookie被绑定到某一个域名下,只要访问该域名,就会携带该cookie。
.baidu.com对于baidu.com的所有子域名都有效。但是相同一级域名下的不同二级域名之间是不能相互交换cookie的,比如domain为a.baidu.com下的cookie与domain为b.baidu.com下的cookie是不能共用的。

Path

对于指定域名下的某一个路径,发送该cookie,其他路径则不发送。

默认为‘/’,对于该域下的所有路径都使用该cookie。

可指定某一个cookie只有路径为 baidu.com/path/ 的时候才可发送。

Expires

该cookie的到期时间。默认情况下,cookie会在会话结束后就被删除,但是也可以设置成就算浏览器关闭也依然保存在浏览器内存中。

除了代码中设置的过期时间,cookie的保存还会收到浏览器自定义设置的影响。上文有提到。

Secure

在此字段为true时,表示该cookie只有在使用https访问的时候才会发送。

例:cookie只会发送给xxx.baidu.com 而不会发送给 xxx.baidu.com

HttpOnly

此字段设置为true时,表示该cookie不能通过js去获取(document.cookie),可以有效的防止xss(跨站脚本攻击)。

SameSite

由于之前在项目当中遇到过关于SameSite的问题,这里决定详细的说一下这个字段。

SameSite点击这里(链接待补充…)

© 版权声明
THE END
喜欢就支持一下吧
点赞0 分享