存储访问 API

社区组草案报告,

本版本:
https://privacycg.github.io/storage-access/
问题追踪:
GitHub
规范内追踪
编辑者:
(Mozilla)
(Google)
(Apple 公司)
前编辑者:
(Apple 公司)
(Apple 公司)

摘要

存储访问 API 使 iframe 中的内容能够请求访问网站数据(如 Cookie)。

本文档状态

本规范计划合并入 HTML Living Standard。它既不是 WHATWG Living Standard,也不在 W3C 的标准流程中。

本规范由 隐私社区组发布。请注意,根据 W3C 社区贡献者许可协议(CLA),有有限的选择退出权以及其他适用条件。了解更多 W3C 社区和业务组 信息。

1. 简介

本节为非规范性内容。

用户代理有时会阻止某些 iframe 内的内容访问客户端存储机制(如 cookie)中的数据。这可能会导致依赖客户端存储访问的嵌入内容出现问题。

存储访问 API 使 iframe 内的内容可以请求并获得其客户端存储的访问权限,以便依赖客户端存储访问的嵌入内容能够在此类用户代理中正常工作。[STORAGE-ACCESS-INTRO]

2. 基础设施

本规范依赖 Infra 标准。[INFRA]

3. 存储访问 API

本规范定义了一种方法,用于查询一个Document 当前是否有权访问其未分区数据hasStorageAccess()), 以及一个可用于请求访问其未分区数据的方法(requestStorageAccess())。

Alex 访问 https://social.example/。页面设置了一个 cookie。该 cookie 在 一方网站上下文中被设置。

之后,Alex 访问 https://video.example/,该页面嵌入了一个加载 https://social.example/heart-buttoniframe。 在这种情况下, social.exampleDocument doc 处于第三方上下文,而之前设置的 cookie 是否可在 doc.cookie 中访问,取决于用户代理的存储访问策略。

iframe 内的脚本可以调用 doc.hasStorageAccess() 以判断是否拥有 cookie 访问权限。如果没有访问权限,则可以通过调用 doc.requestStorageAccess() 请求访问。

未分区数据 是指若一个网站一方网站上下文中加载时可访问的客户端存储数据。

Document 处于一方网站上下文,如果它是顶级浏览上下文活动文档。否则,如果它是活动文档,且其origin顶级 origin相同,它也处于一方网站上下文(需满足相关设置对象的 origin 与顶级 origin 同站)。

Document 若不处于一方网站上下文,则处于第三方上下文

判断用户代理是否明确允许未分区 cookie 访问,给定一个由两个网站组成的元组tuple,请执行以下步骤。该算法返回 "none"、"allow" 或 "disallow"。

注意:用户代理的设置可能通过网站白名单、用户更改全局浏览器配置或类似的自定义覆盖方式,明确允许或拒绝未分区 cookie 访问。

  1. 如用户代理未对 tuple 拥有未分区 cookie 访问的明确设置,则返回"none"。

  2. 如用户代理的设置对 tuple 明确允许未分区 cookie 访问,则返回"allow"。

  3. 断言:用户代理的设置对 tuple 明确拒绝未分区 cookie 访问。

  4. 返回"disallow"。

判断 FedCM 站点连接状态,给定 origin embedderorigin identityProvider,执行以下步骤。此算法返回布尔值

  1. 对于 已连接账户集中的每个 item

    1. 令 (rp, idp, account) 为 item

    2. rpembedder 同站,且 idpidentityProvider 同站,则返回 true。

  2. 返回 false。

判断有效 FedCM 连接状态,给定origin embedderorigin identityProviderDocument doc,执行以下步骤。该算法返回布尔值

  1. policyStatus 表示 doc 是否被允许使用 "identity-credentials-get"。

  2. policyStatus 为 "Disabled",返回 false。

  3. connected 为根据 判断站点连接状态算法,传入 embedderidentityProvider 的结果。

  4. connected 为 false,返回 false。

  5. preventSilentAccess 表示 用户代理凭据存储origin-防静默访问标志 对于 embedder 的值。

  6. preventSilentAccess 为真,返回 false。

  7. 返回 true。

