Google Chrome は SameSite Cookie の動作を適用します ↗。ユーザーを追跡するマーケティング Cookie と、攻撃者が Cookie を盗んだり改ざんしたりできるクロスサイトリクエストフォージェリ(CSRF)から保護するためです。
SameSite Cookie 属性には、次の 3 つのモードがあります。
- Strict: Cookie はファーストパーティ(訪問したドメイン)が作成します。たとえば、
cloudflare.comを訪問すると、Cloudflare がファーストパーティ Cookie を設定します。 - Lax: Cookie は apex ドメイン(
example.comなど)にだけ送られます。たとえば、誰か(blog.example.net)が画像(img.example.com/bar.png)をホットリンクした場合、クライアントはimg.example.comに Cookie を送りません。ファーストパーティでも apex のコンテキストでもないためです。 - None: すべてのリクエストで Cookie を送ります。
Cloudflare Cookie の SameSite 設定は次のとおりです。
| Cloudflare Cookie | SameSite の設定 | HTTPS のみ | Partitioned(CHIPS) |
|---|---|---|---|
__cf_bm |
SameSite=None; Secure |
はい | いいえ |
cf_clearance |
SameSite=None; Secure |
はい | はい |
__cflb |
SameSite=Lax |
いいえ | いいえ |
現時点では、セッションアフィニティ Cookie の SameSite 属性を設定するには、Cloudflare API を使う必要があります(例: Load Balancer を作成する 操作)。
SameSite Cookie 属性の値を設定するには、HTTP リクエストの session_affinity_attributes オブジェクト内に、samesite と secure の JSON 属性を含めます。
この 2 つの属性で使える値は次のとおりです。
samesite 属性:
- 有効な値:
Auto(デフォルト)、Lax、None、Strict。
secure 属性:
- 有効な値:
Auto(デフォルト)、Always、Never。
samesite 属性の Auto は、次のように動作します。
- Always Use HTTPS が有効な場合、セッションアフィニティ Cookie は
Laxの SameSite モードを使います。 - Always Use HTTPS が無効な場合、セッションアフィニティ Cookie は
Noneの SameSite モードを使います。
secure 属性の Auto は、次のように動作します。
- Always Use HTTPS が有効な場合、セッションアフィニティ Cookie の SameSite 属性に
Secureを含めます。 - Always Use HTTPS が無効な場合、セッションアフィニティ Cookie の SameSite 属性に
Secureを含めません。
API リクエストで samesite を None にした場合、secure を Never にはできません。
セッションアフィニティ Cookie で特定の SameSite 設定が必要な場合は、デフォルト動作に頼らず、samesite と secure に Auto 以外の値を指定してください。こうすると、設定変更(Always Use HTTPS)があっても、SameSite Cookie 属性の値は変わりません。
訪問者が カスタムルール または IP Access Rules によって表示された チャレンジ を解くと、訪問者のブラウザーに cf_clearance Cookie が設定されます。cf_clearance Cookie のデフォルトの有効期間は 30 分です。Challenge Passage で設定できます。
Cloudflare は cf_clearance Cookie に SameSite=None を使います。別ホスト名からの訪問者リクエストが、後続のチャレンジやエラーに遭わないようにするためです。SameSite=None を使う場合は、Secure フラグと一緒に設定する必要があります。
Secure フラグを使うには、Cookie を HTTPS 接続で送る必要があります。サイトの一部でも HTTP を使っていると、cf_clearance Cookie は SameSite=Lax になり、サイトが正しく動かないことがあります。
解消するには、サイトのトラフィックを HTTPS に移します。この目的で使える Cloudflare の機能は次の 2 つです。
Cloudflare は cf_clearance Cookie(および Challenge Platform が使う内部の cf_chl_* Cookie)に Partitioned 属性を設定します。Cookies Having Independent Partitioned State(CHIPS)↗ ↗ に準拠するためです。
CHIPS では、サードパーティコンテキスト(iframe 内やクロスサイトのサブリソースなど)で設定した Cookie は、トップレベルサイトをキーにしたパーティションに保存されます。サードパーティを埋め込むすべてのサイトで共有されません。サードパーティ Cookie をブロックする Chromium 系ブラウザーでは、そうしなければ壊れるクロスサイト埋め込みのチャレンジ状態を保てます。CHIPS を実装していないブラウザーでは、Partitioned 属性は無視され、動作は変わりません。
Partitioned 属性は __cf_bm には付きません。
cf_clearance はパーティション化されるため、あるトップレベルコンテキストで得たクリアランスは、別のトップレベルコンテキストでは再利用されません。サイトを直接閲覧してチャレンジを通過した訪問者でも、そのサイトを埋め込む別サイトへクリアランスは自動では持ち込まれません。逆も同様です。これは CHIPS の意図した動作です。
Partitioned 属性が効くのは、あわせて SameSite=None; Secure が付いた Cookie だけです。サイトのトラフィックをすべて HTTPS で配信していない場合、cf_clearance Cookie は SameSite=Lax にフォールバックします(SameSite と cf_clearance Cookie の既知の問題 を参照)。このとき Partitioned 属性は効果がありません。