1. 7.3 生成元
      1. 7.3.1 Sites
      2. 7.3.2 同一生成元制限を緩和する
      3. 7.3.3 Origin-keyed agent clusters
    2. 7.4 サンドボックス
    3. 7.5 生成元をまたいだオープナーポリシー
      1. 7.5.1 ヘッダー
      2. 7.5.2 生成元をまたいだオープナーポリシーによるブラウジングコンテキストグループスイッチ
      3. 7.5.3 レポーティング
    4. 7.6 生成元をまたいだ埋め込みポリシー
      1. 7.6.1 ヘッダー
      2. 7.6.2 埋め込みポリシーチェック
    5. 7.7 Policy containers

7.3 生成元

生成元は、ウェブのセキュリティモデルの基本的な通貨である。生成元を共有するウェブプラットフォーム内の2つの当事者が互いに信頼し、同一の権限を有すると仮定される。異なる生成元をもつ当事者は、互いに潜在的に悪意があると見なされ、互いから程度を変化させるよう隔離される。

たとえば、bank.example.comでホストされるExample Bankのウェブサイトは、charity.example.orgでホストExample CharityのウェブサイトのDOMを検査しようとすると、"SecurityError" DOMException が発生する。


生成元は次のいずれかである:

不透明な生成元

内部値であり、シリアライズされていないために再作成することができない(生成元のシリアライズごとに"null"としてシリアライズされる)。意味のある操作は、透過性のテストのみである。

タプルの生成元

タプルは以下で構成される:

生成元は、たとえば複数のDocumentオブジェクト間で共有できる。さらに、生成元は一般に不変である。タプルの生成元ドメインのみ、およびdocument.domain APIを介してのみ変更できる。

The serialization of ("https", "xn--maraa-rta.example", null, null) is "https://xn--maraa-rta.example".

ABsame originsame origin-domain
("https", "example.org", null, null)("https", "example.org", null, null)
("https", "example.org", 314, null)("https", "example.org", 420, null)
("https", "example.org", 314, "example.org")("https", "example.org", 420, "example.org")
("https", "example.org", null, null)("https", "example.org", null, "example.org")
("https", "example.org", null, "example.org")("http", "example.org", null, "example.org")

7.3.1 Sites

A scheme-and-host is a tuple of a scheme and a host.

A site is an opaque origin or a scheme-and-host.

Unlike the same origin and same origin-domain concepts, for schemelessly same site and same site, the port and domain components are ignored.

For the reasons explained in URL, the same site and schemelessly same site concepts should be avoided when possible, in favor of same origin checks.

Given that wildlife.museum, museum, and com are public suffixes and that example.com is not:

ABschemelessly same sitesame site
("https", "example.com")("https", "sub.example.com")
("https", "example.com")("https", "sub.other.example.com")
("https", "example.com")("http", "non-secure.example.com")
("https", "r.wildlife.museum")("https", "sub.r.wildlife.museum")
("https", "r.wildlife.museum")("https", "sub.other.r.wildlife.museum")
("https", "r.wildlife.museum")("https", "other.wildlife.museum")
("https", "r.wildlife.museum")("https", "wildlife.museum")
("https", "wildlife.museum")("https", "wildlife.museum")

(Here we have omitted the port and domain components since they are not considered.)

7.3.2 同一生成元制限を緩和する

Document/domain

Support in all current engines.

Firefox1+Safari1+Chrome1+
Opera12.1+Edge79+
Edge (Legacy)12+Internet Explorer4+
Firefox Android4+Safari iOS1+Chrome Android18+WebView Android1+Samsung Internet1.0+Opera Android12.1+
document.domain [ = domain ]

セキュリティチェックのために使用される現在のドメインを返す。

サブドメインを削除する値に設定し、生成元ドメインを変更し、同じドメインの他のサブドメイン(同じことを行う場合)のページが互いにアクセスできるようにすることができる。これにより、ドメインの異なるホスト上のページが、互いのDOMに同期的にアクセスできるようになる。

サンドボックス化されたiframe不透明な生成元をもつDocumentブラウジングコンテキストのないDocument、および"document-domain"機能が無効になっている場合、セッターは"SecurityError"例外を投げる。In cases where crossOriginIsolated or originAgentCluster return true, the setter will do nothing.

document.domainセッターの使用を避ける。これは、同一生成元ポリシーが提供するセキュリティ保護を損なうものである。これは共有ホスティングを使用している場合に特に顕著である。たとえば、信頼できないサードパーティが同じIPアドレスだが異なるポートで HTTP サーバーをホストできる場合、document.domainセッターを使用した後に生成元を比較するときにポートが無視されるため、通常は同じホスト上の2つの異なるサイトを保護する同一生成元の保護が失敗する。

これらのセキュリティ上の落とし穴があるため、この機能はウェブプラットフォームから削除されるプロセスにある。(これは何年もかかる長いプロセスである。)

代わりに、安全な方法で生成元間で通信するために、postMessage() またはMessageChannelオブジェクトを使用する。

7.3.3 Origin-keyed agent clusters

window.originAgentCluster

Returns true if this Window belongs to an agent cluster which is origin-keyed, in the manner described in this section.

A Document delivered over a secure context can request that it be placed in an origin-keyed agent cluster, by using the `Origin-Agent-Cluster` HTTP response header. This header is a structured header whose value must be a boolean. [STRUCTURED-FIELDS]

構造化されたヘッダーのtrueの値(すなわち、`?1`)ではないは無視される。

