デベロッパーがトップレベル サイトごとに別個の Cookie jar を持つ「パーティション化された」ストレージに Cookie をオプトインできるようにします。
実装ステータス
- Chrome 114 以降ではデフォルトでサポートされています。
- Chrome 100 ~ 116 でオリジン トライアルが利用可能になりました。
- テストの目的とリリースの目的を確認します。
CHIPS とは
Cookie の Independent Partitioned State(CHIPS)を使用すると、デベロッパーはトップレベル サイトごとに個別の Cookie jar を使用して、Cookie をパーティション分割ストレージにオプトインできるため、ユーザーのプライバシーとセキュリティが向上します。
パーティショニングを行わないと、サードパーティ Cookie により、サービスは多くの無関係なトップレベル サイトからユーザーを追跡し、ユーザーの情報を結合できるようになります。これを「クロスサイト トラッキング」と呼びます。
ブラウザでは、パーティション分割されていないサードパーティ Cookie の段階的廃止が進んでいます。そのため、サードパーティ Cookie がブロックされている場合、iframe などのクロスサイト コンテキストから Cookie を読み書きする唯一の方法は、CHIPS、Storage Access API、関連ウェブサイト セットとなります。
CHIPS では、トップレベル コンテキストで分割されたクロスサイト Cookie をサポートする、新しい Cookie 属性 Partitioned
を導入しています。
Set-Cookie ヘッダー:
Set-Cookie: __Host-name=value; Secure; Path=/; SameSite=None; Partitioned;
JavaScript:
document.cookie="__Host-name=value; Secure; Path=/; SameSite=None; Partitioned;"
パーティション化されたサードパーティ Cookie は、最初に設定されたトップレベル サイトに関連付けられ、他からはアクセスできません。第三者サービスによって設定された Cookie は、その Cookie が最初に設定されたトップレベル サイトに同じ埋め込みコンテキスト内でのみ読み取られます。
パーティション化された Cookie では、ユーザーがサイト A にアクセスし、サイト C の埋め込みコンテンツによって Partitioned 属性が設定された Cookie が設定されると、この Cookie はサイト A への埋め込み時にサイト C が設定した Cookie 専用のパーティション化された jar に保存されます。ブラウザは、トップレベル サイトが A の場合にのみ Cookie を送信します。
ユーザーが新しいサイト(サイト B など)にアクセスすると、埋め込み C フレームはサイト A に C を埋め込んだときに設定された Cookie を受信しません。
ユーザーがトップレベル ウェブサイトとしてサイト C にアクセスした場合、分割された Cookie が A に埋め込まれたときに設定されたパーティション化された Cookie も、このリクエストでは送信されません。
ユースケース
たとえば、サイト retail.example
はサードパーティ サービス support.chat.example
と連携して、サポート チャット ボックスをサイトに埋め込むことができます。現在、埋め込み可能なチャット サービスの多くは Cookie を使用して状態を保存しています。
クロスサイト Cookie を設定できないため、support.chat.example
は状態を保存する代わりの(多くの場合は複雑な)メソッドを見つける必要があります。または、トップレベルのページに埋め込む必要があり、認証 Cookie へのアクセスなど、retail.example に対する権限を support.chat.example
スクリプトに昇格させることができるため、リスクが生じます。
CHIPS は、パーティション分割されていない Cookie に伴うリスクなしに、クロスサイト Cookie を引き続き使用するための簡単な方法を提供します。
CHIPS のユースケースの例としては、クロスサイト サブリソースで、単一のトップレベル サイトでのユーザー アクティビティに限定した、セッションまたは永続的な状態の概念を必要とする次のようなシナリオが挙げられます。
- サードパーティ チャットの埋め込み
- サードパーティの地図の埋め込み
- サードパーティ支払いの埋め込み
- サブリソースの CDN ロード バランシング
- ヘッドレス CMS プロバイダ
- 信頼できないユーザー コンテンツを配信するためのサンドボックス ドメイン(googleusercontent.com、githubusercontent.com など)
- Cookie を使用して、ファーストパーティ サイトの認証ステータスによってアクセス制御されたコンテンツを提供するサードパーティの CDN(サードパーティの CDN でホストされているソーシャル メディア サイトのプロフィール写真など)
- リクエストに Cookie を使用するリモート API に依存するフロントエンド フレームワーク
- パブリッシャーごとに状態をスコープする必要がある埋め込み広告(そのウェブサイトでのユーザーの広告表示設定を取得するなど)
CHIPS がオプトイン型のパーティショニング モデルを使用する理由
ブラウザがパーティション分割されていないサードパーティ Cookie を段階的に廃止するなか、パーティショニングに対する他のいくつかのアプローチが試行されています。
Firefox は ETP Strict モードとプライベート ブラウジング モードで、すべてのサードパーティ Cookie をデフォルトでパーティショニングすることを発表しました。これにより、すべてのクロスサイト Cookie はトップレベル サイトごとにパーティション分割されます。ただし、サードパーティのオプトインなしで Cookie をパーティショニングすると、予期しないバグが発生する可能性があります。一部のサードパーティ サービスでは、パーティション分割されていないサードパーティ Cookie を想定するサーバーが構築されているためです。
Safari は以前、ヒューリスティックに基づいて Cookie のパーティショニングを試みましたが、最終的にはデベロッパーの混乱を理由の一つとして挙げ、最終的に完全にブロックすることを選択しました。最近、Safari はオプトイン ベースのモデルに関心を寄せています。
CHIPS がパーティション化された Cookie の既存の実装と異なる点は、サードパーティのオプトインです。(パーティション分割されていない)サードパーティ Cookie が廃止されたら、クロスパーティ リクエストで Cookie を送信するには新しい属性で Cookie を設定する必要があります。
サードパーティ Cookie は引き続き存在しますが、Partitioned
属性を使用すると、より制限の厳しい、より安全な Cookie の動作を有効にできます。CHIPS は、サードパーティ Cookie のない未来にサービスがスムーズに移行できるようにするための重要なステップです。
Cookie パーティショニングの技術的な設計
現在、Cookie は、Cookie を設定したサイトのホスト名またはドメイン、つまり「ホストキー」をキーとしています。
たとえば、https://support.chat.example
からの Cookie の場合、ホストキーは ("support.chat.example")
です。
CHIPS では、パーティショニングを有効にした Cookie は、ホストキーとパーティション キーのダブルキーになります。
Cookie のパーティション キーは、Cookie を設定したエンドポイントに対するリクエストの開始時にブラウザがアクセスしていたトップレベル URL のサイト(スキームと登録可能なドメイン)です。
上記の例では、https://support.chat.example
が https://retail.example
に埋め込まれており、トップレベル URL は https://retail.example
です。
その場合のパーティション キーは ("https", "retail.example")
です。
同様に、リクエストのパーティション キーは、リクエストの開始時にブラウザがアクセスしている最上位 URL のサイトです。ブラウザは、Partitioned
属性を含む Cookie を、その Cookie と同じパーティション キーを持つリクエストでのみ送信する必要があります。
前の例の Cookie キーは、CHIPS の前と後は次のようになります。
CHIPS 導入前
key=("support.chat.example")
CHIPS の後
key={("support.chat.example"),("https", "retail.example")}
セキュリティ設計
セキュリティ対策として、CHIPS では安全なプロトコルによってのみ Cookie が設定され、送信されます。
- パーティション化された Cookie は
Secure
で設定する必要があります。 - パーティション化された Cookie を設定する際は、(登録可能なドメインではなく)ホスト名にバインドされるように、
__Host
接頭辞を使用することをおすすめします。
例:
Set-Cookie: __Host-example=34d8g; SameSite=None; Secure; Path=/; Partitioned;
CHIPS の代替手段
Storage Access API と関連する関連ウェブサイト セット(RWS)は、ユーザー向けの特定の目的のために制限付きのクロスサイト Cookie アクセスを可能にするウェブ プラットフォーム メカニズムです。
これらは CHIPS パーティショニングに代わるもので、クロスサイトのパーティション分割されていないクックへのアクセスが必要です。
複数の関連サイトに埋め込まれているサービスで同じ Cookie を使用する必要がある場合は、Storage Access API と関連ウェブサイト セットを検討してください。
CHIPS は、サービスを複数のサイト間で分離されたコンポーネントとして機能させる機能を提供し、同じ Cookie を複数のサイトで使用可能にする必要はありません。サービスでパーティション化された Cookie が設定されている場合、そのパーティション キーがトップレベル サイトとなり、このサービスを使用する他のサイトでその Cookie が利用できなくなります。
関連ウェブサイト セットの設計は Storage Access API に依存しており、CHIPS パーティショニングとは統合されません。RWS 内の複数のサイトで共有 Cookie パーティションを使用するユースケースがある場合は、GitHub の問題に関する例とフィードバックを提供してください。
デモ
このデモでは、パーティション化された Cookie の仕組みと、DevTools でパーティション分割された Cookie を調べる方法について説明します。
サイト A にはサイト B の iframe が埋め込まれています。この iframe は JavaScript を使用して、2 つの Cookie(パーティション分割された Cookie とパーティション分割されていない Cookie)を設定します。サイト B には、document.cookie
を使用してその場所からアクセス可能なすべての Cookie が表示されます。
サードパーティ Cookie がブロックされると、サイト B は、クロスサイト コンテキストで Partitioned
属性を使用した Cookie の設定とアクセスのみが可能になります。
サードパーティ Cookie が許可されている場合、サイト B もパーティション分割されていない Cookie を設定してアクセスできます。
前提条件
- Chrome 118 以降。
chrome://flags/#test-third-party-cookie-phaseout
にアクセスして、この設定を有効にしてください
DevTools を使用してパーティション化された Cookie を検査する
- https://chips-site-a.glitch.me にアクセスします。
Control+Shift+J
(Mac の場合はCommand+Option+J
)を押して DevTools を開きます。- [Application] タブをクリックします。
- [アプリケーション] > [ストレージ] > [Cookie] に移動します。
- [
https://chips-site-b.glitch.me
] をクリックします。
DevTools に、選択したオリジンのすべての Cookie が表示されます。
サイト B では、クロスサイト コンテキストでのみパーティション化された Cookie を設定できます。パーティション分割されていない Cookie はブロックされます。
__Host-partitioned-cookie
は、トップレベル サイトhttps://chips-site-a.glitch.me
のパーティション キーとともに表示されます。
- [サイト B に移動] をクリックします。
- DevTools で、[Application] > [Storage] > [Cookies] に移動します。
- [
https://chips-site-b.glitch.me
] をクリックします。
このシナリオでは、トップレベル コンテキストでサイト B にアクセスしているので、両方の Cookie を設定してアクセスできます。
unpartitioned-cookie
には空のパーティション キーがあります。__Host-partitioned-cookie
Cookie にはパーティション キーhttps://chips-site-b.glitch.me
があります。
サイト A に戻ると、unpartitioned-cookie
はブラウザに保存されますが、サイト A からはアクセスできなくなります。
- [Go to Site A] をクリックします。
- [Network] タブをクリックします。
- [
https://chips-site-b.glitch.me
] をクリックします。 - [Cookie] タブをクリックします。
サイト A では、トップレベル サイト https://chips-site-a.glitch.me
のパーティション キーを持つ __Host-partitioned-cookie
が表示されます。
[除外された Cookie リクエストを表示] をオンにすると、パーティション分割されていない Cookie がブロックされていることが DevTools に表示されます。この Cookie は黄色でハイライト表示され、[この Cookie はユーザー設定によりブロックされました] というツールチップが表示されます。
[Application] > [Storage] > [Cookies] で https://chips-site-b.glitch.me
をクリックすると、次のように表示されます。
unpartitioned-cookie
は、空のパーティション キーに置き換えます。- パーティション キー
https://chips-site-a.glitch.me
を持つ__Host-partitioned-cookie
Cookie。
Cookie をクリアする
デモをリセットするには、サイトの Cookie をすべて消去します。
Control+Shift+J
(Mac の場合はCommand+Option+J
)を押して DevTools を開きます。- [Application] タブをクリックします。
- [アプリケーション] > [ストレージ] > [Cookie] に移動します。
https://chips-site-b.glitch.me
を右クリックします。- [消去] をクリックします。
リソース
- GitHub: 説明を読み、質問を投稿し、ディスカッションをフォローしてください。
- デベロッパー サポート: プライバシー サンドボックス デベロッパー サポート リポジトリで質問したり、ディスカッションに参加したりできます。