Skip to content

非公式本サイトは非公式の日本語ドキュメントであり、Cloudflare 公式サイトではありません。最新情報はdevelopers.cloudflare.comをご確認ください。

Cloudflare と SameSite Cookie の相互作用

最終更新 Markdown で表示Agent セットアップ

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 CookieSameSite 設定は次のとおりです。

Cloudflare Cookie SameSite の設定 HTTPS のみ Partitioned(CHIPS)
__cf_bm SameSite=None; Secure はい いいえ
cf_clearance SameSite=None; Secure はい はい
__cflb SameSite=Lax いいえ いいえ

現時点では、セッションアフィニティ CookieSameSite 属性を設定するには、Cloudflare API を使う必要があります(例: Load Balancer を作成する 操作)。

SameSite Cookie 属性の値を設定するには、HTTP リクエストの session_affinity_attributes オブジェクト内に、samesitesecure の JSON 属性を含めます。

この 2 つの属性で使える値は次のとおりです。

samesite 属性:

  • 有効な値: Auto(デフォルト)、LaxNoneStrict

secure 属性:

  • 有効な値: Auto(デフォルト)、AlwaysNever

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 リクエストで samesiteNone にした場合、secureNever にはできません。

セッションアフィニティ Cookie で特定の SameSite 設定が必要な場合は、デフォルト動作に頼らず、samesitesecureAuto 以外の値を指定してください。こうすると、設定変更(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 つです。


パーティション化された Cookie(CHIPS)と cf_clearance

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 が必要

Partitioned 属性が効くのは、あわせて SameSite=None; Secure が付いた Cookie だけです。サイトのトラフィックをすべて HTTPS で配信していない場合、cf_clearance Cookie は SameSite=Lax にフォールバックします(SameSite と cf_clearance Cookie の既知の問題 を参照)。このとき Partitioned 属性は効果がありません。


関連リソース

役に立ちましたか?