デベロッパーは、トップレベル サイト別のストレージに「パーティション化して」保存される Cookie にオプトインできます。
実装ステータス
- Chrome 114 以降ではデフォルトでサポートされています。
- Chrome 100 ~ 116 でオリジン トライアルが利用可能になりました。
- テストの目的とリリースの目的を確認します。
CHIPS とは
Cookies Having Independent Partitioned State(CHIPS)により、デベロッパーは、トップレベル サイトごとに個別の Cookie の格納場所を使用して、Cookie をパーティショニングされたストレージに取り込むことができます。これにより、ユーザーのプライバシーとセキュリティが向上します。
パーティショニングがない場合、サードパーティのサービスは Cookie を使用することにより、多くの無関係なトップレベル サイトでユーザーをトラッキングし、それらの情報を結合できます。いわゆる「クロスサイト トラッキング」です。
サードパーティ Cookie がブロックされている場合、CHIPS、Storage Access API、関連ウェブサイト セットは、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 フレームでは、C がサイト A に埋め込まれている場合に設定された Cookie を受け取ることはありません。
ユーザーがトップレベル サイトとしてのサイト C にアクセスした場合も、C が A に埋め込まれている場合に設定されたパーティション化された Cookie がリクエストで送信されることはありません。
ユースケース
たとえば、サイト retail.example で、サードパーティのサービス support.chat.example を使用してサイトにチャット サポート用のボックスを埋め込むとします。現在、埋め込み可能なチャット サービスの多くは Cookie を使用して状態を保存しています。
support.chat.example を埋め込んでいるトップレベル サイト retail.example。クロスサイト Cookie を設定できない場合、support.chat.example は状態を保存するための代替手段(多くの場合、より複雑な方法)を見つける必要があります。また、トップレベルのページに埋め込むこともできますが、この場合、support.chat.example スクリプトが retail.example で昇格された権限(認証 Cookie にアクセスできるなど)を持てるため、リスクが発生します。
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 のパーティション化を試みましたが、最終的には、デベロッパーの混乱を招くなどの理由により、それらをすべてブロックすることを決めました。最近は、オプトインに基づくモデルに関心を示しています。
すでに実装されている Cookie のパーティション化と CHIPS の違いは、サードパーティのオプトインです。(パーティション化されていない)サードパーティの 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.example が https://retail.example に埋め込まれた上記の例の場合、トップレベル URL は https://retail.example となります。
この場合のパーティション キーは ("https", "retail.example") になります。
同様に、リクエストのパーティション キーは、リクエストの開始時にブラウザがアクセスしているトップレベル URL のサイトになります。ブラウザは、Partitioned 属性が設定された Cookie を、その Cookie と同じパーティション キーを含むリクエストに対してのみ送信する必要があります。
以下は、CHIPS の適用前と適用後で 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 へのアクセスを制限するウェブ プラットフォームのメカニズムです。
これらは、クロスサイトのパーティショニングされていない Cookie へのアクセスが必要な場合の CHIPS パーティショニングの代替手段です。
複数の関連サイトに埋め込まれたサービスで同じ Cookie を利用できるようにする必要がある場合は、Storage Access API と関連ウェブサイト セットの使用を検討してください。
CHIPS を使用すると、サービスが複数のサイトにまたがる分離されたコンポーネントとして機能し、同じ Cookie を複数のサイトで利用する必要がなくなります。サービスがパーティション化された Cookie を設定した場合、そのパーティション キーはトップレベル サイトになり、その Cookie はサービスを使用している他のサイトでは利用できません。
関連ウェブサイト セットの設計は Storage Access API に依存しており、CHIPS パーティショニングとは統合されていません。RWS 内のサイト間で共有される Cookie パーティションに依存するユースケースがある場合は、GitHub の問題で例とフィードバックを提供できます。
デモ
このデモでは、パーティション分割された Cookie の仕組みと、DevTools で Cookie を検査する方法について説明します。
サイト A がサイト B の iframe を埋め込み、サイト B が JavaScript を使用してパーティション化された Cookie とパーティション化されていない Cookie の 2 つの 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)を押して、デベロッパー ツールを開きます。- [アプリケーション] タブをクリックします。
- [Application] > [Storage] > [Cookies] に移動します。
- [
https://chips-site-b.glitch.me] をクリックします。
選択したオリジンのすべての Cookie が DevTools に表示されます。
サイト B はクロスサイト コンテキストでのみパーティション分割された Cookie を設定できます。パーティション分割されていない Cookie はブロックされます。
- 最上位サイトのパーティション キー
https://chips-site-a.glitch.meを持つ__Host-partitioned-cookieが表示されます。
__Host-partitioned-cookie のパーティション キー。- [Go to Site B] をクリックします。
- DevTools で、[Application] > [Storage] > [Cookies] に移動します。
- [
https://chips-site-b.glitch.me] をクリックします。
このシナリオでは、トップレベル コンテキストでサイト B にアクセスしているため、両方の Cookie を設定してアクセスできます。
unpartitioned-cookieに空のパーティション キーがある。__Host-partitioned-cookieCookie にパーティション キーhttps://chips-site-b.glitch.meがあります。
B をトップレベル サイトとしてアクセスしたときに、DevTools の [アプリケーション] タブに表示されるサイト B の Cookie。__Host-partitioned-cookie にはパーティション キー https://chips-site-b.glitch.me があります。
サイト A に戻ると、unpartitioned-cookie はブラウザに保存されますが、サイト A からアクセスすることはできません。
- [Go to Site A] をクリックします。
- [ネットワーク] タブをクリックします。
- [
https://chips-site-b.glitch.me] をクリックします。 - [Cookie] タブをクリックします。
サイト A にアクセスしている間は、最上位サイト https://chips-site-a.glitch.me のパーティション キーを含む __Host-partitioned-cookie が表示されます。
[除外した Cookie リクエストを表示] をオンにすると、パーティショニングされていない Cookie がブロックされていることが DevTools に表示されます。この Cookie は黄色でハイライト表示され、ツールチップに「この Cookie はユーザー設定によりブロックされました」と表示されます。
[アプリケーション] > [ストレージ] > [Cookie] で https://chips-site-b.glitch.me をクリックすると、次の内容が表示されます。
unpartitioned-cookie: 空のパーティション キー。- パーティション キー
https://chips-site-a.glitch.meを含む__Host-partitioned-cookieCookie。
DevTools の [アプリケーション] タブに表示されたサイト 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)を押して、デベロッパー ツールを開きます。- [アプリケーション] タブをクリックします。
- [Application] > [Storage] > [Cookies] に移動します。
https://chips-site-b.glitch.meを右クリックします。- [消去] をクリックします。
リソース
- GitHub: 解説の確認、質問の投稿、意見交換を行えます。