存储访问 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. 如果 doc是一个不透明源,则用 false 解决 p 并返回 p

  4. globaldoc相关全局对象

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

  6. 如果 doc相关设置对象顶级源是一个不透明源,则用 false 解决 p 并返回 p

  7. browsingContextdoc浏览上下文

  8. topLevelSite 为从 doc相关设置对象顶级源获得站点的结果。

  9. embeddedSite 为从 doc获得站点的结果。

  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. 如果 browsingContextbrowsingContext顶级浏览上下文活跃文档是 same authority,则用 true 解决 p 并中止这些 步骤。

        这里的 "same authority" 是未来概念的占位符,该概念允许用户代理在遵循额外 安全方面(例如存在跨站父文档)的同时执行同站检查,参见 whatwg/storage#142。 实践中,这可能涉及比较cookie 的站点或与顶级文档执行同站检查。

      6. 如果 embeddedSitetopLevelSite同站,则用 global具有存储访问权解决 p, 并中止这些步骤。

      7. 如果 permissionStategranted,则用 global具有存储访问权解决 p, 并中止这些步骤。

        注: 这里全局存储 访问权限状态优先于本地具有存储访问权标志, 以便立即反映用户可能在其设置中撤销权限的选择。

      8. 用 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. 如果 doc是一个不透明源,则用一个 "NotAllowedError" DOMException 拒绝 p 并返回 p

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

  9. 如果 doc活跃沙盒标志集设置了其沙盒通过用户激活的存储访问 标志,则用一个 "NotAllowedError" DOMException 拒绝 p 并返回 p

  10. browsingContextdoc浏览上下文

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

  12. topLevelSite 为从 topLevelOrigin 获得站点的结果。

  13. embeddedOrigindoc

  14. embeddedSite 为从 embeddedOrigin 获得站点的结果。

  15. has transient activationdocWindow 对象是否具有瞬态激活

  16. 并行运行以下步骤:

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

      1. 给定 global,在网络任务源排队一个全局任务来:

        1. 如果 state已授予

          1. global具有存储 访问权设置为 true。

          2. undefined 解决 p

        2. 否则:

          1. 给定 global消耗用户 激活

          2. 用一个 "NotAllowedError" DOMException 拒绝 p

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

    3. 如果 explicitSetting 为 "disallow":

      1. 已拒绝运行 process permission state

      2. 中止这些步骤。

    4. 如果 explicitSetting 为 "allow":

      1. 已授予运行 process permission state

      2. 中止这些步骤。

    5. 断言explicitSetting 为 "none"。

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

      1. 已授予运行 process permission state

      2. 中止这些步骤。

    7. 如果 embeddedSitetopLevelSite同站

      注: 此检查有意为同站检查,以允许嵌入站点在出于 安全而非隐私目的限制存储访问的场景中,使用 requestStorageAccess() 选择加入存储访问, 而无需最终用户参与。

      1. 已授予运行 process permission state

      2. 中止这些步骤。

    8. previous permission state 为给定 "storage-access" 和 global 后,获取当前 权限状态的结果。

    9. 如果 previous permission state 不是提示

      1. previous permission state 运行 process permission state

      2. 中止这些步骤。

    10. connected 为给定 topLevelOriginembeddedOrigindoc确定有效 FedCM 连接状态的结果。

    11. 如果 connected

      注: 鼓励用户代理 跟踪哪些 (site, site) 元组因现有 FedCM 连接而被允许访问存储, 并在访问 cookie 时再次检查该列表,以捕捉恶意攻击者将某个环境欺骗为使用不正确的具有存储访问权位的情况。

      1. 已授予运行 process permission state

      2. 中止这些步骤。

    12. 如果 has transient activation 为 false:

      1. 已拒绝运行 process permission state

      2. 中止这些步骤。

    13. permissionState请求使用权限 "storage-access" 的结果。

      注: 在请求 权限并决定是否显示提示时,用户代理会应用实现定义的行为来塑造最终用户体验。 特别是对于 storage-access,已知用户代理会应用自定义规则,这些规则会在不显示 提示的情况下授予或拒绝权限。

    14. permissionState 运行 process permission state

  17. 返回 p

注: 此算法的意图是始终 要求用户激活,然后才会设置 storage-access 权限。虽然用户代理有能力 基于自定义启发式方法在没有事先用户激活的情况下设置 storage-access 权限, 但本规范强烈不鼓励这种行为,因为它可能导致互操作性问题。

快照源快照参数时:

  1. 具有存储访问权设置为 sourceDocument具有存储访问权

  2. 环境 id设置为 sourceDocument相关设置对象id

对于通过获取创建导航参数算法, 插入以下步骤作为步骤 3:

  1. originalURLentry 的 URL。

通过获取创建导航参数中创建 request保留客户端时:

  1. 如果以下各项均成立,则将保留客户端具有存储 访问权设置为 sourceSnapshotParams具有存储访问权

    1. sourceSnapshotParams环境 id等于 navigable活跃文档相关设置对象id

    2. originalURLcurrentURL同源

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

  2. 否则,将 request保留客户端具有存储 访问权设置为 false。

设置 window 环境设置 对象时:

  1. settings object具有存储访问权设置为 reserved environment具有存储访问权

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. 如果 key1顶级key2顶级不是同站,则返回 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 检查。