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

COEP:credentiallessrequire-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 から始まります。同様に、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 になります。

リソース