このヘッダーを使用した結果は、document.domainを使用して同一生成元の制限を緩和しようとしても何も実行されない代わりに、WebAssembly.Moduleオブジェクトを生成元をまたいだDocumentに送信することができなくなることである(たとえ同じサイトであっても)。水面下で、この分離により、ユーザーエージェントは、プロセスやスレッドなどのエージェントクラスターに対応する実装固有のリソースをより効率的に割り当てることが可能になる。

Note that within a browsing context group, the `Origin-Agent-Cluster` header can never cause same-origin Document objects to end up in different agent clusters, even if one sends the header and the other doesn't.

This means that the originAgentCluster getter can return false, even if the header is set, if the header was omitted on a previously-loaded same-origin page in the same browsing context group. 同様に、ヘッダーが設定されていなくてもtrueを返すことができる。

Documents with an opaque origin can be considered unconditionally origin-keyed; for them the header has no effect, and the originAgentCluster getter will always return true.

Similarly, Documents whose agent cluster's cross-origin isolation mode is not "none" are automatically origin-keyed. The `Origin-Agent-Cluster` header might be useful as an additional hint to implementations about resource allocation, since the `Cross-Origin-Opener-Policy` and `Cross-Origin-Embedder-Policy` headers used to achieve cross-origin isolation are more about ensuring that everything in the same address space opts in to being there. しかし、それを追加しても、著者のコードに追加の目に見える影響はない。

7.4 サンドボックス

サンドボックスフラグセットは以下のフラグの0個以上の集合であり、これは潜在的に信頼されないリソースが持つ能力を制限するために使用される:

サンドボックス化されたナビゲーションブラウジングコンテキストフラグ

このフラグは、コンテンツが、サンドボックス化されたブラウジングコンテキスト自体(またはその中にさらにネストされたブラウジングコンテキスト)、補助ブラウジングコンテキスト(次に定義されるサンドボックス化された補助ナビゲーションブラウジングコンテキストフラグによって保護されている)、およびトップレベルブラウジングコンテキストサンドボックス化されたユーザー起動ブラウジングコンテキストフラグなしのトップレベルナビゲーション、および以下に定義されるサンドボックス化されたユーザー起動ブラウジングコンテキストフラグありトップレベルナビゲーションによって保護されている)以外のブラウジングコンテキストをナビゲートすることを防止するものである。

サンドボックス化された補助ナビゲーションブラウジングコンテキストフラグが設定されない場合、それにもかかわらず一定の場合における制限はポップアップ(新しいトップレベルブラウジングコンテキスト)を開くことができる。これらのブラウジングコンテキストは常に、1つの許可されたサンドボックス化されたナビゲーターを持ち、実際に移動するために作成したブラウジングコンテキストを許可する、ブラウジングコンテキストが作成されるときに設定を持つ。(そうでなければ、サンドボックス化されたナビゲーションブラウジングコンテキストフラグは、それらが開かれた場合であってもナビゲートされていくのを防ぐだろう。)

サンドボックス化された補助ナビゲーションブラウジングコンテキストフラグ

このフラグは、コンテンツが新しい補助ブラウジングコンテキストを作成するのを防ぐ。 たとえば、target属性やwindow.open()メソッドを使用する。

ユーザーによるアクティブ化なしでサンドボックス化されたトップレベルナビゲーションブラウジングコンテキストフラグ

このフラグは、それらのトップレベルブラウジングコンテキストのナビゲートからコンテンツを防ぎ、かつそれらのトップレベルブラウジングコンテキストの遮断からコンテンツを防ぐ。サンドボックス化されたブラウジングコンテキストのアクティブウィンドウ一時的なアクティブ化を持たない場合にのみ考慮される。

ユーザーによるアクティブ化なしでサンドボックス化されたトップレベルナビゲーションブラウジングコンテキストフラグが設定されていない場合、コンテンツはそのトップレベルブラウジングコンテキストをナビゲートすることができるが、他のブラウジングコンテキストは、サンドボックス化されたナビゲーションブラウジングコンテキストフラグ、およびサンドボックス化された補助ナビゲーションブラウジングコンテキストフラグによって保護されたままである。

ユーザーによるアクティブ化でサンドボックス化されたトップレベルナビゲーションブラウジングコンテキストフラグ

このフラグは、それらのトップレベルブラウジングコンテキストのナビゲートからコンテンツを防ぎ、かつそれらのトップレベルブラウジングコンテキストの遮断からコンテンツを防ぐ。サンドボックス化されたブラウジングコンテキストのアクティブウィンドウ一時的なアクティブ化を持つ場合にのみ考慮される。

ユーザーによるアクティブ化なしでサンドボックス化されたブラウジングコンテキストフラグと同様に、このフラグはトップレベルブラウジングコンテキストにのみ影響する。 設定されていない場合、他のブラウジングコンテキストが他のフラグによって保護されている可能性がある。

サンドボックス化されたプラグインブラウジングコンテキストフラグ

This flag prevents content from instantiating plugins, whether using the embed element, the object element, or through navigation of their nested browsing context.

サンドボックス化された生成元ブラウジングコンテキストフラグ

このフラグは、一意な生成元にコンテンツを強制する。したがって、同一生成元から他のコンテンツにアクセスすることを防止する。

このフラグはまた、document.cookie IDL属性からの読み取りまたは書き込みをするスクリプトを防止しlocalStorageへのアクセスをブロックする。

サンドボックス化されたフォームブラウジングコンテキストフラグ

このフラグはフォーム送信をブロックする

サンドボックス化されたポインターロックブラウジングコンテキストフラグ

このフラグはPointer Lock APIを無効にする。[POINTERLOCK]

サンドボックス化されたスクリプトブラウジングコンテキストフラグ

