iframe 認証情報なし: COEP 環境に iframe を簡単に埋め込む

Arthur Sonzogni
Arthur Sonzogni

COEP を使用しているデベロッパーは、自身で COEP を使用しないサードパーティの iframe を埋め込むことができます。

Chrome バージョン 110 以降、iframe 認証情報なしはデフォルトで有効になっています。Cross-Origin-Embedder-Policy(COEP)を使用しているデベロッパーからよく寄せられる苦情(COEP を設定しないサードパーティの iframe の埋め込み)を解決できます。

COEP が必要な理由

一部のウェブ API では、Spectre などのサイドチャネル攻撃のリスクが高まります。このリスクを軽減するため、ブラウザにはクロスオリジン分離と呼ばれるオプトイン ベースの隔離環境が用意されています。この環境には COEP をデプロイする必要があります。クロスオリジン分離により、ウェブサイトで SharedArrayBufferperformance.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 から始まります。同様に、LocalStorageCacheStorageIndexedDB などのストレージ 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 です。

リソース