COEP を使用しているデベロッパーは、COEP 自体は使用しないサードパーティの iframe を埋め込むことができるようになりました。
COEP が必要な理由
一部のウェブ API は、Spectre などのサイドチャネル攻撃のリスクを高めます。このリスクを軽減するために、ブラウザにはクロスオリジン分離と呼ばれるオプトインベースの分離環境が用意されています。この環境では、COEP のデプロイが必要になります。これにより、ウェブサイトは SharedArrayBuffer
、performance.measureUserAgentSpecificMemory()
、高精度で解像度の高いタイマーなどの特権機能を使用できるようになります。
クロスオリジン分離を有効にするには、ウェブサイトが次の 2 つの HTTP ヘッダーを送信する必要があります。
Cross-Origin-Embedder-Policy: require-corp
Cross-Origin-Opener-Policy: same-origin
COEP を有効にする際の課題
クロスオリジン分離により、ウェブページのセキュリティが強化され、強力な機能を有効にできますが、COEP のデプロイは難しい場合があります。最大の課題の一つは、すべてのクロスオリジン iframe に COEP と CORP もデプロイする必要があることです。これらのヘッダーのない iframe はブラウザによって読み込まれません。
通常、iframe はサードパーティによって配信されているため、COEP のデプロイは容易ではない場合があります。
匿名 iframe の活用
そこで匿名 iframe の出番です。anonymous
属性を <iframe>
要素に追加すると、iframe は別のエフェメラル ストレージ パーティションから読み込まれ、COEP の制限の対象外になります。
例:
<iframe anonymous src="https://example.com">
iframe は新しいエフェメラル コンテキストで作成され、トップレベルのウェブサイトに関連付けられた Cookie にアクセスできません。空の Cookie ジャーから始まります。同様に、LocalStorage
、CacheStorage
、IndexedDB
などのストレージ API は、新しいエフェメラル パーティションにデータを読み込んで保存します。パーティションのスコープは、現在の最上位ドキュメントと iframe のオリジンです。最上位のドキュメントがアンロードされると、ストレージはクリアされます。
匿名 iframe には COEP 埋め込みルールは適用されません。ただし、毎回新しい空のコンテキストから読み込まれるため、安全性は確保されています。データはパーソナライズされずに読み込まれます。公開データのみが含まれており、攻撃者にとって価値はありません。
デモ
匿名 iframe は https://anonymous-iframe.glitch.me/ で確認できます。
オリジン トライアルに登録する
匿名 iframe がデベロッパーのクロスオリジン分離の導入に役立つように、Chrome バージョン 106 ~ 108 でオリジン トライアルとして匿名 iframe を利用できるようにします。
オリジン トライアルに登録して、ウェブサイトで匿名 iframe を使用できるようにします。
- 送信元のトークンをリクエストします。
- トークンは、次のいずれかの方法で使用します。
- HTML の場合:
html <meta http-equiv="Origin-Trial" content="TOKEN_GOES_HERE">
- JavaScript で:
js const meta = document.createElement('meta'); meta.httpEquiv = 'Origin-Trial'; meta.content = 'TOKEN_GOES_HERE'; document.head.append(meta);
- HTTP ヘッダー:
text Origin-Trial: TOKEN_GOES_HERE
- HTML の場合:
- 匿名の iframe をページに追加します。
html <iframe anonymous src="https://example.com">
この機能についてフィードバックがある場合は、GitHub リポジトリに問題を報告してください。
サードパーティ オリジンのトライアル
オリジン トライアルはサードパーティ スクリプトでも利用できます。つまり、ページに埋め込まれたスクリプトによって有効にできます。
詳しくは、サードパーティ オリジン トライアルに登録する方法をご覧ください。
よくある質問
この機能は他のブラウザにも採用されますか?
<iframe anonymous>
内にネストされた iframe は匿名ですか?
はい。継承されます。iframe が匿名になると、anonymous
属性がなくても、サブツリー全体のすべての iframe に適用されます。
<iframe anonymous>
から作成されたポップアップも匿名ですか?
noopener
が設定されている場合と同様にポップアップが開きます。これらは新しい通常のトップレベル コンテキストから作成され、匿名ではありません。匿名 iframe と通信できません。