Cookie の Independent Partitioned State(CHIPS)

デベロッパーが Cookie を「パーティション分割」にオプトインできるようにするCookie ビンをトップレベル サイトごとに分けて作成します。

実装ステータス

対応ブラウザ

  • Chrome: 114。
  • Edge: 114. <ph type="x-smartling-placeholder">
  • Firefox Technology Preview: サポート
  • Safari: サポートされていません。

ソース

<ph type="x-smartling-placeholder">

CHIPS とは

Cookies Having Independent Partitioned State(CHIPS)により、デベロッパーは、トップレベル サイトごとに個別の Cookie JAR を使用してパーティション化されたストレージに Cookie をオプトインし、ユーザーのプライバシーとセキュリティを改善できます。

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

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

2 つの異なるウェブサイト間で料理を共有する方法を示す図。
Cookie のパーティショニングを行わない限り、サードパーティ サービスは、あるトップレベル サイトに埋め込まれた 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 は、最初に設定されたトップレベル サイトの埋め込みコンテキスト内でのみ読み取ることができます。

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

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

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

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

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

ユースケース

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

埋め込みチャット ウィジェットが表示されたウェブサイトを示す図
サードパーティ サービス support.chat.example を埋め込んでいる最上位のサイト Retail.example です。

クロスサイト クッキーを設定できない場合、support.chat.example は、状態を保存するための代替の方法(多くの場合、より複雑な方法)を見つける必要があります。または、最上位のページに埋め込む必要があり、認証 Cookie へのアクセスなど、support.chat.example スクリプトが Retail.example に対する昇格した権限を取得できるため、リスクが発生します。

CHIPS は、パーティショニングされていない Cookie に関連するリスクなしで、クロスサイト Cookie を引き続き使用するための簡単な方法を提供します。

CHIPS のユースケースの例には、以下のような、クロスサイトのサブリソースで 1 つのトップレベル サイトのユーザー アクティビティをスコープとするセッション概念または永続状態が必要となるあらゆるシナリオが含まれます。

  • サードパーティのチャットの埋め込み
  • サードパーティの地図の埋め込み
  • サードパーティの支払いの埋め込み
  • サブリソースの CDN ロード バランシング
  • ヘッドレス CMS プロバイダ
  • 信頼できないユーザー コンテンツを提供するサンドボックス ドメイン(googleusercontent.com や githubusercontent.com など)
  • Cookie を使用して、ファーストパーティ サイトの認証ステータスによってアクセス制御されたコンテンツを配信するサードパーティの CDN(サードパーティの CDN でホストされているソーシャル メディア サイトのプロフィール写真など)
  • リクエストで Cookie を使用するリモート API に依存するフロントエンド フレームワーク
  • パブリッシャーごとにスコープされた状態を必要とする埋め込み広告(そのウェブサイトのユーザーの広告設定をキャプチャする場合など)

CHIPS がオプトイン パーティショニング モデルを使用している理由

パーティション分割されていないサードパーティ Cookie がブラウザによって段階的に廃止されるのに伴い、パーティショニングに対して他にもいくつかのアプローチが試みられています。

Firefox は、ETP Strict モードとプライベート ブラウジング モードではすべてのサードパーティの Cookie をデフォルトでパーティション化すると発表しました。これにより、すべてのクロスサイト Cookie がトップレベル サイトごとにパーティション化されます。ただし、一部のサードパーティ サービスでは、パーティション分割されていないサードパーティ Cookie を想定してサーバーを構築しているため、サードパーティのオプトインなしで Cookie をパーティショニングすると、予期しないバグが発生する可能性があります。

Safari は以前、ヒューリスティックに基づく Cookie のパーティショニングを試しましたが、最終的には完全にブロックすることを選択し、その理由の一つとしてデベロッパーの混乱を挙げました。最近は、オプトインに基づくモデルに関心を示しています

CHIPS がパーティション分割 Cookie の既存の実装と一線を画すのは、サードパーティのオプトインです。(パーティション分割されていない)サードパーティ Cookie が廃止されたら、クロスパーティ リクエストで送信するには、新しい属性を使用して Cookie を設定する必要があります。

サードパーティの Cookie は引き続き存在しますが、Partitioned 属性を使用することにより、より限定的でより安全な種類の Cookie 動作にオプトインできるようになります。CHIPS は、サードパーティ Cookie のない未来にサービスがスムーズに移行できるようにするための重要なステップです。