このフラグは、スクリプトの実行をブロックする

サンドボックス化された自動機能ブラウジングコンテキストフラグ

このフラグは、自動ビデオ再生自動フォームコントロールフォーカスなどの、自動的に切り替える機能をブロックする。

サンドボックス化されたdocument.domainブラウジングコンテキストフラグ

このフラグは、コンテンツがdocument.domainセッターを使用することから防ぐ。

サンドボックスが補助ブラウジングコンテキストに伝播するフラグ

このフラグは、コンテンツが作成する補助ブラウジングコンテキストがコンテンツのアクティブなサンドボックスフラグセットを継承するのを保証することで、そのコンテンツがサンドボックスをエスケープするのを防ぐ。

サンドボックス化されたモーダルフラグ

このフラグは、コンテンツが以下の機能のいずれかを使用してモーダルダイアログを生成するのを防ぐ:

サンドボックス化された方向ロックブラウジングコンテキストフラグ

このフラグは、画面の向きをロックする機能を無効にする。[SCREENORIENTATION]

サンドボックス化されたプレゼンテーションブラウジングコンテキストフラグ

このフラグはPresentation APIを無効にする。 [PRESENTATION]

サンドボックス化されたダウンロードブラウジングコンテキストフラグ

このフラグは、ハイパーリンクのダウンロードまたはダウンロードとして処理されるナビゲーションのいずれを介して、コンテンツがダウンロードを開始またはインスタンス化するのを防ぐ。

When the user agent is to parse a sandboxing directive, given a string input, a sandboxing flag set output, it must run the following steps:

  1. Split input on ASCII whitespace, to obtain tokens.

  2. outputを空にする。

  3. outputに次のフラグを追加する:


すべてのトップレベルブラウジングコンテキストは、ポップアップサンドボックス化 フラグセットを持ち、これはサンドボックス化フラグセットである。ブラウジングコンテキストが作成される場合、そのポップアップサンド化フラグセットは空でなければならない。これは、ブラウジングコンテキストを選択するための規則と、ナビゲーション応答に使用するブラウジングコンテキストを取得するためのアルゴリズムで構成されている。

すべてのiframe要素は、iframeサンドボックス化フラグセットを持ち、これはサンドボックス化フラグセットである。iframeサンドボックス化フラグセットのどのフラグが特定の時間にセットされるかは、iframe要素のsandbox 属性によって決定される。

すべてのDocumentは、アクティブなサンドボックス化フラグセットを持ち、これはサンドボックス化フラグセットである。Documentが作成される場合、そのアクティブなサンドボックス化フラグセットは空でなければならない。それは、ナビゲーションアルゴリズムによって追加される。

ナビゲーションアルゴリズムによって得られるすべてのリソースは、強制サンドボックス化フラグセットを持ち、これはサンドボックス化フラグセットである。デフォルトでリソースは、その強制サンドボックス化フラグセットで設定されるフラグを持たないが、他の仕様は、特定のフラグがセットされていることを定義できる。

具体的には、強制サンドボックス化フラグセットContent Security Policyによって使用される。[CSP]


To determine the creation sandboxing flags for a browsing context browsing context, given null or an element embedder, return the union of the flags that are present in the following sandboxing flag sets:

作成後、ブラウジングコンテキストbrowsing contextサンドボックス化フラグは、browsing contextおよびbrowsing contextコンテナーに与えられた作成サンドボックス化フラグを決定した結果となる。

7.5 生成元をまたいだオープナーポリシー

A cross-origin opener policy value allows a document which is navigated to in a top-level browsing context to force the creation of a new top-level browsing context, and a corresponding group. 可能な値は次のとおり:

"unsafe-none"

これは(現在の)デフォルトであり、文書が別の生成元をまたいだオープナーポリシーを指定しない限り、文書がその前の文書と同じトップレベルブラウジングコンテキストを占有することを意味する。

"same-origin-allow-popups"

これは、前の文書が同じ生成元をまたいだオープナーポリシーを指定しており、それらが同一生成元でない限り、文書の新しいトップレベルブラウジングコンテキストを強制的に作成する。

"same-origin"

これは、"same-origin-allow-popups"と同じように動作するが、作成される補助ブラウジングコンテキストは、同じ生成元をまたいだオープナーポリシーを持つ同一生成元の文書を含める必要があることが追加される。さもなければ、オープナーに非公開で表示される。

"same-origin-plus-COEP"

This behaves the same as "same-origin", with the addition that it sets the (new) top-level browsing context's group's cross-origin isolation mode to one of "logical" or "concrete".

"same-origin-plus-COEP" は、`Cross-Origin-Opener-Policy`ヘッダーで直接設定することはできないが、`Cross-Origin-Opener-Policy: same-origin` と`Cross-Origin-Embedder-Policy: require-corp`の両方を一緒に設定した組み合わせから生じる。

A cross-origin opener policy consists of:

To match cross-origin opener policy values, given a cross-origin opener policy value A, an origin originA, a cross-origin opener policy value B, and an origin originB:

  1. Aが"unsafe-none"かつBが"unsafe-none"である場合、trueを返す。

  2. Aが"unsafe-none"またはBが"unsafe-none"である場合、falseを返す。

  3. ABであり、かつoriginAが"originBをもつ同一生成元である場合、trueを返す。

  4. falseを返す。

7.5.1 ヘッダー

Headers/Cross-Origin-Opener-Policy

Support in all current engines.