3.1. 与存储访问相关的用户代理状态更改

按如下方式修改 environment 的定义:

  1. 新增名为 has storage access 的成员,类型为 布尔值

按如下方式修改 source snapshot params 的定义:

  1. 新增名为 has storage access 的成员,类型为 布尔值

  2. 新增名为 environment id 的成员,类型为 opaque 字符串

存储访问资格 可以为 "unset"、"ineligible" 或 "eligible"。

请求拥有一个存储访问资格 eligible for storage-access。其初始值为 "unset"。

注意:一个请求存储访问资格 指示在评估此请求应包含哪些 cookie 时, 是否应考虑此前授予的 "storage-access" 权限。 特别要注意,requestStorageAccess 完成以及environmenthas storage access 被设为 true 后,并不是该 environment中发起的所有请求都应携带未分区 cookie。

例如,假设用户正在访问 https://top.com,该页面嵌入了来自 https://embed.com 的 iframe, 且该 iframe 中脚本已调用 requestStorageAccess 并已 resolve。如果该 iframe 随后去 fetch https://3p.com 的资源,该请求不会通过存储访问 API 附带 cookie。

判断初始存储访问资格,给定请求 request,执行以下步骤:
  1. 如果 requestclient 为 null,则返回 "unset"。

  2. 如果 requestclient祖先链不是 "cross-site",则返回 "unset"。

“ancestry” 的概念正通过 https://github.com/whatwg/html/pull/11133 被添加到 HTML 规范

  1. 如果 requestclienthas storage access 为 false,则返回 "ineligible"。

  2. 如果 requestoriginrequesturlorigin 不同源,则返回 "ineligible"。

  3. allowed 为执行 Should request be allowed to use feature?,参数为 "storage-access" 和 request,得到的结果。

  4. 如果 allowed 为 false,则返回 "ineligible"。

  5. 返回 "eligible"。

3.2. Document 的变更

partial interface Document {
  Promise<boolean> hasStorageAccess();
  Promise<undefined> requestStorageAccess();
};

Document doc 上调用 hasStorageAccess() 方法时,必须执行以下步骤:

  1. p一个新的 promise

  2. 如果 doc 不是 完全激活,则用 "InvalidStateError" DOMException 拒绝 p 并返回 p

  3. 如果 docorigin不透明来源,则用 false 解析 p 并返回 p

  4. globaldoc相关全局对象

  5. 如果 global 不是 安全上下文,则用 false 解析 p 并返回 p

  6. 如果 doc顶级来源不透明来源,则用 false 解析 p 并返回 p

  7. browsingContextdoc浏览上下文

  8. topLevelSite 为通过 doc顶级来源相关设置对象 获取的站点结果。

  9. embeddedSite 为通过 docorigin 获取的站点结果。

  10. 按如下步骤 并行运行

    1. explicitSetting 为使用 (topLevelSite, embeddedSite) 调用 判断用户代理是否明确允许未分区 cookie 访问 的结果。

    2. permissionState 为使用 "storage-access" 及 global 执行获取当前权限状态的结果。

    3. 网络任务源 上为 global 排队全局任务:

      1. explicitSetting 为 "disallow",用 false 解析 p

      2. explicitSetting 为 "allow",用 true 解析 p

      3. 断言explicitSetting 为 "none"。

      4. browsingContext顶级浏览上下文,用 true 解析 p

      5. browsingContext 与其顶级浏览上下文活动文档属于相同权限主体,则用 true 解析 p

        “same authority” 为未来定义概念的占位符(允许用户代理在执行 同站 检查时增加如父文档为跨站点等额外安全考量),详见 whatwg/storage#142。 实际上,这可能涉及对 cookie 站点 的比较,或与顶级文档进行一次 same site 检查。

      6. permissionStategranted,用 globalhas storage access 解析 p

        注意:此处全局的存储访问权限状态优先于本地 has storage access 标志,以便于立即响应用户在设置中撤回权限的选择。

      7. 用 false 解析 p

  11. 返回 p

