Cookie の Independent Partitioned State(CHIPS)

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

実装ステータス

対応ブラウザ

  • 114
  • 114
  • x
  • x

ソース

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

CHIPS とは

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

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

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

<ph type="x-smartling-placeholder">
</ph> 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 は、最初に設定されたトップレベル サイトの埋め込みコンテキスト内でのみ読み取ることができます。

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

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

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

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

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

ユースケース

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

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

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

CHIPS は、パーティション分割されていない Cookie に伴うリスクを負うことなく、引き続きクロスサイト Cookie を使い続けるための簡単なオプションです。

CHIPS のユースケースの例には、クロスサイト サブリソースで、単一のトップレベル サイトでのユーザーのアクティビティを対象としたセッションまたは永続状態の概念が必要なシナリオが含まれます。次に例を示します。

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

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

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

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

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

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 の適用前と適用後を示しています。

<ph type="x-smartling-placeholder">
</ph> サイト 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 の問題の例とフィードバックを提供してください。

デモ

このデモでは、パーティション化された Cookie の仕組みと、DevTools で Cookie を調べる方法について説明します。

サイト A には、サイト B の iframe が埋め込まれています。この iframe は、JavaScript を使用して 2 つの Cookie(パーティション分割された Cookie とパーティション分割されていない Cookie)を設定します。サイト B には、document.cookie を使用してその場所からアクセスできるすべての Cookie が表示されます。

サードパーティ Cookie がブロックされている場合、サイト B は、クロスサイト コンテキストでのみ Partitioned 属性を持つ Cookie の設定とアクセスが許可されます。

サードパーティ Cookie が許可されている場合、サイト B もパーティション分割されていない Cookie を設定してアクセスできます。

<ph type="x-smartling-placeholder">
</ph> サイト 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. [アプリケーション] >ストレージ >Cookie
  5. [https://chips-site-b.glitch.me] をクリックします。

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

<ph type="x-smartling-placeholder">
</ph>
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] をクリックします。
<ph type="x-smartling-placeholder">
</ph> サイト B
最上位では、サイト B はすべての 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 が表示されます。

<ph type="x-smartling-placeholder">
</ph>
サイト B の iframe がサイト A に埋め込まれている場合にアクセスできる Cookie が表示された [ネットワーク] タブ。

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

<ph type="x-smartling-placeholder">
</ph>
サイト 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 を右クリックします。
  • [消去] をクリックします。

リソース