デベロッパーが Cookie を「パーティション分割」にオプトインできるようにするCookie ビンをトップレベル サイトごとに分けて作成します。
実装ステータス
- Chrome 114 以降ではデフォルトでサポートされています。
- Chrome 100 ~ 116 でオリジン トライアルが利用可能になりました。
- テストの目的とリリースの目的を確認します。
CHIPS とは
Cookies Having Independent Partitioned State(CHIPS)により、デベロッパーは、トップレベル サイトごとに個別の Cookie JAR を使用してパーティション化されたストレージに Cookie をオプトインし、ユーザーのプライバシーとセキュリティを改善できます。
パーティショニングせずにサードパーティ Cookie を使用すると、サービスはユーザーをトラッキングし、多くの無関係なトップレベル サイトからユーザーの情報を結合できます。これをクロスサイト トラッキングと呼びます。
ブラウザは、パーティション分割されていないサードパーティ Cookie の段階的な廃止を進めており、CHIPS、Storage Access API、関連ウェブサイト セットが、サードパーティ Cookie がブロックされた場合に、iframe などのクロスサイト コンテキストから 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 では、ユーザーがサイト A にアクセスし、サイト C から埋め込まれたコンテンツによって Cookie が Partitioned 属性付きで設定されると、その Cookie は、サイト A に埋め込まれている場合にサイト C で設定された Cookie 専用のパーティション化された格納場所に保存されます。ブラウザでは、トップレベル サイトが A の場合にのみ、その Cookie を送信します。
ユーザーが新しいサイト(サイト B など)にアクセスした際、埋め込まれた C フレームは、サイト A に C が埋め込まれたときに設定された Cookie を受信しません。
ユーザーがトップレベル ウェブサイトとしてサイト C にアクセスした場合、サイト A への埋め込み時に C によって設定されたパーティション分割された Cookie は、そのリクエストでも送信されません。
ユースケース
たとえば、サイト retail.example
でサードパーティ サービス support.chat.example
を利用して、サイトにサポート チャット ボックスを埋め込むことができます。現在、埋め込み可能なチャット サービスの多くは、状態の保存に Cookie を使用しています。
クロスサイト クッキーを設定できない場合、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 は、Cookie を設定したサイトのホスト名またはドメイン、つまりホストキーをキーとしています。
たとえば、https://support.chat.example
からの Cookie の場合、ホストキーは ("support.chat.example")
です。
CHIPS では、パーティショニングにオプトインする Cookie には、ホストキーとパーティション キーの 2 つのキーが付与されます。
Cookie のパーティション キーは、Cookie を設定したエンドポイントへのリクエストの開始時にブラウザがアクセスしていたトップレベル URL のサイト(スキームと登録可能なドメイン)です。
上記の例では、https://support.chat.example
が https://retail.example
に埋め込まれているため、トップレベル URL は https://retail.example
です。
この場合のパーティション キーは ("https", "retail.example")
です。
同様に、リクエストのパーティション キーは、リクエストの開始時にブラウザがアクセスしているトップレベル URL のサイトです。ブラウザは、その Cookie と同じパーティション キーを持つリクエストでのみ、Partitioned
属性を持つ 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;
<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 を設定してアクセスできます。
前提条件
- 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] > [Storage] > [Cookies] に移動します。
- [
https://chips-site-b.glitch.me
] をクリックします。
選択した生成元のすべての Cookie が DevTools に表示されます。
サイト B は、クロスサイト コンテキストでのみパーティション分割 Cookie を設定でき、パーティション分割されていない Cookie はブロックされます。
__Host-partitioned-cookie
に、トップレベル サイトhttps://chips-site-a.glitch.me
のパーティション キーが表示されているはずです。
- [サイト B に移動] をクリックします。
- DevTools で、[Application] >ストレージ >Cookie。
- [
https://chips-site-b.glitch.me
] をクリックします。
このシナリオでは、トップレベルのコンテキストでサイト B にアクセスしているため、次のように両方の Cookie を設定してアクセスできます。
unpartitioned-cookie
に空のパーティション キーがあります。__Host-partitioned-cookie
Cookie にはパーティション キーhttps://chips-site-b.glitch.me
があります。
サイト A に戻ると、unpartitioned-cookie
はブラウザに保存されていますが、サイト A からはアクセスできません。
- [サイト A に移動] をクリックします。
- [ネットワーク] タブをクリックします。
- [
https://chips-site-b.glitch.me
] をクリックします。 - [Cookie] タブをクリックします。
サイト A にアクセスしたときに、トップレベル サイト https://chips-site-a.glitch.me
のパーティション キーを含む __Host-partitioned-cookie
が表示されます。
[除外された Cookie リクエストを表示する] チェックボックスをオンにすると、パーティション分割されていない Cookie がブロックされていることが黄色でハイライト表示され、ツールチップ「この Cookie はユーザーの設定が原因でブロックされました」というツールチップが表示されます。
[アプリケーション >ストレージ >https://chips-site-b.glitch.me
をクリックする Cookie
次のように表示されます。
unpartitioned-cookie
は空のパーティション キーに置き換えます。- パーティション キー
https://chips-site-a.glitch.me
の__Host-partitioned-cookie
Cookie。
Cookie を消去
デモをリセットするには、サイトの Cookie をすべて消去します。
Control+Shift+J
(Mac の場合はCommand+Option+J
)を押して DevTools を開きます。- [アプリケーション] タブをクリックします。
- [アプリケーション] >ストレージ >Cookie。
https://chips-site-b.glitch.me
を右クリックします。- [消去] をクリックします。
リソース
- GitHub: 解説の確認、質問の投稿、ディスカッションのフォローができます。
- デベロッパー サポート: プライバシー サンドボックス デベロッパー サポート リポジトリで、質問したり、ディスカッションに参加したりできます。