Firefox79+Safari🔰 preview+Chrome83+
OperaNoEdge83+
Edge (Legacy)NoInternet ExplorerNo
Firefox Android79+Safari iOSNoChrome Android83+WebView AndroidNoSamsung Internet13.0+Opera AndroidNo

Document生成元をまたいだオープナーポリシーは `Cross-Origin-Opener-Policy`および`Cross-Origin-Opener-Policy-Report-Only` HTTPレスポンスヘッダーから派生する。このヘッダーは構造化されたヘッダーであり、その値はトークンでなければならない。[STRUCTURED-FIELDS]

妥当なトークンの値は、オープナーポリシー値である。トークンはまた、付属のパラメーターを持ってもよい。これらのうち、"report-to"パラメーターは、適切な報告エンドポイントを識別する妥当なURL文字列を持つことができる。[REPORTING]

以下に説明する処理モデルに従って、ユーザーエージェントは、このヘッダーに不正値が含まれている場合、そのヘッダーを無視する。同様に、値がトークンとして解析できない場合、ユーザーエージェントはこのヘッダーを無視する。


To obtain a cross-origin opener policy given a response response and an environment reservedEnvironment:

  1. Let policy be a new cross-origin opener policy.

  2. If reservedEnvironment is a non-secure context, then return policy.

  3. Let value be the result of getting a structured field value given `Cross-Origin-Opener-Policy` and "item" from response's header list.

  4. If parsedItem is not null, then:

    1. If parsedItem[0] is "same-origin", then:

      1. Let coep be the result of obtaining a cross-origin embedder policy from response and reservedEnvironment.

      2. If coep's value is "require-corp", then set policy's value to "same-origin-plus-COEP".

      3. Otherwise, set policy's value to "same-origin".

    2. If parsedItem[0] is "same-origin-allow-popups", then set policy's value to "same-origin-allow-popups".

    3. If parsedItem[1]["report-to"] exists and it is a string, then set policy's reporting endpoint to parsedItem[1]["report-to"].

  5. Set parsedItem to the result of getting a structured field value given `Cross-Origin-Opener-Policy-Report-Only` and "item" from response's header list.

  6. If parsedItem is not null, then:

    1. If parsedItem[0] is "same-origin", then:

      1. Let coep be the result of obtaining a cross-origin embedder policy from response and reservedEnvironment.

      2. If coep's value is "require-corp" or coep's report-only value is "require-corp", then set policy's report-only value to "same-origin-plus-COEP".

        Report only COOP also considers report-only COEP to assign the special "same-origin-plus-COEP" value. This allows developers more freedom in the order of deployment of COOP and COEP.

      3. Otherwise, set policy's report-only value to "same-origin".

    2. If parsedItem[0] is "same-origin-allow-popups", then set policy's report-only value to "same-origin-allow-popups".

    3. If parsedItem[1]["report-to"] exists and it is a string, then set policy's report-only reporting endpoint to parsedItem[1]["report-to"].

  7. Return policy.

7.5.2 Browsing context group switches due to cross-origin opener policy

To check if COOP values require a browsing context group switch, given a boolean isInitialAboutBlank, two origins responseOrigin, activeDocumentNavigationOrigin, and two cross-origin opener policy values responseCOOPValue and activeDocumentCOOPValue:

  1. If the result of matching activeDocumentCOOPValue, activeDocumentNavigationOrigin, responseCOOPValue, and responseOrigin is true, return false.

  2. If all of the following are true:

    then return false.

  3. Return true.

To check if enforcing report-only COOP would require a browsing context group switch, given a boolean isInitialAboutBlank, two origins responseOrigin, activeDocumentNavigationOrigin, and two cross-origin opener policies responseCOOP and activeDocumentCOOP:

  1. If the result of checking if COOP values require a browsing context group switch given isInitialAboutBlank, responseOrigin, activeDocumentNavigationOrigin, responseCOOP's report-only value and activeDocumentCOOPReportOnly's report-only value is false, then return false.

    Matching report-only policies allows a website to specify the same report-only cross-origin opener policy on all its pages and not receive violation reports for navigations between these pages.

  2. If the result of checking if COOP values require a browsing context group switch given isInitialAboutBlank, responseOrigin, activeDocumentNavigationOrigin, responseCOOP's value and activeDocumentCOOPReportOnly's report-only value is true, then return true.

  3. If the result of checking if COOP values require a browsing context group switch given isInitialAboutBlank, responseOrigin, activeDocumentNavigationOrigin, responseCOOP's report-only value and activeDocumentCOOPReportOnly's value is true, then return true.

  4. falseを返す。

A cross-origin opener policy enforcement result is a struct with the following items:

To enforce a response's cross-origin opener policy, given a browsing context browsingContext, a URL responseURL, an origin responseOrigin, a cross-origin opener policy responseCOOP, a cross-origin opener policy enforcement result currentCOOPEnforcementResult, and a referrer referrer:

  1. Let newCOOPEnforcementResult be a new cross-origin opener policy enforcement result whose needs a browsing context group switch is currentCOOPEnforcementResult's needs a browsing context group switch, would need a browsing context group switch due to report-only is currentCOOPEnforcementResult's would need a browsing context group switch due to report-only, url is responseURL, origin is responseOrigin, coop is responseCOOP, and current context is navigation source is true.

  2. Let isInitialAboutBlank be true if browsingContext is still on its initial about:blank Document; otherwise, false.

  3. If isInitialAboutBlank is true and browsingContext's initial URL is null, set browsingContext's initial URL to responseURL.

  4. If the result of checking if COOP values require a browsing context group switch given isInitialAboutBlank, currentCOOPEnforcementResult's cross-origin opener policy's value, currentCOOPEnforcementResult's origin, responseCOOP's value, and responseOrigin is true, then:

    1. Set newCOOPEnforcementResult's needs a browsing context group switch to true.

    2. If browsingContext's group's browsing context set's size is greater than 1, then:

      1. Queue a violation report for browsing context group switch when navigating to a COOP response with responseCOOP, "enforce", responseURL, currentCOOPEnforcementResult's url, currentCOOPEnforcementResult's origin, responseOrigin, and referrer.

      2. Queue a violation report for browsing context group switch when navigating away from a COOP response with currentCOOPEnforcementResult's cross-origin opener policy, "enforce", currentCOOPEnforcementResult's url, responseURL, currentCOOPEnforcementResult's origin, responseOrigin, and currentCOOPEnforcementResult's current context is navigation source.

  5. If the result of checking if enforcing report-only COOP would require a browsing context group switch given isInitialAboutBlank, responseOrigin, currentCOOPEnforcementResult's origin, responseCOOP, and currentCOOPEnforcementResult's cross-origin opener policy, is true, then:

    1. Set result's would need a browsing context group switch due to report-only to true.

    2. If browsingContext's group's browsing context set's size is greater than 1, then:

      1. Queue a violation report for browsing context group switch when navigating to a COOP response with responseCOOP, "reporting", responseURL, currentCOOPEnforcementResult's url, currentCOOPEnforcementResult's origin, responseOrigin, and referrer.

      2. Queue a violation report for browsing context group switch when navigating away from a COOP response with currentCOOPEnforcementResult's cross-origin opener policy, "reporting", currentCOOPEnforcementResult's url, responseURL, currentCOOPEnforcementResult's origin, responseOrigin, and currentCOOPEnforcementResult's current context is navigation source.

  6. Return newCOOPEnforcementResult.

To obtain a browsing context to use for a navigation response, given a browsing contexts browsingContext, a sandboxing flag set sandboxFlags, a cross-origin opener policy navigationCOOP, and a cross-origin opener policy enforcement result coopEnforcementResult:

  1. Assert: browsingContext is a top-level browsing context.

  2. If coopEnforcementResult's needs a browsing context group switch is false, then:

    1. If coopEnforcementResult's would need a browsing context group switch due to report-only is true, set browsing context's virtual browsing context group ID to a new unique identifier.

    2. Return browsingContext.

  3. Let newBrowsingContext be the result of creating a new top-level browsing context.

  4. If navigationCOOP's value is "same-origin-plus-COEP", then set newBrowsingContext's group's cross-origin isolation mode to either "logical" or "concrete". The choice of which is implementation-defined.

    It is difficult on some platforms to provide the security properties required by the cross-origin isolated capability. "concrete" grants access to it and "logical" does not.

  5. If sandboxFlags is not empty, then:

    1. Assert navigationCOOP's value is "unsafe-none".

    2. Assert: newBrowsingContext's popup sandboxing flag set is empty.

    3. Set newBrowsingContext's popup sandboxing flag set to a clone of sandboxFlags.

  6. Discard browsingContext.

    This has no effect on browsingContext's group, unless browsingContext was its sole top-level browsing context. In that case, the user agent might delete the browsing context group which no longer contains any browsing contexts.

  7. Return newBrowsingContext.

The impact of swapping browsing context groups following a navigation is not fully defined. It is currently under discussion in issue #5350.

7.5.3 レポーティング

An accessor-accessed relationship is an enum that describes the relationship between two browsing contexts between which an access happened. It can take the following values:

accessor is opener

The accessor browsing context or one of its ancestors is the opener browsing context of the accessed browsing context's top-level browsing context.

accessor is openee

The accessed browsing context or one of its ancestors is the opener browsing context of the accessor browsing context's top-level browsing context.

none

There is no opener relationship between the accessor browsing context, the accessor browsing context, or any of their ancestors.

To check if an access between two browsing contexts should be reported, given two browsing contexts accessor and accessed, a JavaScript property name P, and an environment settings object environment:

  1. If P is not a cross-origin accessible window property name, then return.

  2. If accessor's active document's origin or any of its ancestors' active document's origins are not same origin with accessor's top-level browsing context's active document's origin, or if accessed's active document's origin or any of its ancestors' active document's origins are not same origin with accessed's top-level browsing context's active document's origin, then return.

    This avoids leaking information about cross-origin iframes to a top level frame with cross-origin opener policy reporting.

  3. If accessor's top-level browsing context's virtual browsing context group ID is accessed's top-level browsing context's virtual browsing context group ID, then return.

  4. Let accessorAccessedRelationship be a new accessor-accessed relationship with value none.

  5. If accessed's top-level browsing context's opener browsing context is accessor or an ancestor of accessor, then set accessorAccessedRelationship to accessor is opener.

  6. If accessor's top-level browsing context's opener browsing context is accessed or an ancestor of accessed, then set accessorAccessedRelationship to accessor is openee.

  7. Queue violation reports for accesses, given accessorAccessedRelationship, accessor's top-level browsing context's active document's cross-origin opener policy, accessed's top-level browsing context's active document's cross-origin opener policy, accessor's active document's URL, accessed's active document's URL, accessor's top-level browsing context's initial URL, accessed's top-level browsing context's initial URL, accessor's active document's origin, accessed's active document's origin, accessor's top-level browsing context's opener origin at creation, accessed's top-level browsing context's opener origin at creation, accessor's top-level browsing context's active document's referrer, accessed's top-level browsing context's active document's referrer, P, and environment.

