1. 7.3 生成元
      1. 7.3.1 Sites
      2. 7.3.2 同一生成元制限を緩和する
      3. 7.3.3 オリジンキーエージェントクラスター
    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を介してのみ変更できる。

("https", "xn--maraa-rta.example", null, null)の シリアライゼーションは"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 サイト

A scheme-and-host is a tuple of a scheme (an ASCII string) and a host (a host).

サイト不透明な生成元またはscheme-and-hostである。

同一生成元および同一origin-domainの概念とは異なり、スキームレスで同じサイトおよび同じサイトの場合、ポートおよびドメインコンポーネントは無視される。

URLで説明される理由により、同一生成元チェックを優先して、可能な場合は同じサイトおよびスキームレスで同じサイトの概念を回避すべきである。

wildlife.museummuseum、およびcom公開サフィックスであり、example.comはそうではない:

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")
("https", "example.com")("https", "example.com.")

(ここではポートおよびドメインのコンポーネントは考慮されていないため、省略している。)

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

document.domain [ = domain ]

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

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

サンドボックス化されたiframe不透明な生成元をもつDocumentブラウジングコンテキストのないDocument、および"document-domain"機能が無効になっている場合、セッターは"SecurityError"例外を投げる。crossOriginIsolatedまたはoriginAgentClusterがtrueを返す場合、セッターは何もしない。

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

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

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

7.3.3 オリジンキーエージェントクラスター

window.originAgentCluster

このセクションで説明されている方法で、このWindowオリジンキーエージェントクラスターに属す場合はtrueを返す。

セキュアなコンテキストで配信されたDocumentは、`Origin-Agent-Cluster` HTTPレスポンスヘッダーを使用して、オリジンキーエージェントクラスターに配置するように要求することができる。このヘッダーは構造化されたヘッダーであり、その値は真偽値でなければらない。[STRUCTURED-FIELDS]

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

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

ブラウジングコンテキストグループ内では、`Origin-Agent-Cluster`ヘッダーは、たとえ一方がヘッダーを送信し、他方が送信しない場合でも、同一生成元のDocumentオブジェクトが異なるエージェントクラスターで終わる原因にはならないことに注意する。

つまり、originAgentClusterゲッターは、同じブラウジングコンテキストグループ内の以前にロードされた同一生成元のページでヘッダーが省略されていた場合、たとえヘッダーが設定されていても、falseを返すことができるということである。同様に、ヘッダーが設定されていなくてもtrueを返すことができる。

不透明な生成元をもつDocumentは、無条件に生成元が分離されているとみなすことができる。その場合、ヘッダーは効果がなく、かつoriginAgentClusterゲッターは常にtrueを返すだろう。

同様に、エージェントクラスタークロスオリジン分離モードが"none"ではないDocumentは、自動的にオリジンキーが設定される。生成元をまたいだ分離を達成するために使用される`Cross-Origin-Opener-Policy`および`Cross-Origin-Embedder-Policy`ヘッダーは、同じアドレス空間内のすべてのものがそこに存在することを保証することを目的としているため、`Origin-Agent-Cluster`ヘッダーは、リソースの割り当てに関する実装への追加のヒントとして有用であるかもしれない。しかし、それを追加しても、著者のコードに追加の目に見える影響はない。

7.4 サンドボックス

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

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

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

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

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

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

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

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

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

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

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

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

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

このフラグは、embed要素object要素を使用するか、またはネストされたブラウジングコンテキストナビゲーションを介するかに関係なく、コンテンツがプラグインをインスタンス化できないようにする。

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

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

このフラグはまた、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]


nullまたは要素embedderを指定して、ブラウジングコンテキストbrowsing context作成サンドボックスフラグを決定するには、次のサンドボックスフラグセットに存在するフラグの和集合を返す。

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

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

生成元をまたいだオープナーポリシー値は、トップレベルブラウジングコンテキストにナビゲートされたドキュメントに対し、新しいトップレベルブラウジングコンテキストおよび、それに対応するグループの作成を強制できる。可能な値は次のとおり:

"unsafe-none"

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

"same-origin-allow-popups"

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

"same-origin"

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

"same-origin-plus-COEP"

これは"same-origin"と同じように動作するが、(新しい)トップレベルブラウジングコンテキストグループ生成元をまたいだ分離を"logical"または"concrete"のいずれかに設定することが追加される。

"same-origin-plus-COEP"は`Cross-Origin-Opener-Policy`ヘッダーで直接設定することはできないが、`Cross-Origin-Opener-Policy: same-origin`と`Cross-Origin-Embedder-Policy` ヘッダー(値はクロスオリジン分離と互換)を一緒に設定した結果である。

生成元をまたいだオープナーポリシーは、次のもので構成される:

生成元をまたいだオープナーポリシー値と一致するには、生成元をまたいだオープナーポリシーA生成元originA生成元をまたいだオープナーポリシーB生成元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+Safari15.2+Chrome83+
OperaNoEdge83+
Edge (Legacy)?Internet ExplorerNo
Firefox Android?Safari iOS?Chrome Android?WebView AndroidNoSamsung Internet?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 compatible with cross-origin isolation, 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 compatible with cross-origin isolation or coep's report-only value is compatible with cross-origin isolation, 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 and 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 context browsingContext, a sandboxing flag set sandboxFlags, a cross-origin opener policy navigationCOOP, and a cross-origin opener policy enforcement result coopEnforcementResult:

  1. If browsingContext is not a top-level browsing context, return browsingContext.

  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+Safari15.2+Chrome83+
Opera?Edge83+
Edge (Legacy)?Internet ExplorerNo
Firefox Android?Safari iOS?Chrome Android?WebView Android86+Samsung Internet?Opera Android?

埋め込みポリシー値は、リソース所有者からの明示的な許可なしに、生成元をまたいだリソースのフェッチを制御する3つの文字列の1つである。

"unsafe-none"

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

"require-corp"

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

"credentialless"

この値を使用する場合、生成元をまたいだno-CORSリソースをフェッチすると、クレデンシャルが省略される。代わりに、明示的な`Cross-Origin-Resource-Policy`ヘッダーは必要ない。クレデンシャルを使用して送信されるその他のリクエストには、CORSプロトコルまたは `Cross-Origin-Resource-Policy`ヘッダーを介したサーバーの明示的な権限が必要である。

"credentialless"をサポートする前に、実装者は次の両方をサポートすることを強く勧める:

そうでなければ、攻撃者は、生成元をまたいだ分離機能を使用して、クライアントのネットワーク位置を利用して非公開リソースを読み取ることを可能にする。

エンベッダーポリシー値は、"credentialless"または"require-corp"である場合、生成元をまたいだ分離と互換性がある。

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

"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 compatible with cross-origin isolation:

    1. Set policy's value to parsedItem[0].

    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 compatible with cross-origin isolation:

    1. Set policy's report only value to parsedItem[0].

    2. If parsedItem[1]["report-to"] exists, then set policy's 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 compatible with cross-origin isolation and responsePolicy's value is not, 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 not compatible with cross-origin isolation or responsePolicy's value is compatible with cross-origin isolation, 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 compatible with cross-origin isolation and policy's value is not, 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 not compatible with cross-origin isolation or policy's value is compatible with cross-origin isolation, 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 local, then return true.

  3. 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.