Cookie の Independent Partitioned State(CHIPS)

デベロッパーがトップレベル サイトごとに別個の Cookie jar を持つ「パーティション化された」ストレージに Cookie をオプトインできるようにします。

実装ステータス

対応ブラウザ

  • 114
  • 114
  • x
  • x

ソース

CHIPS とは

Cookie の Independent Partitioned State(CHIPS)を使用すると、デベロッパーはトップレベル サイトごとに個別の Cookie jar を使用して、Cookie をパーティション分割ストレージにオプトインできるため、ユーザーのプライバシーとセキュリティが向上します。

パーティショニングを行わないと、サードパーティ Cookie により、サービスは多くの無関係なトップレベル サイトからユーザーを追跡し、ユーザーの情報を結合できるようになります。これを「クロスサイト トラッキング」と呼びます。

ブラウザでは、パーティション分割されていないサードパーティ Cookie の段階的廃止が進んでいます。そのため、サードパーティ Cookie がブロックされている場合、iframe などのクロスサイト コンテキストから Cookie を読み書きする唯一の方法は、CHIPS、Storage Access API関連ウェブサイト セットとなります。

2 つの異なるウェブサイト間で料理を共有する方法を示す図。
Cookie パーティション分割を行わないと、サードパーティ サービスが 1 つのトップレベル サイトに埋め込まれている場合に Cookie を設定し、別のトップレベル サイトに埋め込まれている場合に同じ Cookie にアクセスできます。

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 が最初に設定されたトップレベル サイトに同じ埋め込みコンテキスト内でのみ読み取られます。

共通のサードパーティを埋め込む 2 つの異なるウェブサイトが、そのサードパーティの Cookie を共有しなくなることを示す図。
Cookie パーティショニングにより、あるトップレベル サイトに埋め込まれている場合に Cookie を設定するサードパーティ サービスは、別のトップレベル サイトに埋め込まれている場合に、そのサードパーティ サービスと同じ Cookie にアクセスできなくなります。

パーティション化された Cookie では、ユーザーがサイト A にアクセスし、サイト C の埋め込みコンテンツによって Partitioned 属性が設定された Cookie が設定されると、この Cookie はサイト A への埋め込み時にサイト C が設定した Cookie 専用のパーティション化された jar に保存されます。ブラウザは、トップレベル サイトが A の場合にのみ Cookie を送信します。

ユーザーが新しいサイト(サイト B など)にアクセスすると、埋め込み C フレームはサイト A に C を埋め込んだときに設定された Cookie を受信しません。

ユーザーがトップレベル ウェブサイトとしてサイト C にアクセスした場合、分割された Cookie が A に埋め込まれたときに設定されたパーティション化された Cookie も、このリクエストでは送信されません。

2 つの異なるウェブサイトに同じサードパーティが埋め込まれている場合に Cookie が共有されないことを示す図。
Cookie パーティショニングを使用すると、サイトに埋め込まれた Cookie を設定するサードパーティ サービスは、ユーザーがトップレベル サイトとしてサービスにアクセスしても、同じ Cookie にアクセスできません。

ユースケース

たとえば、サイト retail.example はサードパーティ サービス support.chat.example と連携して、サポート チャット ボックスをサイトに埋め込むことができます。現在、埋め込み可能なチャット サービスの多くは Cookie を使用して状態を保存しています。

チャット ウィジェットを埋め込んだウェブサイトを示す図
サードパーティ サービス support.chat.example を埋め込むトップレベル サイト Retail.example。

クロスサイト 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 を設定したサイトのホスト名またはドメイン、つまり「ホストキー」をキーとしています。

たとえば、https://support.chat.example からの Cookie の場合、ホストキーは ("support.chat.example") です。

CHIPS では、パーティショニングを有効にした Cookie は、ホストキーとパーティション キーのダブルキーになります。

Cookie のパーティション キーは、Cookie を設定したエンドポイントに対するリクエストの開始時にブラウザがアクセスしていたトップレベル URL のサイト(スキームと登録可能なドメイン)です。

上記の例では、https://support.chat.examplehttps://retail.example に埋め込まれており、トップレベル URL は https://retail.example です。

その場合のパーティション キーは ("https", "retail.example") です。

同様に、リクエストのパーティション キーは、リクエストの開始時にブラウザがアクセスしている最上位 URL のサイトです。ブラウザは、Partitioned 属性を含む Cookie を、その Cookie と同じパーティション キーを持つリクエストでのみ送信する必要があります。

