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
require-corp
の代わりに COEP:credentialless を使用することもできます。詳しくは、こちらのドキュメントをご覧ください。
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
です。