什么是第三方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/

摘要

本文主要讲述了:

  1. 什么是第三方 cookie
  2. 浏览器端的 JavaScript 仅能读写部分第一方 cookie
  3. 如何写入第三方 cookie
  4. 浏览器端禁用第三方 cookie

正文

注意:本文所说的domain以 Chrome 浏览器中控制台里明文存储的为准

即跨站 cookie。

是否是第三方 cookie 基于”Public Suffix List”判断。

第一方 cookie 示例:

  • domain=a.example.com的 cookie 是a.example.com的第一方 cookie
  • domain=b.example.com的 cookie 是a.example.com的第一方 cookie
  • domain=example.com的 cookie 是a.example.com的第一方 cookie
  • domain=.a.example.com的 cookie 是a.example.com的第一方 cookie
  • domain=.b.example.com的 cookie 是a.example.com的第一方 cookie
  • domain=.example.com的 cookie 是a.example.com的第一方 cookie
  • domain=a.github.io的 cookie 是a.github.io的第一方 cookie

第三方 cookie 示例:

  • domain=a.foo.com的 cookie 是a.example.com的第三方 cookie
  • domain=b.foo.com的 cookie 是a.example.com的第三方 cookie
  • domain=foo.com的 cookie 是a.example.com的第三方 cookie
  • domain=.a.foo.com的 cookie 是a.example.com的第三方 cookie
  • domain=.b.foo.com的 cookie 是a.example.com的第三方 cookie
  • domain=.foo.com的 cookie 是a.example.com的第三方 cookie
  • domain=b.github.io的 cookie 是a.github.io的第三方 cookie
  • domain=github.io的 cookie 是a.github.io的第三方 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 脚本)

需满足以下所有条件:

  1. 必须引用来自第三方的资源文件(例如:HTML 文件、CSS 文件、JavaScript 文件、图片文件等)
  2. 必须在第三方的服务器端通过Set-Cookie指令写入 cookie

注意:也可以通过 Ajax 进行跨源请求来满足第一点条件,但需要进行额外的配置。

主流的浏览器(例如: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/


本文对你有帮助?请支持我


支付宝
微信