前の例の Cookie キーは、CHIPS の前と後は次のようになります。

サイト A と埋め込みサイト C はパーティション化された Cookie を共有しています。埋め込まれていない場合、サイト C はパーティション化された Cookie にアクセスできません。
サイト A と埋め込みサイト C はパーティション化された Cookie を共有しています。埋め込まれていない場合、サイト C はパーティション化された Cookie にアクセスできません。

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 を設定してアクセスできます。

サイト A とサイト B
左: サードパーティ Cookie がブロックされています。右: サードパーティ Cookie が許可されています。

前提条件

  1. Chrome 118 以降。
  2. chrome://flags/#test-third-party-cookie-phaseout にアクセスして、この設定を有効にしてください

DevTools を使用してパーティション化された Cookie を検査する

  1. https://chips-site-a.glitch.me にアクセスします。
  2. Control+Shift+J(Mac の場合は Command+Option+J)を押して DevTools を開きます。
  3. [Application] タブをクリックします。
  4. [アプリケーション] > [ストレージ] > [Cookie] に移動します。
  5. [https://chips-site-b.glitch.me] をクリックします。

DevTools に、選択したオリジンのすべての Cookie が表示されます。

DevTools の [Application] タブに表示されたサイト B の Cookie。

サイト B では、クロスサイト コンテキストでのみパーティション化された Cookie を設定できます。パーティション分割されていない Cookie はブロックされます。

  • __Host-partitioned-cookie は、トップレベル サイト https://chips-site-a.glitch.me のパーティション キーとともに表示されます。
__Host-partitioned-cookie のパーティション キー。
  1. [サイト B に移動] をクリックします。
  2. DevTools で、[Application] > [Storage] > [Cookies] に移動します。
  3. [https://chips-site-b.glitch.me] をクリックします。
サイト B
トップレベルでは、サイト B はすべて Cookie(パーティション分割と分割なし)を確認できます

このシナリオでは、トップレベル コンテキストでサイト B にアクセスしているので、両方の Cookie を設定してアクセスできます。

  • unpartitioned-cookie には空のパーティション キーがあります。
  • __Host-partitioned-cookie Cookie にはパーティション キー https://chips-site-b.glitch.me があります。
最上位サイトとして B にアクセスしたときの、DevTools の [Application] タブでのサイト B からの Cookie。__Host-partitioned-cookie にはパーティション キー https://chips-site-b.glitch.me があります。

サイト A に戻ると、unpartitioned-cookie はブラウザに保存されますが、サイト A からはアクセスできなくなります。

  1. [Go to Site A] をクリックします。
  2. [Network] タブをクリックします。
  3. [https://chips-site-b.glitch.me] をクリックします。
  4. [Cookie] タブをクリックします。

サイト A では、トップレベル サイト https://chips-site-a.glitch.me のパーティション キーを持つ __Host-partitioned-cookie が表示されます。

サイト B の iframe からの Cookie が表示されている [ネットワーク] タブ(サイト A に埋め込まれている場合にアクセス可能)

[除外された Cookie リクエストを表示] をオンにすると、パーティション分割されていない Cookie がブロックされていることが DevTools に表示されます。この Cookie は黄色でハイライト表示され、[この Cookie はユーザー設定によりブロックされました] というツールチップが表示されます。

サイト B の iframe からブロックされた Cookie を示す [ネットワーク] タブ。

[Application] > [Storage] > [Cookies]https://chips-site-b.glitch.me をクリックすると、次のように表示されます。

  • unpartitioned-cookie は、空のパーティション キーに置き換えます。
  • パーティション キー https://chips-site-a.glitch.me を持つ __Host-partitioned-cookie Cookie。
DevTools の [Application] タブに表示されたサイト B の Cookie。__Host-partitioned-cookie Cookie にはパーティション キー https://chips-site-a.glitch.me があります。unpartitioned-cookie が表示されますが、サイト A に埋め込まれている場合、サイト B の iframe からはアクセスできません。

Cookie をクリアする

デモをリセットするには、サイトの Cookie をすべて消去します。

  • Control+Shift+J(Mac の場合は Command+Option+J)を押して DevTools を開きます。
  • [Application] タブをクリックします。
  • [アプリケーション] > [ストレージ] > [Cookie] に移動します。
  • https://chips-site-b.glitch.me を右クリックします。
  • [消去] をクリックします。

リソース