Document doc 上调用 requestStorageAccess() 方法时,必须执行以下步骤:

  1. p一个新的 promise

  2. 如果 doc 不是 完全激活,则用 "InvalidStateError" DOMException 拒绝 p 并返回 p

  3. globaldoc相关全局对象

  4. settingsdoc相关设置对象

  5. 如果 global 不是 安全上下文,则用 "NotAllowedError" DOMException 拒绝 p 并返回 p

  6. 如果 doc 不被允许使用 "storage-access",则用 "NotAllowedError" DOMException 拒绝 p 并返回 p

  7. 如果 docorigin不透明来源,则用 "NotAllowedError" DOMException 拒绝 p 并返回 p

  8. 如果 settings顶级来源不透明来源,则用 "NotAllowedError" DOMException 拒绝 p 并返回 p

  9. 如果 doc活动沙箱标志集包含 通过用户激活获取存储访问的沙箱标志,则用 "NotAllowedError" DOMException 拒绝 p 并返回 p

  10. browsingContextdoc浏览上下文

  11. topLevelOrigindoc相关设置对象的顶级来源。

  12. topLevelSite 为从 topLevelOrigin 获取的站点

  13. embeddedOrigindocorigin

  14. embeddedSite 为从 embeddedOrigin 获取的站点

  15. has transient activation 表示 docWindow 对象是否具有短暂激活

  16. 按如下步骤 并行运行

    1. process permission state 为一算法,给定 权限状态 state 时,执行以下步骤:

      1. 网络任务源 上为 global 排队全局任务:

        1. stategranted

          1. globalhas storage access 设为 true。

          2. undefined 解析 p

        2. 否则:

          1. global 消费用户激活

          2. 用 "NotAllowedError" DOMException 拒绝 p

    2. explicitSetting 为使用 (topLevelSite, embeddedSite) 调用 判断用户代理是否明确允许未分区 cookie 访问 的结果。

    3. explicitSetting 为 "disallow":

      1. denied 调用 process permission state

      2. 中止后续步骤。

    4. explicitSetting 为 "allow":

      1. granted 调用 process permission state

      2. 中止后续步骤。

    5. 断言explicitSetting 为 "none"。

    6. 如果 browsingContext顶级浏览上下文

      1. granted 调用 process permission state

      2. 中止后续步骤。

    7. 如果 embeddedSitetopLevelSite 同站

      注: 这里有意用 same site 检查,以便嵌入站点在出于安全但非隐私原因受限存储访问的情况下,可自行调用 requestStorageAccess() 获得访问,无需最终用户参与。

      1. granted 调用 process permission state

      2. 中止后续步骤。

    8. previous permission state 为使用 "storage-access" 及 global 执行 获取当前权限状态的结果。

    9. 如果 previous permission state 不是 prompt

      1. previous permission state 调用 process permission state

      2. 中止后续步骤。

    10. connected 为以 topLevelOriginembeddedOrigindoc 调用 判断有效 FedCM 连接状态 的结果。

    11. connected

      注: 鼓励用户代理追踪因已存在 FedCM 连接而允许存储访问的(站点,站点)元组, 以便访问 cookie 时再次核查该列表,从而防止攻击者诱导 environment 使用错误的 has storage access 位。

      1. granted 调用 process permission state

      2. 中止后续步骤。

    12. has transient activation 为 false:

      1. denied 调用 process permission state

      2. 中止后续步骤。

    13. permissionState 为对 "storage-access" 请求权限的结果。

      注: 请求权限时是否弹框由用户代理实现决定,尤其对 storage-access,用户代理常有自定义规则可在不弹框时直接允许或拒绝。

    14. permissionState 调用 process permission state

  17. 返回 p

注:本算法设计意图是始终要求用户激活后才设置 storage-access 权限。虽然用户代理可基于自定义启发规则在未激活时设权限,本规范强烈反对此做法,以免导致互操作问题。

快照化源快照参数时:

  1. has storage access设置为 sourceDocumenthas storage access

  2. environment id设置为 sourceDocumentrelevant settings objectid

