在知乎上回答过 Cookie 从哪里来,网站用它来干嘛? 这样一个问题,它只介绍了Cookie是什么。但作为一个职场多年,发现很多工作数年的同事,对Cookie对理解仍旧还不够。这才有了这篇文章,尝试从实用对角度来介绍Cookie。
1. Cookie和其他本地存储
最常见用到对本地存储除了Cookie之外,还有localStorage和sessionStorge,它们是客户端主动写,和Cookie主要由服务器写(set-cookie)有所不同。
localStorage和sessionStorge之间则存在着有效期、作用域的差别,可以参考:JavaScript权威指南 第20章 存储 的第1.2节。
2. 第一方和第三方Cookie
以打开 https://www.jianshu.com 为例,可以看到Cookies栏包含了来自 https://www.jianshu.com 和 https://googleads./g.doubleclick.net 的Cookie。
其中打开网址种的Cookie叫第一方Cookie,网址引用的资源(比如图片 js)所属服务器所种的Cookie叫第三方Cookie。第三方Cookie的一个应用,就是广告商用于分析用户数据,2020年Google已经在申明中湖i逐步取消第三方Cookie的权限。
3. Cookie怎么种上的
第二节中看到了jianshu种下了9个Cookie,查看 https://www.jianshu.com的Response,可以看到通过Set-Cookie,写了4个Cookie。
另外可以通过在请求中加载的JS代码中,看到setCookie的代码,可见jianshu也利用JS在本地设置了一些Cookie。
4. Cookie被使用的规则
一句话概括:Cookie被种哪里(文档+路径)下,发出这个规则的请求就会携带Cookie。
比如在 www.jianshu.com 下种了__yadk_uid
,那么访问https://www.jianshu.com/p/207585cb1bc5
的时候,就会携带这个Cookie。
而假如jianshu的服务器后端接口域名为api.jianshu.com
,那么上述Cookie就不会被携带,而.jianshu.com
种的sensorsdata2015jssdkcross
和sajssdk_2015_cross_new_user
就会被带上。
5. 关于Cookie的作用域和有效期
我们在一个浏览器tab上登陆了jianshu以后,在新的浏览器tab打开,肯定是不用再重新登陆的,也就是说作用域应该是文档+路径(为什么不说域名,后面会介绍)相关联的,只要还是这个文档+路径,就仍旧可以访问到这个Cookie。
通过第2节中的图片,我们看到又一栏叫Expires/Max-Age,也就是说Cookie的有效期是的服务器可以设定的,可以是具体实践,也可以是想session这样的。
6. 只有文档(页面)可以中Cookie吗
因为系统登陆是通过接口登陆的,在登陆成功后,很多后端实现会在Response中也通过Set-Cookie来往浏览器上写Cooike。
下图是一个例子,一个后端调用的Response中携带了Token信息,并且指定了对 eleme.test 域名起作用。
这里比较容易误解的一点是,如果你访问了a.com网站,如果它的后端地址是b.com并且Cookie也是种在这个地址上,那么直接通过浏览器对Application-Cookies中能看到的仅是和a.com相关的第一方和第三方的Cookie。
想查看b.com的Cookie,可以直接拷贝 b.com的地址在浏览器上访问,然后通过查看Network,就可以看到在b.com上的Cookie。
7. 关于Cookie的更多
JavaScript权威指南 第20章 存储 比较详细的介绍了Cookie,仅本篇文章还不足以介绍它的文档+路径的概念,有效期的设置,以及Secure、HttpOnly等的使用。
当然随着使用也会发现一些在你理解之外的东西,这里先归档如下,期望你来解答。
问题1: 设置Domain和服务器地址不一致
在实际观察中(如下图标记为3的位置),发现一个Domain中的地址可以和源文档没有任何关系,即网站是 a.b.com
,却可以设置Cookie在xyz.com
上,而不仅限于 a.b.com
或 .b.com
,这是为什么呢?岂不是可以随意覆写其他Domain的Cookie值?