To sanitize a URL to send in a report given a URL url:

  1. Let sanitizedURL be a copy of url.

  2. Set the username given sanitizedURL and the empty string.

  3. Set the password given sanitizedURL and the empty string.

  4. Return the serialization of sanitizedURL with exclude fragment set to true.

To queue a violation report for browsing context group switch when navigating to a COOP response given a cross-origin opener policy coop, a string disposition, a URL coopURL, a URL previousResponseURL, two origins coopOrigin and previousResponseOrigin, and a referrer referrer:

  1. If coop's reporting endpoint is null, return.

  2. Let coopValue be coop's value.

  3. If disposition is "reporting", then set coopValue to coop's report-only value.

  4. Let serializedReferrer be an empty string.

  5. If referrer is a URL, set serializedReferrer to the serialization of referrer.

  6. Let body be a new object containing the following properties:

    keyvalue
    dispositiondisposition
    effectivePolicycoopValue
    previousResponseURLIf coopOrigin and previousResponseOrigin are same origin this is the sanitization of previousResponseURL, null otherwise.
    referrerserializedReferrer
    type"navigation-to-response"
  7. Queue body as "coop" for coop's reporting endpoint with coopURL.

To queue a violation report for browsing context group switch when navigating away from a COOP response given a cross-origin opener policy coop, a string disposition, a URL coopURL, a URL nextResponseURL, two origins coopOrigin and nextResponseOrigin, and a boolean isCOOPResponseNavigationSource:

  1. If coop's reporting endpoint is null, return.

  2. Let coopValue be coop's value.

  3. If disposition is "reporting", then set coopValue to coop's report-only value.

  4. Let body be a new object containing the following properties:

    keyvalue
    dispositiondisposition
    effectivePolicycoopValue
    nextResponseURLIf coopOrigin and nextResponseOrigin are same origin or isCOOPResponseNavigationSource is true, this is the sanitization of previousResponseURL, null otherwise.
    type"navigation-from-response"
  5. Queue body as "coop" for coop's reporting endpoint with coopURL.

To queue violation reports for accesses, given an accessor-accessed relationship accessorAccessedRelationship, two cross-origin opener policies accessorCOOP and accessedCOOP, four URLs accessorURL, accessedURL, accessorInitialURL, accessedInitialURL, four origins accessorOrigin, accessedOrigin, accessorCreatorOrigin and accessedCreatorOrigin, two referrers accessorReferrer and accessedReferrer, a string propertyName, and an environment settings object environment:

  1. If coop's reporting endpoint is null, return.

  2. Let coopValue be coop's value.

  3. If disposition is "reporting", then set coopValue to coop's report-only value.

  4. If accessorAccessedRelationship is accessor is opener:

    1. Queue a violation report for access to an opened window, given accessorCOOP, accessorURL, accessedURL, accessedInitialURL, accessorOrigin, accessedOrigin, accessedCreatorOrigin, propertyName, and environment.

    2. Queue a violation report for access from the opener, given accessedCOOP, accessedURL, accessorURL, accessedOrigin, accessorOrigin, propertyName, and accessedReferrer.

  5. Otherwise, if accessorAccessedRelationship is accessor is openee:

    1. Queue a violation report for access to the opener, given accessorCOOP, accessorURL, accessedURL, accessorOrigin, accessedOrigin, propertyName, accessorReferrer, and environment.

    2. Queue a violation report for access from an opened window, given accessedCOOP, accessedURL, accessorURL, accessorInitialURL, accessedOrigin, accessorOrigin, accessorCreatorOrigin, and propertyName.

  6. Otherwise:

    1. Queue a violation report for access to another window, given accessorCOOP, accessorURL, accessedURL, accessorOrigin, accessedOrigin, propertyName, and environment

    2. Queue a violation report for access from another window, given accessedCOOP, accessedURL, accessorURL, accessedOrigin, accessorOrigin, and propertyName.

To queue a violation report for access to the opener, given a cross-origin opener policy coop, two URLs coopURL and openerURL, two origins coopOrigin and openerOrigin, a string propertyName, a referrer referrer, and an environment settings object environment:

  1. Let sourceFile, lineNumber and columnNumber be the relevant script URL and problematic position which triggered this report.

  2. Let serializedReferrer be an empty string.

  3. If referrer is a URL, set serializedReferrer to the serialization of referrer.

  4. Let body be a new object containing the following properties:

    keyvalue
    disposition"reporting"
    effectivePolicycoop's report-only value
    propertypropertyName
    openerURLIf coopOrigin and openerOrigin are same origin, this is the sanitization of openerURL, null otherwise.
    referrerserializedReferrer
    sourceFilesourceFile
    lineNumberlineNumber
    columnNumbercolumnNumber
    type"access-to-opener"
  5. Queue body as "coop" for coop's reporting endpoint with coopURL and environment.

To queue a violation report for access to an opened window, given a cross-origin opener policy coop, three URLs coopURL, openedWindowURL and initialWindowURL, three origins coopOrigin, openedWindowOrigin, and openerInitialOrigin, a string propertyName, and an environment settings object environment:

  1. Let sourceFile, lineNumber and columnNumber be the relevant script URL and problematic position which triggered this report.

  2. Let body be a new object containing the following properties:

    keyvalue
    disposition"reporting"
    effectivePolicycoop's report-only value
    propertypropertyName
    openedWindowURLIf coopOrigin and openedWindowOrigin are same origin, this is the sanitization of openedWindowURL, null otherwise.
    openedWindowInitialURLIf coopOrigin and openerInitialOrigin are same origin, this is the sanitization of initialWindowURL, null otherwise.
    sourceFilesourceFile
    lineNumberlineNumber
    columnNumbercolumnNumber
    type"access-to-opener"
  3. Queue body as "coop" for coop's reporting endpoint with coopURL and environment.