对于通过 fetch 创建导航参数算法,在第3步插入以下内容:

  1. originalURLentry的URL。

当在通过 fetch 创建导航参数中创建requestreserved client时:

  1. 如果全部满足以下条件,则将reserved clienthas storage access设置为sourceSnapshotParamshas storage access

    1. sourceSnapshotParamsenvironment id等于 navigable活动文档relevant settings objectid

    2. originalURLorigincurrentURLorigin同源。

    3. response为null或responsehas-cross-origin-redirects为false。

  2. 否则,将requestreserved clienthas storage access设置为false。

设置窗口环境设置对象时:

  1. settings objecthas storage access设置为reserved environmenthas storage access

3.4. 与 Fetch 的集成

3.4.1. 获取流程

fetch的第14步后插入新步骤:

  1. requesteligible for storage-access设置为 判断初始存储访问资格算法对request的结果。

3.4.2. HTTP 重定向获取

HTTP-redirect fetch的第17步后插入新步骤:

  1. 如果requesteligible for storage-access不是 "unset", 且locationURLoriginrequestcurrent URLorigin不同源,则将requesteligible for storage-access设置为 "ineligible"。

3.5. 各类客户端存储机制的更改

该 API 仅影响 HTTP Cookie。API 的未来版本可能会影响其他客户端状态。[RFC6265]

3.5.1. Cookie

本 API 旨在配合阻止第三方上下文未分区 Cookie 访问的环境和用户代理配置使用。于当前文档发布时,该机制尚未集成到HTTP-network-or-cache fetchcookie算法中。 为促进相关集成,cookie 存储将需支持关于请求顶级/嵌入站点及该请求是否拥有存储访问的信息(以决定是否附加跨站/分区/不附加 Cookie),并通过访问在本规范中定义的eligible for storage-access标志获悉该信息。

一旦 Cookie 存储允许获取存储访问信息,我们将更新HTTP-network-or-cache fetchcookie, 在获取 Cookie 时,将请求eligible for storage-access传递给cookie 存储

cookie 存储通过存储访问获取未分区 Cookie 时,用户代理仍会遵循 SameSite 限制(即在第三方上下文中不会附加 SameSite=StrictSameSite=Lax 的 Cookie)。

注意:用户代理可能对SameSite Cookie 属性有不同默认值,这会导致未设置 SameSite 属性的未分区 Cookie 在某些用户代理(默认 SameSite=None)请求时会被附加,而在其他用户代理(默认 SameSite=Lax)不会。建议 Web 开发者为自己的 Cookie 显式设置 SameSite 属性以避免问题。

3.6. 存储访问的沙箱机制

沙箱标志集合具备一个允许用户激活后存储访问的沙箱标志。该标志会阻止内容请求存储访问。

解析沙箱指令算法第3步下方,添加如下内容:

4. 权限集成

存储访问 API 定义了一个由名字 "storage-access" 标识的强特性。它定义了以下与权限相关的算法:

权限查询算法
查询 "storage-access" 权限时,给定 PermissionDescriptor permissionDescPermissionStatus status
  1. statusstate 设置为permissionDescpermission state

  2. statusstatedenied,则设置statusstateprompt

    注意:权限状态“denied”不会暴露,以避免开发者获知用户决定,防止对用户进行报复或频繁重复弹窗影响体验。

权限键类型
"storage-access" 特性的权限键为:由一个站点 top-level和一个站点 请求者组成的元组

(("https", "news.example"), ("https", "social.example")) 是 "storage-access" 的权限键,其top-level("https", "news.example"),其请求者("https", "social.example")

权限键生成算法
为 "storage-access" 特性生成权限键时,给定origin originorigin embeddedOrigin
  1. topLevelSite为从origin获取的站点

  2. embeddedSite为从embeddedOrigin获取的站点

  3. 返回(topLevelSite, embeddedSite)。

权限键比较算法
比较 "storage-access" 特性的两个权限键 key1key2 时,执行:
  1. key1top-levelkey2top-level不同站,则返回false。

  2. key1请求者key2请求者不同站,则返回false。

  3. 返回true。

