cookies

允许扩展程序获取、设置和移除 cookie,并在 cookie 发生更改时收到通知。

Permissions

要使用此 API,扩展程序必须在其 manifest.json 文件中指定 "cookies" API 权限,并为想要访问其 cookie 的任何网站指定 主机权限。扩展程序可以获取、设置或移除任何可以通过匹配主机权限的 URL 读取、写入或删除的 cookie。例如:

http://*.example.com/

拥有此主机权限的扩展程序可以:

  • 读取 www.example.com 的非安全 cookie,路径不限。
  • 写入 www.example.com 的安全或非安全 cookie,路径不限。

不能

  • 读取 www.example.com 的安全 cookie。
http://www.example.com/

拥有此主机权限的扩展程序可以:

  • 读取 www.example.com 的非安全 cookie,路径不限。
  • 读取 .example.com 的非安全 cookie,路径不限。
  • 写入 www.example.com 的安全或非安全 cookie,路径不限。
  • 写入 .example.com 的安全或非安全 cookie,路径不限。

不能

  • 读取或写入 foo.example.com 的 cookie。
  • 读取或写入 foo.www.example.com 的 cookie。
*://*.example.com/

拥有此主机权限的扩展程序可以:

  • 读取或写入 www.example.com 的安全或非安全 cookie,路径不限。

跟踪保护

跟踪器使用第三方 cookie,即由非您当前访问的网站设置的 cookie,来识别您访问过的网站。例如:

  1. 您访问 a-shopping-site.com,该网站使用 ad-tracker.com 在网上投放广告。ad-tracker.com 会设置一个与 ad-tracker.com 域名关联的 cookie。当您在 a-shopping-site.com 上时,ad-tracker.com 会收到您浏览过的产品信息。
  2. 现在您访问 a-news-site.com,该网站使用 ad-tracker.com 投放广告。ad-tracker.com 读取其 cookie,并利用从 a-shopping-site.com 收集的信息来决定向您展示哪些广告。

Firefox 包含两项防止跟踪的功能:动态分区第一方隔离。这些功能会分隔 cookie,使跟踪器无法将访问的网站联系起来。因此,在前面的示例中,ad-tracker.com 无法看到在访问 a-shopping-site.com 时在 a-news-site.com 上创建的 cookie。

从 Firefox 103 开始,动态分区是默认使用的功能。但是,如果用户或扩展程序启用了第一方隔离,它将优先于动态分区。

注意:当隐私浏览使用动态分区时,普通浏览可能不会对 cookie 进行分区。有关详细信息,请参阅 Firefox 中分区状态

存储分区

在使用动态分区时,Firefox 会根据顶级网站对 JavaScript API 可访问的存储进行分区,同时提供对未分区存储的适当访问以支持常见用例。此功能正在逐步推出。有关实现详细信息,请参阅 Firefox 中分区状态

存储分区由顶级网站的模式化 URL 键入,并且当动态分区处于活动状态时,该键值可通过 cookie API 中的 partitionKey.topLevelSite 属性访问,例如 partitionKey: {topLevelSite: "http://site"}

通常,顶级文档存储在未分区的存储中,而第三方 iframe 存储在分区的存储中。如果无法确定分区键,则使用默认值(未分区存储)。例如,虽然所有 HTTP(S) 网站都可以用作分区键,但 moz-extension:- URL 不能。因此,Firefox 扩展文档中的 iframe 不使用分区存储。

默认情况下,cookies.get()cookies.getAll()cookies.set()cookies.remove() 会处理未分区存储中的 cookie。要在这些 API 中处理分区存储中的 cookie,必须设置 partitionKey 中的 topLevelSite。唯一的例外是 getAll,其中设置 partitionKey 而不设置 topLevelSite 会返回分区和未分区存储中的 cookie。cookies.onChanged 会针对扩展程序可以访问的任何 cookie(包括分区存储中的 cookie)触发。为确保正确修改 cookie,扩展程序应读取事件中的 cookie.partitionKey 属性,并将其值传递给 cookies.set()cookies.remove()

第一方隔离

启用第一方隔离后,cookie 将根据用户访问的原始页面的域进行限定(基本上是用户在 URL 栏中看到的域,也称为“第一方域”)。

用户可以通过调整浏览器配置来启用第一方隔离,扩展程序也可以通过 privacy API 中的 firstPartyIsolate 设置来启用它。请注意,第一方隔离在 Tor Browser 中是默认启用的。

cookies API 使用 firstPartyDomain 属性来表示第一方域。在启用第一方隔离时设置的所有 cookie 都有此属性设置为原始页面的域。在前面的示例中,一个 cookie 是 a-shopping-site.com,另一个是 a-news-site.com。当第一方隔离关闭时,网站设置的所有 cookie 的此属性都将设置为一个空字符串。

cookies.get()cookies.getAll()cookies.set()cookies.remove() API 都接受 firstPartyDomain 选项。

当第一方隔离开启时,您必须提供此选项,否则 API 调用将失败并返回一个被拒绝的 Promise。对于 get()set()remove(),您必须传递一个字符串值。对于 getAll(),您也可以在此处传递 null,这将获取所有 cookie,无论它们是否具有非空 firstPartyDomain 值。

当第一方隔离关闭时,firstPartyDomain 参数是可选的,默认为空字符串。可以使用非空字符串来检索或修改第一方隔离 cookie。同样,将 null 作为 firstPartyDomain 传递给 getAll() 会返回所有 cookie。

类型

cookies.Cookie

表示有关 HTTP cookie 的信息。

cookies.CookieStore

表示浏览器中的 cookie 存储。

cookies.OnChangedCause

表示 cookie 更改的原因。

cookies.SameSiteStatus

表示 cookie 的同站状态。

方法

cookies.get()

检索单个 cookie 的信息。

cookies.getAll()

检索与给定过滤器集匹配的所有 cookie。

cookies.set()

使用给定的 cookie 数据设置 cookie;如果存在等效的 cookie,可能会覆盖它们。

cookies.remove()

通过名称删除 cookie。

cookies.getAllCookieStores()

列出所有现有的 cookie 存储。

事件处理器

cookies.onChanged

在设置或移除 cookie 时触发。

扩展程序示例

浏览器兼容性

注意:此 API 基于 Chromium 的 chrome.cookies API。本文档源自 Chromium 代码中的 cookies.json