To queue a violation report for access to another window, given a cross-origin opener policy coop, two URLs coopURL and otherURL, two origins coopOrigin and otherOrigin, a string propertyName, and an environment settings object environment:

  1. Let sourceFile, lineNumber and columnNumber be the relevant script URL and problematic position which triggered this report.

  2. Let body be a new object containing the following properties:

    keyvalue
    disposition"reporting"
    effectivePolicycoop's report-only value
    propertypropertyName
    otherURLIf coopOrigin and otherOrigin are same origin, this is the sanitization of otherURL, null otherwise.
    sourceFilesourceFile
    lineNumberlineNumber
    columnNumbercolumnNumber
    type"access-to-opener"
  3. Queue body as "coop" for coop's reporting endpoint with coopURL and environment.

To queue a violation report for access from the opener, given a cross-origin opener policy coop, two URLs coopURL and openerURL, two origins coopOrigin and openerOrigin, a string propertyName, and a referrer referrer:

  1. If coop's reporting endpoint is null, return.

  2. Let serializedReferrer be an empty string.

  3. If referrer is a URL, set serializedReferrer to the serialization of referrer.

  4. Let body be a new object containing the following properties:

    keyvalue
    disposition"reporting"
    effectivePolicycoop's report-only value
    propertypropertyName
    openerURLIf coopOrigin and openerOrigin are same origin, this is the sanitization of openerURL, null otherwise.
    referrerserializedReferrer
    type"access-to-opener"
  5. Queue body as "coop" for coop's reporting endpoint with coopURL.

To queue a violation report for access from an opened window, given a cross-origin opener policy coop, three URLs coopURL, openedWindowURL and initialWindowURL, three origins coopOrigin, openedWindowOrigin, and openerInitialOrigin, and a string propertyName:

  1. If coop's reporting endpoint is null, return.

  2. Let body be a new object containing the following properties:

    keyvalue
    disposition"reporting"
    effectivePolicycoopValue
    propertycoop's report-only value
    openedWindowURLIf coopOrigin and openedWindowOrigin are same origin, this is the sanitization of openedWindowURL, null otherwise.
    openedWindowInitialURLIf coopOrigin and openerInitialOrigin are same origin, this is the sanitization of initialWindowURL, null otherwise.
    type"access-to-opener"
  3. Queue body as "coop" for coop's reporting endpoint with coopURL.

To queue a violation report for access from another window, given a cross-origin opener policy coop, two URLs coopURL and otherURL, two origins coopOrigin and otherOrigin, and a string propertyName:

  1. If coop's reporting endpoint is null, return.

  2. Let body be a new object containing the following properties:

    keyvalue
    disposition"reporting"
    effectivePolicycoop's report-only value
    propertypropertyName
    otherURLIf coopOrigin and otherOrigin are same origin, this is the sanitization of otherURL, null otherwise.
    typeaccess-to-opener
  3. Queue body as "coop" for coop's reporting endpoint with coopURL.

7.6 生成元をまたいだ埋め込みポリシー

Headers/Cross-Origin-Embedder-Policy

Support in all current engines.

Firefox79+Safari🔰 preview+Chrome83+
OperaNoEdge83+
Edge (Legacy)NoInternet ExplorerNo
Firefox Android79+Safari iOSNoChrome Android83+WebView AndroidNoSamsung Internet13.0+Opera AndroidNo

埋め込みポリシー値は、リソース所有者から明示的に許可されていない生成元をまたいだリソースの取得を制御する。そのような値は2つある:

"unsafe-none"

これはデフォルトの値である。この値を使用するとき、CORSプロトコルまたは`Cross-Origin-Resource-Policy`ヘッダーを通して明示的な許可を与えることなしに生成元をまたいだリソースをフェッチすることができる。

"require-corp"

この値を使用するとき、生成元をまたいだリソースをフェッチするには、CORSプロトコルまたは`Cross-Origin-Resource-Policy`ヘッダーを通してサーバーの明示的な許可が必要となる。

埋め込みポリシーは次で構成される:

"coep"報告タイプは、値が"coep"となる報告タイプである。これはReportingObserverから可視である。

7.6.1 ヘッダー

`Cross-Origin-Embedder-Policy`および`Cross-Origin-Embedder-Policy-Report-Only` HTTP レスポンスヘッダーフィールドは、サーバーが環境設定オブジェクト埋め込みポリシーを宣言することを可能にする。このヘッダーは構造化されたヘッダーであり、その値はトークンでなければならない。[STRUCTURED-FIELDS]

妥当なトークンの値は、埋め込みポリシー値である。トークンはまた、付属のパラメーターを持ってもよい。これらのうち、"report-to"パラメーターは、適切な報告エンドポイントを識別する妥当なURL文字列を持つことができる。[REPORTING]

処理モデルは、トークンとして解析できないヘッダーの存在下ではオープンに失敗する(デフォルトで"unsafe-none")。これには、与えられた応答に存在する`Cross-Origin-Embedder-Policy`ヘッダーの複数のインスタンスを組み合わせて作成された不注意なリストが含まれる。

`Cross-Origin-Embedder-Policy`最終埋め込みポリシー値
No header delivered"unsafe-none"
`require-corp`"require-corp"
`unknown-value`"unsafe-none"
`require-corp, unknown-value`"unsafe-none"
`unknown-value, unknown-value`"unsafe-none"
`unknown-value, require-corp`"unsafe-none"
`require-corp, require-corp`"unsafe-none"