5. 权限策略集成

存储访问 API 定义了由字符串"storage-access"标识的策略可控特性。其默认允许清单"*"

注意:Document权限策略决定了该文档内的内容是否能通过requestStorageAccess()请求存储访问。 如果在任一文档中被禁用,则该文档里调用requestStorageAccess()将会被拒绝。

6. 隐私相关考量

存储访问 API 有助于移除跨站 Cookie。特别是它允许身份验证嵌入场景继续工作。因此,该 API 为开发者重新获得跨站 Cookie 访问(但会受附加约束)提供了一条路径。

嵌套Document 调用requestStorageAccess()并获得 resolved Promise 后, 可获得与其作为顶级浏览上下文活动文档一致的 Cookie。借助这些 Cookie,可对服务器进行身份认证并加载用户相关信息。

虽然该功能伴随第三方滥用于跟踪的风险,但 API 的明确目标之一和关键设计原则,就是不削弱跨站 Cookie 废弃带来的隐私提升。重要的是,与废弃前相比,隐私性不会变差。这归因于规范中未使用平台特有信息防止无状态跟踪,唯一新增的状态是仅限于嵌入站点与被嵌入 Document之间权限声明。

当默认已弃用跨站 Cookie 时,隐私考虑更具挑战。问题是何时及如何允许使用存储访问 API 让无 Cookie(或分区 Cookie)的嵌套Document 回到废弃前状态,获得其未分区数据访问权。

理想情况下,嵌套Document 仅在满足以下条件时才能获得其未分区数据访问权:

  1. 用户与嵌套Document发生交互

  2. 该嵌套Document被嵌入者允许使用 API

  3. 嵌套Document安全上下文

  4. 用户明确、分组授权被嵌入方使用其 Cookie

  5. 不会因频繁请求 storage-access 权限导致用户疲劳,进而削弱用户主动授权的效力

规定要求实现方保证前三点。这有助于保证用户知晓嵌套Document内容、嵌入者未拒绝其认证、跨站点 Cookie 不会暴露给网络攻击者。

最后两点存在矛盾。理想中,用户会在每次requestStorageAccess()调用时都被提示。 但,这将允许页面频繁弹窗,有违合理体验。因此用户代理需防止过度弹窗。

A modal dialog box which states 'Do you want to allow “video.example” to use cookies and website data while browsing “news.example”? This will allow “video.example” to track your activity.' and which has two buttons, “Don’t Allow” and “Allow”.
一段示例授权弹窗,用于站点调用document.requestStorageAccess()时显示给用户。

因此,最后两点反映了关键妥协。只要满足其他要求,允许在授予或拒绝未分区数据访问时采用实现自定义行为,无需用户介入。此妥协会较弱化第4点隐私保障,但决定权归实现方,甚至可使 API 总无法获得存储访问。然而,这对满足第5点——在实现方就两点妥协持有差异立场时——是必要的。

开发者体验会因用户代理在实现自定义行为上差异较大而受损。因此用户代理应当尽量减少或统一静默授权和拒绝。

6.1. 权限范围

本 API 设计中的另一个权衡点是,"storage-access" 权限应以什么为主键:origin 还是 site。我们选择了site,因为我们认为它们在隐私上是可接受的边界,同时也支持 same site 与 cross-origin 嵌套 Documents 在同一页面只需一次用户授权弹窗的用例。

7. 安全性考量

即便与跨站 Cookie 移除后的平台相比,本规范也不应削弱 Web 平台的安全属性。第三方 Cookie 的移除有可能增进安全性,特别是在缓解依赖认证请求的攻击(如 CSRF)方面。我们不希望 Storage Access API 成为此类攻击的突破口。

因此,我们将“storage-access”权限的影响局限于:只对调用了 未分区数据 访问的嵌入 Document 生效,且权限只在该嵌入 requestStorageAccess() 并未跨 origin 边界导航前持续。这确保了只有页面主动调用 requestStorageAccess()origin 才能发起认证请求,并且被嵌入页面可通过 Content Security Policy 的 "frame-ancestors" 指令控制允许的嵌入方,从而为安全保留 origin 范围上的控制能力。

