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 のデプロイは難しい場合があります。最大の課題の一つは、すべてのクロスオリジン iframe に COEP と CORP をデプロイする必要があることです。これらのヘッダーのない iframe はブラウザによって読み込まれません。

iframe 認証情報なしの解決策

COEP を設定しない場合のサードパーティ iframe の埋め込みをサポートするために、<iframe credentialless> が導入されます。credentialless 属性を <iframe> 要素に追加すると、iframe は別の空のコンテキストから読み込まれます。特に、Cookie なしで読み込まれます。これにより、COEP の制限を削除できます。

例:

<iframe credentialless src="https://example.com">

この iframe は新しいエフェメラル コンテキストで作成され、トップレベルのウェブサイトに関連付けられている Cookie にはアクセスできません。代わりに、空のクッキージャーから始まります。同様に、LocalStorageCacheStorageIndexedDB などのストレージ API は、新しいエフェメラル パーティションにデータを読み込んで保存します。パーティションは、現在の最上位ドキュメントと iframe のオリジンの両方にスコープが設定されます。最上位ドキュメントがアンロードされると、このストレージはすべて消去されます。

認証情報のない iframe には、COEP 埋め込みルールは適用されません。安全性は維持されます。毎回新しい空のコンテナから読み込まれるため、攻撃者が狙うパーソナライズされたデータは含まれません。iframe に公開データのみが含まれている場合、攻撃者にとって価値はありません。

デモ

認証情報なしの iframe のデモをご覧ください。

よくある質問

この機能は他のブラウザでも採用されますか?

<iframe><iframe credentialless> 内にネストされていますか?

はい。継承されます。iframe が認証情報なしになると、credentialless 属性がなくても、サブツリー全体のすべての iframe に適用されます。

<iframe credentialless> から作成されたポップアップも認証情報なしですか?

noopener が設定されている場合と同様にポップアップが開きます。新しい通常の最上位コンテキストで作成され、認証情報なしではありません。認証情報のない iframe と通信できません。

ドキュメントが認証情報のない iframe に埋め込まれていることを検出する方法

window.credentialless は、認証情報のない iframe 内では true、それ以外の場合は false です。<iframe credentialless> をサポートしていないウェブブラウザでは、この値は undefined です。

リソース