其实,在平时的项目当中,早就遇到过很多关于Cookie的疑惑,我们先来从cookie是什么开始说起吧:
Cookie是什么?
HTTP协议是一个无状态协议,即它不会对发送的请求和响应状态进行保存,上一次请求和下一次请求是不是来自于同一个用户,它根本无法识别。但是,在项目当中,我们希望浏览器能够保持登录状态、记住购物车中的物品和数量等等,这就需要用到Cookie。
cookie就是一种浏览器管理状态的一个文件。浏览器会存储set-cookie字段里面的信息,并在该请求之后的所有请求,都添加cookie头部信息将信息返回服务器。
Cookie原理
在看这张图的时候,一直有几个疑惑:
- 我在项目当中如何区分第一次请求?
- 为什么没有看到返回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属性
打开控制台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点击这里(链接待补充...)
常见问题FAQ
- 免费下载或者VIP会员专享资源能否直接商用?
- 本站所有资源版权均属于原作者所有,这里所提供资源均只能用于参考学习用,请勿直接商用。若由于商用引起版权纠纷,一切责任均由使用者承担。更多说明请参考 VIP介绍。
- 提示下载完但解压或打开不了?
- 找不到素材资源介绍文章里的示例图片?
- 模板不会安装或需要功能定制以及二次开发?
发表评论
还没有评论,快来抢沙发吧!