7.1. 声誉攻击

这同样能有效防止另一种攻击:针对被嵌入方声誉的攻击。我们认为任何跨站认证请求都可能对被嵌入方带来声誉风险,尤其是在用户更注重隐私的今天。因此,第一方或同级跨站点导致嵌入资源带上用户认证 Cookie 的请求,就构成对该跨站点所有者声誉的攻击。这也是为何本 API 必须运行在安全上下文中,以防网络攻击者诱使被嵌入方调用本 API。

嵌入页面可以通过权限策略和嵌套 Document 沙箱化来控制哪些嵌套文档可被认证,甚至哪些可以显示权限请求。

7.2. 通知滥用

在定义 Storage Access API 时同样考虑了通知滥用。具体来说,我们要求用户必须与嵌套 Document 交互,在权限被拒绝时消耗这次激活,从而限制展示权限弹窗的条件。这可以缓解像“用户刚拒绝即反复请求权限”这类攻击。

8. 自动化

为支持用户代理自动化和应用测试,本文定义了如下 扩展命令,以便于[WebDriver] 规范集成。

8.1. 设置存储访问

HTTP 方法 URI 模板
POST /session/{session id}/storageaccess

Set Storage Access 扩展命令可修改当前浏览上下文的存储访问策略。

远端步骤如下:

  1. blocked 为通过 获取属性parameters 读取 blocked 的值。

  2. 如果 blocked 不是 布尔值,则返回带有WebDriver 错误WebDriver 错误码 invalid argument

  3. embedded origin 为通过 获取属性parameters 读取 origin 的值。

  4. embedded origin 不是单个 U+002A 星号(*),则:

    1. parsedURL 为对 embedded origin 执行 URL 解析器的结果。

    2. parsedURL 失败,则返回带有WebDriver 错误WebDriver 错误码 invalid argument

    3. embedded origin 设为 parsedURLorigin

  5. 当前浏览上下文不是顶级浏览上下文,则返回带有WebDriver 错误WebDriver 错误码 unsupported operation

  6. doc当前浏览上下文活动文档

  7. settingsdoc相关设置对象

  8. top-level sitesettingsorigin获得的站点。

  9. 如果 embedded origin 是单个星号(*),则:

    1. blockedtrue

      1. 运行实现自定义的步骤集,确保在 top-level site第三方上下文中,没有任何站点可以访问自身的未分区数据

    2. 否则如 blockedfalse

      1. 运行实现自定义的步骤集,确保在 top-level site第三方上下文中,任何站点均可访问自身的未分区数据

  10. 否则:

    1. embedded originsettingsorigin 同站,则返回带有 WebDriver 错误错误码 unsupported operation

    2. blockedtrue

      1. 运行实现自定义的步骤集,确保embedded origintop-level site第三方上下文中无法访问自身的未分区数据

    3. 否则如blockedfalse

      1. 运行实现自定义的步骤集,确保embedded origintop-level site第三方上下文中可以访问自身的未分区数据

  11. 如上述实现自定义步骤集失败,则返回带有WebDriver 错误错误码 unknown error

  12. 返回success,数据为null

致谢

本规范基于前任编辑 John Wilander(存储访问 API 的发明者)和 Theresa O’Connor(撰写了大量初稿内容)创造的基础之上。我们感谢他们的贡献与创意。

特别感谢 Anne van Kesteren、 Ben Kelly、 Brad Girardeau、 Brad Hill、 Brady Eidson、 Brandon Maslen、 Chris Mills、 Dave Longley、 Domenic Denicola、 Ehsan Akhgari、 Geoffrey Garen、 Jack Frankland、 James Coleman、 James Hartig、 Jeffrey Yasskin、 Kushal Dave、 Luís Rudge、 Maciej Stachowiak、 Matias Woloski、 Mike O’Neill、 Mike West、 Pete Snyder、 Rob Stone、 Stefan Leyhane、 Steven Englehardt、 Travis Leithead、 Yan Zhu、 Zach Edwards、 以及所有在 whatwg/html#3338privacycg/proposals#2privacycg/storage-access/issues 回复过本提案的朋友们。

