存储空间和 Cookie

扩展程序可以存储 Cookie 并访问 Web 存储 API,就像普通网站一样。不过,在某些情况下,这些 API 在扩展程序中的行为会有所不同。

如需了解扩展程序 API,请参阅 browser.storage

存储

在扩展程序中使用 Web 平台存储 API 通常是理想的做法。本部分将探讨这些 API 在扩展程序上下文中的行为,这有时可能与它们在网络上的行为有所不同。

持久性

当用户清除浏览数据时,系统不会清除扩展程序存储空间。这适用于使用 Web 存储 API(例如 Local StorageIndexedDB)存储的任何数据。

默认情况下,扩展程序会受到存储空间方面的常规配额限制,您可以通过调用 navigator.storage.estimate() 来查看这些限制。在内存压力过大的情况下,存储空间也可能会被逐出,但这种情况很少见。为避免发生这种情况,请执行以下操作:

  • 请求 "unlimitedStorage" 权限,该权限会影响扩展程序和 Web 存储 API,并使扩展程序免受配额限制和逐出。
  • 拨打 navigator.storage.persist() 寻求保护,以免被驱逐。

扩展程序存储空间在扩展程序的源(包括扩展程序 Service Worker、任何扩展程序网页(包括弹出式内容(窗口/广告/etc.)和侧边栏)以及离屏文档)之间共享。在内容脚本中,调用 Web 存储 API 会访问内容脚本注入到的宿主网页中的数据,而不是扩展程序中的数据。

服务工作线程中的访问权限

IndexedDBCache Storage API 可在服务工作线程中使用。不过,本地存储空间会话存储空间不是。

如果您需要从 Service Worker 访问本地存储空间或会话存储空间,请使用屏幕外文档

分区

分区是指为存储的数据引入密钥,以限制其可访问的位置。存储空间一直以来都是按来源键控的。

自 Chrome 115 起,存储分区引入了分区键定义方式方面的变化,以防止某些类型的跨网站跟踪。实际上,这意味着如果网站 A 嵌入了包含网站 B 的 iframe,网站 B 将无法访问直接导航到该网站时通常会拥有的存储空间。

为了减轻此变更对扩展程序的影响,我们提供了两项豁免:

  • 如果具有 chrome-extension:// 方案的网页嵌入到任何网站中,则存储分区将不适用,并且扩展程序将有权访问其顶级分区。
  • 如果具有 chrome-extension:// 方案的网页包含 iframe,并且扩展程序对所嵌入的网站具有主机权限,则该网站也将有权访问其顶级分区。

Cookie

Cookie 提供了一种存储与特定网域和路径相关联的键值对的方法。它们在扩展程序中的价值有限,但如果您有特定的使用情形,或者捆绑了在实现中使用它们的第三方脚本,那么了解它们的行为可能会很有用。

安全 Cookie

Secure Cookie 属性仅支持 https:// 方案。因此,chrome-extension:// 网页无法通过此属性设置 Cookie。

这也意味着,扩展程序网页无法使用需要 Secure 属性的其他 Cookie 属性:

分区和 SameSite 行为

在 chrome-extension:// 页面上设置的 Cookie 始终使用 SameSite=Lax。 因此,扩展程序在其自己的来源上设置的 Cookie 永远无法在框架中访问,并且分区不相关。

对于与第三方网站相关联的 Cookie,例如在扩展程序页面上的框架中加载的第三方网站的 Cookie,或者从扩展程序页面向第三方来源发出的请求的 Cookie,其行为与 Web 上的 Cookie 相同,但有两点不同:

  • 如果给定标签页的顶级网页是 chrome-extension:// 网页,即使在子框架中,系统也绝不会屏蔽第三方 Cookie。
  • 如果扩展程序具有对第三方的宿主权限,则扩展程序向第三方发出的请求会被视为同网站请求。这意味着可以发送 SameSite=Strict Cookie。请注意,此规则仅适用于网络请求,不适用于通过 JavaScript 中的 document.cookie 进行的访问,并且在第三方 Cookie 被屏蔽时不适用。

请注意,与第三方 Cookie 相关的设置会受到 Privacy Sandbox 工作的影响,并会根据其时间表进行调整

browser.cookies API 可用于控制要与每个 API 方法搭配使用的分区键。如需了解详情,请参阅 API 参考文档