1. 7 ウェブページの読み込み
    1. 7.1 サポートコンセプト
      1. 7.1.1 生成元
        1. 7.1.1.1 サイト
        2. 7.1.1.2 同一生成元制限を緩和する
      2. 7.1.2 オリジンキーエージェントクラスター
      3. 7.1.3 生成元をまたいだオープナーポリシー
        1. 7.1.3.1 ヘッダー
      4. 7.1.4 生成元をまたいだ埋め込みポリシー
        1. 7.1.4.1 ヘッダー
      5. 7.1.5 サンドボックス

7 ウェブページの読み込み

7.1 サポートコンセプト

7.1.1 生成元

生成元は、ウェブのセキュリティモデルの基本的な通貨である。生成元を共有するウェブプラットフォーム内の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"となる。

次の表は、2つのタプル生成元同一生成元および同一生成元ドメインである場合の例を示す。

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.1.1.1 サイト

スキームとホストは、スキームASCII文字列)およびホストホスト)のタプルである。

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

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

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

次の表は、2つのタプル生成元スキームレス同一サイトおよび同一サイトである場合の例を示す。

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.1.1.2 同一生成元制限を緩和する
document.domain [ = domain ]

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

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

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

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

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

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

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

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.1.3 生成元をまたいだオープナーポリシー

An 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"

This is the (current) default and means that the document will occupy the same top-level browsing context as its predecessor, unless that document specified a different opener policy.

"same-origin-allow-popups"

This forces the creation of a new top-level browsing context for the document, unless its predecessor specified the same opener policy and they are same origin.

"same-origin"

This behaves the same as "same-origin-allow-popups", with the addition that any auxiliary browsing context created needs to contain same origin documents that also have the same opener policy or it will appear closed to the opener.

"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` ヘッダー(値はクロスオリジン分離と互換)を一緒に設定した結果である。

"noopener-allow-popups"

This forces the creation of a new top-level browsing context for the document, regardless of its predecessor.

While including a noopener-allow-popups value severs the opener relationship between the document on which it is applied and its opener, it does not create a robust security boundary between those same-origin documents.

Other risks from same-origin applications include:

  • Same-origin requests fetching the document's content — could be mitigated through Fetch Metadata filtering. [FETCHMETADATA]

  • Same-origin framing - could be mitigated through X-Frame-Options or CSP frame-ancestors.

  • JavaScript accessible cookies - can be mitigated by ensuring all cookies are httponly.

  • localStorage access to sensitive data.

  • Service worker installation.

  • Cache API manipulation or access to sensitive data. [SW]

  • postMessage or BroadcastChannel messaging that exposes sensitive information.

  • Autofill which may not require user interaction for same-origin documents.

Developers using noopener-allow-popups need to make sure that their sensitive applications don't rely on client-side features accessible to other same-origin documents, e.g., localStorage and other client-side storage APIs, BroadcastChannel and related same-origin communication mechanisms. They also need to make sure that their server-side endpoints don't return sensitive data to non-navigation requests, whose response content is accessible to same-origin documents.

7.1.3.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]

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

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

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"である場合、生成元をまたいだ分離と互換性がある。

7.1.4.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`にも適用される。)

7.1.5 サンドボックス

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

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

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

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

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

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

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

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

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

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

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

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

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

This flag forces content into an opaque origin, thus preventing it from accessing other content from the same origin.

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

このフラグは、非フェッチスキームへのナビゲーションが外部ソフトウェアに渡されるのを妨げる。