(同じことが`Cross-Origin-Embedder-Policy-Report-Only`にも適用される。)


To obtain an embedder policy from a response response and an environment environment:

  1. Let policy be a new embedder policy.

  2. If environment is a non-secure context, then return policy.

  3. Let parsedItem be the result of getting a structured field value with `Cross-Origin-Embedder-Policy` and "item" from response's header list.

  4. If parsedItem is non-null and parsedItem[0] is "require-corp":

    1. Set policy's value to "require-corp".

    2. If parsedItem[1]["report-to"] exists, then set policy's endpoint to parsedItem[1]["report-to"].

  5. Set parsedItem to the result of getting a structured field value with `Cross-Origin-Embedder-Policy-Report-Only` and "item" from response's header list.

  6. If parsedItem is non-null and parsedItem[0] is "require-corp":

    1. Set policy's report-only value to "require-corp".

    2. If parsedItem[1]["report-to"] exists, then set policy's report-only reporting endpoint to parsedItem[1]["report-to"].

  7. Return policy.

7.6.2 Embedder policy checks

To check a navigation response's adherence to its embedder policy given a response response, a browsing context target, and an embedder policy responsePolicy:

  1. If target is not a child browsing context, then return true.

  2. Let parentPolicy be target's container document's policy container's embedder policy.

  3. If parentPolicy's report-only value is "require-corp" and responsePolicy's value is "unsafe-none", then queue a cross-origin embedder policy inheritance violation with response, "navigation", parentPolicy's report only reporting endpoint, "reporting", and target's container document's relevant settings object.

  4. If parentPolicy's value is "unsafe-none" or responsePolicy's value is "require-corp", then return true.

  5. Queue a cross-origin embedder policy inheritance violation with response, "navigation", parentPolicy's reporting endpoint, "enforce", and target's container document's relevant settings object.

  6. falseを返す。

To check a global object's embedder policy given a WorkerGlobalScope workerGlobalScope, an environment settings object owner, and a response response:

  1. If workerGlobalScope is not a DedicatedWorkerGlobalScope object, then return true.

  2. Let policy be workerGlobalScope's embedder policy.

  3. Let ownerPolicy be owner's policy container's embedder policy.

  4. If ownerPolicy's report-only value is "require-corp" and policy's value is "unsafe-none", then queue a cross-origin embedder policy inheritance violation with response, "worker initialization", owner's policy's report only reporting endpoint, "reporting", and owner.

  5. If ownerPolicy's value is "unsafe-none" or policy's value is "require-corp", then return true.

  6. Queue a cross-origin embedder policy inheritance violation with response, "worker initialization", owner's policy's reporting endpoint, "enforce", and owner.

  7. falseを返す。

To queue a cross-origin embedder policy inheritance violation given a response response, a string type, a string endpoint, a string disposition, and an environment settings object settings:

  1. Let serialized be the result of serializing a response URL for reporting with response.

  2. Let body be a new object containing the following properties:

    keyvalue
    typetype
    blockedURLserialized
    dispositiondisposition
  3. Queue body as the "coep" report type for endpoint on settings.

7.7 Policy containers

A policy container is a struct containing policies that apply to a Document, a WorkerGlobalScope, or a WorkletGlobalScope. It has the following items:

Move other policies into the policy container.

To clone a policy container given a policy container policyContainer:

  1. Let clone be a new policy container.

  2. For each policy in policyContainer's CSP list, append a copy of policy into clone's CSP list.

  3. Set clone's embedder policy to a copy of policyContainer's embedder policy.

  4. Set clone's referrer policy to policyContainer's referrer policy.

  5. Return clone.

To determine whether a URL url requires storing the policy container in history:

  1. If url's scheme is "blob", then return false.

  2. If url is about:srcdoc, then return false.

  3. If url is local, then return true.

  4. falseを返す。

To create a policy container from a fetch response given a response response and an environment-or-null environment:

  1. If response's URL's scheme is "blob", then return a clone of response's URL's blob URL entry's environment's policy container.

  2. Let result be a new policy container.

  3. Set result's CSP list to the result of parsing a response's Content Security Policies given response.

  4. If environment is non-null, then set result's embedder policy to the result of obtaining an embedder policy given response and environment. Otherwise, set it to "unsafe-none".

  5. Set result's referrer policy to the result of parsing the `Referrer-Policy` header given response. [REFERRERPOLICY]

  6. Return result.

To determine navigation params policy container given a URL responseURL and four policy container-or-nulls historyPolicyContainer, initiatorPolicyContainer, parentPolicyContainer, and responsePolicyContainer:

  1. If historyPolicyContainer is not null, then:

    1. Assert: responseURL requires storing the policy container in history.

    2. Return a clone of historyPolicyContainer.

  2. If responseURL is about:srcdoc, then:

    1. Assert: parentPolicyContainer is not null.

    2. Return a clone of parentPolicyContainer.

  3. If responseURL is local and initiatorPolicyContainer is not null, then return a clone of initiatorPolicyContainer.

  4. If responsePolicyContainer is not null, then return responsePolicyContainer.

  5. Return a new policy container.

To initialize a worker global scope's policy container given a WorkerGlobalScope workerGlobalScope, a response response, and an environment environment:

  1. If workerGlobalScope's url is local but its scheme is not "blob":

    1. Assert: workerGlobalScope's owner set's size is 1.

    2. Set workerGlobalScope's policy container to a clone of workerGlobalScope's owner set[0]'s relevant settings object's policy container.

  2. Otherwise, set workerGlobalScope's policy container to the result of creating a policy container from a fetch response given response and environment.