現在、Cookie は、Cookie を設定したサイトのホスト名またはドメイン、つまりホストキーをキーとしています。

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

CHIPS では、パーティショニングにオプトインする Cookie には、ホストキーとパーティション キーの 2 つのキーが付与されます。

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

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

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

同様に、リクエストのパーティション キーは、リクエストの開始時にブラウザがアクセスしているトップレベル URL のサイトです。ブラウザは、その Cookie と同じパーティション キーを持つリクエストでのみ、Partitioned 属性を持つ 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;
<ph type="x-smartling-placeholder">

CHIPS の代替手段

Storage Access API と関連する関連ウェブサイト セット(RWS)は、ユーザー向けの特定の目的のために、制限付きのクロスサイト Cookie アクセスを可能にするウェブ プラットフォーム メカニズムです。

これらは、クロスサイトのパーティション分割されていないクックへのアクセスが必要な場合に、CHIPS パーティショニングの代わりになります。

複数の関連サイトに埋め込まれたサービスで同じ Cookie を使用する必要がある場合は、Storage Access API と関連ウェブサイト セットの使用を検討してください。

CHIPS は、複数のサイト間で独立したコンポーネントとして機能するサービス機能を提供します。この場合、同じ Cookie を複数のサイト間で使用する必要はありません。サービスがパーティション分割 Cookie を設定した場合、そのパーティション キーはトップレベル サイトになり、同じサービスを使用している他のサイトでその Cookie を使用することはできません。

関連ウェブサイト セットの設計は Storage Access API に依存しており、CHIPS パーティショニングは統合されていません。RWS 内のサイト間での Cookie パーティションの共有に依存するユースケースの場合は、GitHub の問題の例とフィードバックを提供してください。

デモ

このdemoでは、パーティション化された 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. [アプリケーション] タブをクリックします。
  4. [Application] > [Storage] > [Cookies] に移動します。
  5. [https://chips-site-b.glitch.me] をクリックします。

選択した生成元のすべての Cookie が DevTools に表示されます。

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

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

  • __Host-partitioned-cookie に、トップレベル サイト https://chips-site-a.glitch.me のパーティション キーが表示されているはずです。
で確認できます。 <ph type="x-smartling-placeholder">
</ph>
__Host-partitioned-cookie のパーティション キー。
で確認できます。
  1. [サイト B に移動] をクリックします。
  2. DevTools で、[Application] >ストレージ >Cookie
  3. [https://chips-site-b.glitch.me] をクリックします。
サイト B
トップレベルでは、サイト B はパーティション化された Cookie とパーティション化されていない Cookie のすべての Cookie を閲覧できます

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

  • unpartitioned-cookie に空のパーティション キーがあります。
  • __Host-partitioned-cookie Cookie にはパーティション キー https://chips-site-b.glitch.me があります。
で確認できます。 <ph type="x-smartling-placeholder">
</ph>
DevTools の [Application] タブで、トップレベル サイトとして B にアクセスしているときのサイト B からの Cookie。__Host-partitioned-cookie にはパーティション キー https://chips-site-b.glitch.me があります。

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

  1. [サイト A に移動] をクリックします。
  2. [ネットワーク] タブをクリックします。
  3. [https://chips-site-b.glitch.me] をクリックします。
  4. [Cookie] タブをクリックします。

サイト A にアクセスしたときに、トップレベル サイト https://chips-site-a.glitch.me のパーティション キーを含む __Host-partitioned-cookie が表示されます。

サイト B の iframe がサイト A に埋め込まれている場合にアクセスできる Cookie が表示された [ネットワーク] タブ。

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

サイト B iframe でブロックされた Cookie を表示している [ネットワーク] タブ。

[アプリケーション >ストレージ >https://chips-site-b.glitch.me をクリックする Cookie 次のように表示されます。

  • unpartitioned-cookie は空のパーティション キーに置き換えます。
  • パーティション キー https://chips-site-a.glitch.me__Host-partitioned-cookie Cookie。
で確認できます。 <ph type="x-smartling-placeholder">
</ph>
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 を開きます。
  • [アプリケーション] タブをクリックします。
  • [アプリケーション] >ストレージ >Cookie
  • https://chips-site-b.glitch.me を右クリックします。
  • [消去] をクリックします。

リソース