COEP を使用するデベロッパーは、COEP 自体を使用しないサードパーティの iframe を埋め込むことができるようになりました。
Chrome バージョン 110 以降、iframe 認証情報なしはデフォルトで有効になっています。これにより、Cross-Origin-Embedder-Policy(COEP)を担当しているデベロッパーからよく寄せられる、COEP を設定しないサードパーティの iframe の埋め込みという問題を解決します。
COEP が必要な理由
一部のウェブ API では、Spectre などのサイドチャネル攻撃のリスクが高まります。このリスクを軽減するため、各ブラウザでは「クロスオリジン分離」と呼ばれる、オプトイン ベースの隔離環境が用意されています。この環境では COEP をデプロイする必要があります。クロスオリジン分離により、ウェブサイトで SharedArrayBuffer
、performance.measureUserAgentSpecificMemory()
、高精度タイマーなどの特権機能を解像度で使用できるようになりました。
クロスオリジン分離を有効にするには、ウェブサイトで次の HTTP ヘッダーを送信する必要があります。
Cross-Origin-Embedder-Policy: require-corp
Cross-Origin-Opener-Policy: same-origin
COEP:credentialless を require-corp
の代わりに使用することもできます。詳しくは、こちらのドキュメントをご覧ください。
COEP を有効にする際の課題
クロスオリジン分離により、ウェブページのセキュリティが向上し、強力な機能を有効にすることができます。ただし、COEP のデプロイは困難です。最大の課題の 1 つは、すべてのクロスオリジン iframe で COEP と CORP をデプロイする必要があることです。これらのヘッダーのない iframe は、ブラウザで読み込まれません。
iframe の認証情報を使用しない
COEP を設定しないサードパーティの iframe を埋め込むため、<iframe credentialless>
を導入しています。credentialless
属性を <iframe>
要素に追加すると、iframe は別の空のコンテキストから読み込まれます。特に、Cookie なしで読み込まれます。これにより、COEP 制限を解除できます。
例:
<iframe credentialless src="https://example.com">
この iframe は新しい一時的なコンテキストで作成され、最上位のウェブサイトに関連付けられている Cookie にはアクセスできません。代わりに、空の Cookie jar から始まります。同様に、LocalStorage、CacheStorage、IndexedDB などのストレージ API は、新しいエフェメラル パーティションにデータを読み込んで保存します。パーティションのスコープは、現在の最上位ドキュメントと iframe のオリジンの両方に設定されます。最上位のドキュメントがアンロードされると、このストレージはすべて消去されます。
認証情報のない iframe には、COEP 埋め込みルールは適用されません。それでも安全です。毎回新しい空のコンテキストから読み込まれるため、攻撃者が狙うパーソナライズされたデータを含めることはできません。iframe に一般公開データしか含まれていない場合、攻撃者にとって価値はありません。
デモ
認証情報のない iframe のデモをご確認ください。
よくある質問
この機能は他のブラウザにも導入されますか?
認証情報のない <iframe credentialless>
内に <iframe>
がネストされていますか?
はい。これは継承されます。認証情報のない iframe は、credentialless
属性がなくても、サブツリー内のすべての iframe に適用されます。
<iframe credentialless>
から作成されたポップアップも認証情報なしですか?
ポップアップは noopener
が設定されているかのように開きます。これらは新しい通常のトップレベル コンテキストで作成され、認証情報が必要ではありません。認証情報のない iframe とは通信できません。
ドキュメントが認証情報のない iframe に埋め込まれていることを検出するには、どうすればよいですか?
認証情報のない iframe 内で window.credentialless
は true になり、それ以外の場合は false です。<iframe credentialless>
をサポートしていないウェブブラウザでは、この値は undefined
になります。