感谢 WebKit 开源项目允许我们使用 存储访问 API 提示 图片,该图片最初发布于 webkit.org

一致性

文档规范

一致性要求通过描述性断言和 RFC 2119 术语的组合表达。 规范性部分中的关键词:“MUST”、“MUST NOT”、“REQUIRED”、“SHALL”、“SHALL NOT”、“SHOULD”、“SHOULD NOT”、“RECOMMENDED”、“MAY” 和“OPTIONAL” 应按照 RFC 2119 的说明解释。 但为增强可读性,本规范未对这些词全部使用大写字母。

除非明确标注为非规范性、示例或备注的章节,否则本规范全部文本均为规范性内容。[RFC2119]

规范中的示例会以“例如”开头,或通过 class="example" 与规范性文本区分开,如下所示:

这是一个说明性示例。

非规范性备注以“注(Note)”开头,并通过 class="note" 与规范正文区分,如下所示:

注,这是一个说明性备注。

索引

本规范定义的术语

引用定义的术语

参考文献

规范性引用

[CREDENTIAL-MANAGEMENT-1]
Nina Satragno; Marcos Caceres. Credential Management Level 1. URL: https://w3c.github.io/webappsec-credential-management/
[DOM]
Anne van Kesteren. DOM Standard. Living Standard. URL: https://dom.spec.whatwg.org/
[FEDCM-1]
Nicolas Pena Moreno. Federated Credential Management API. URL: https://w3c-fedid.github.io/FedCM/
[FETCH]
Anne van Kesteren. Fetch Standard. Living Standard. URL: https://fetch.spec.whatwg.org/
[HTML]
Anne van Kesteren; et al. HTML Standard. Living Standard. URL: https://html.spec.whatwg.org/multipage/
[INFRA]
Anne van Kesteren; Domenic Denicola. Infra Standard. Living Standard. URL: https://infra.spec.whatwg.org/
[PERMISSIONS]
Marcos Caceres; Mike Taylor. Permissions. URL: https://w3c.github.io/permissions/
[PERMISSIONS-POLICY-1]
Ian Clelland. Permissions Policy. URL: https://w3c.github.io/webappsec-permissions-policy/
[RFC2119]
S. Bradner. Key words for use in RFCs to Indicate Requirement Levels. March 1997. Best Current Practice. URL: https://datatracker.ietf.org/doc/html/rfc2119
[RFC6265]
A. Barth. HTTP State Management Mechanism. April 2011. Proposed Standard. URL: https://httpwg.org/specs/rfc6265.html
[RFC6265BIS]
Cookies: HTTP State Management Mechanism. Editor's Draft. URL: https://datatracker.ietf.org/doc/html/draft-ietf-httpbis-rfc6265bis
[URL]
Anne van Kesteren. URL Standard. Living Standard. URL: https://url.spec.whatwg.org/
[WebDriver]
Simon Stewart; David Burns. WebDriver. URL: https://w3c.github.io/webdriver/
[WEBIDL]
Edgar Chen; Timothy Gu. Web IDL Standard. Living Standard. URL: https://webidl.spec.whatwg.org/

补充性引用

[STORAGE-ACCESS-INTRO]
John Wilander. Introducing Storage Access API. February 2018. Blog post. URL: https://webkit.org/blog/8124/introducing-storage-access-api/

IDL 索引

partial interface Document {
  Promise<boolean> hasStorageAccess();
  Promise<undefined> requestStorageAccess();
};

问题索引

"ancestry" 概念正在 HTML 中补充添加,详见 https://github.com/whatwg/html/pull/11133
此处的 "same authority" 是未来用于允许用户代理在执行 同站 检查时,兼顾诸如存在跨站父文档等附加安全属性的概念占位符,详情见 whatwg/storage#142。实践中,这可能涉及对 cookie 站点的比较,或与顶级文档做一次 same site 检查。