本文作者: jsweibo
本文链接: https://jsweibo.github.io/2019/10/06/%E4%BB%80%E4%B9%88%E6%98%AF%E7%AC%AC%E4%B8%89%E6%96%B9cookie/
摘要
本文主要讲述了:
- 什么是第三方 cookie
- 浏览器端的 JavaScript 仅能读写部分第一方 cookie
- 如何写入第三方 cookie
- 浏览器端禁用第三方 cookie
正文
注意:本文所说的domain
以 Chrome 浏览器中控制台里明文存储的为准
什么是第三方 cookie
即跨站 cookie。
是否是第三方 cookie 基于”Public Suffix List”判断。
第一方 cookie 示例:
domain=a.example.com
的 cookie 是a.example.com
的第一方 cookiedomain=b.example.com
的 cookie 是a.example.com
的第一方 cookiedomain=example.com
的 cookie 是a.example.com
的第一方 cookiedomain=.a.example.com
的 cookie 是a.example.com
的第一方 cookiedomain=.b.example.com
的 cookie 是a.example.com
的第一方 cookiedomain=.example.com
的 cookie 是a.example.com
的第一方 cookiedomain=a.github.io
的 cookie 是a.github.io
的第一方 cookie
第三方 cookie 示例:
domain=a.foo.com
的 cookie 是a.example.com
的第三方 cookiedomain=b.foo.com
的 cookie 是a.example.com
的第三方 cookiedomain=foo.com
的 cookie 是a.example.com
的第三方 cookiedomain=.a.foo.com
的 cookie 是a.example.com
的第三方 cookiedomain=.b.foo.com
的 cookie 是a.example.com
的第三方 cookiedomain=.foo.com
的 cookie 是a.example.com
的第三方 cookiedomain=b.github.io
的 cookie 是a.github.io
的第三方 cookiedomain=github.io
的 cookie 是a.github.io
的第三方 cookie
浏览器端的 JavaScript 仅能读写部分第一方 cookie
由于”同源政策 + Public Suffix List”的限制,浏览器端的 JavaScript 仅能读写部分第一方 cookie。
注意:cookie 的读写并未完全遵循同源政策。例如:
- 允许
a.example.com
读写domain=.example.com
的 cookie - 允许
https://a.example.com
读写http://a.example.com
的 cookie,反之亦然 - 允许
http://a.example.com:81
读写http://a.example.com:80
的 cookie
示例:
允许
example.com
读写domain=.example.com
的 cookie(document.cookie = "jsweibo=123;domain=example.com";
)允许
example.com
读写domain=example.com
的 cookie(document.cookie = "jsweibo=123";
)禁止
example.com
读写domain=.a.example.com
的 cookie(document.cookie = "jsweibo=123;domain=a.example.com;"
)禁止
example.com
读写domain=a.example.com
的 cookie(无法编写对应的 JavaScript 脚本)允许
a.example.com
读写domain=.example.com
的 cookie(document.cookie = "jsweibo=123;domain=example.com";
)禁止
a.example.com
读写domain=example.com
的 cookie(无法编写对应的 JavaScript 脚本)允许
a.example.com
读写domain=.a.example.com
的 cookie(document.cookie = "jsweibo=123;domain=a.example.com";
)允许
a.example.com
读写domain=a.example.com
的 cookie(document.cookie = "jsweibo=123";
)禁止
a.example.com
读写domain=.b.example.com
的 cookie(document.cookie = "jsweibo=123;domain=b.example.com";
)禁止
a.example.com
读写domain=b.example.com
的 cookie(无法编写对应的 JavaScript 脚本)
如何写入第三方 cookie
需满足以下所有条件:
- 必须引用来自第三方的资源文件(例如:HTML 文件、CSS 文件、JavaScript 文件、图片文件等)
- 必须在第三方的服务器端通过
Set-Cookie
指令写入 cookie
注意:也可以通过 Ajax 进行跨源请求来满足第一点条件,但需要进行额外的配置。
浏览器端禁用第三方 cookie
主流的浏览器(例如:Chrome、Firefox、Edg、IE 等)均支持禁止第三方 cookie 的选项,但默认情况下都是关闭的。
如果用户手动开启此选项,那么浏览器在接收到第三方服务器端返回的Set-Cookie
响应头时,将拒绝写入 cookie。
参考资料
本文作者: jsweibo
本文链接: https://jsweibo.github.io/2019/10/06/%E4%BB%80%E4%B9%88%E6%98%AF%E7%AC%AC%E4%B8%89%E6%96%B9cookie/
本文对你有帮助?请支持我
- 本文链接: https://jsweibo.github.io/2019/10/06/%E4%BB%80%E4%B9%88%E6%98%AF%E7%AC%AC%E4%B8%89%E6%96%B9cookie/
- 版权声明: 除非另有说明,否则本网站上的内容根据署名-非商业性使用-相同方式共享 4.0 国际 (CC BY-NC-SA 4.0) 进行许可。