CloudflareとのSameSiteクッキーの相互作用
Google ChromeはSameSiteクッキーの動作を強制します ↗ これは、ユーザーを追跡するマーケティングクッキーや、攻撃者がクッキーを盗んだり操作したりすることを可能にするクロスサイトリクエストフォージェリ(CSRF)から保護するためです。
SameSiteクッキー属性には3つの異なるモードがあります:
- Strict: クッキーはファーストパーティ(訪問したドメイン)によって作成されます。例えば、
cloudflare.comを訪問した際にCloudflareによって設定されるファーストパーティクッキーです。 - Lax: クッキーはapexドメイン(例えば
example.com)にのみ送信されます。例えば、誰かが(blog.example.net)画像(img.example.com/bar.png)をホットリンクした場合、クライアントはimg.example.comにクッキーを送信しません。なぜなら、それはファーストパーティでもapexコンテキストでもないからです。 - None: クッキーはすべてのリクエストに送信されます。
CloudflareクッキーのSameSite設定は以下の通りです:
| Cloudflareクッキー | SameSite設定 | HTTPSのみ |
|---|---|---|
__cf_bm | SameSite=None; Secure | はい |
cf_clearance | SameSite=None; Secure | はい |
__cflb | SameSite=Lax | いいえ |
現在、セッションアフィニティクッキーのSameSite属性を設定するには、Cloudflare APIを使用する必要があります(例えば、ロードバランサーの作成操作)。
SameSiteクッキー属性の値を設定するには、HTTPリクエスト内のsession_affinity_attributesオブジェクトにsamesiteおよびsecureのJSON属性を含めます。
これら2つの属性の利用可能な値は以下の通りです:
samesite属性:
- 有効な値:
Auto(デフォルト)、Lax、None、Strict。
secure属性:
- 有効な値:
Auto(デフォルト)、Always、Never。
samesite属性のAuto値は以下の動作を持ちます:
- 常にHTTPSを使用が有効な場合、セッションアフィニティクッキーは
LaxSameSiteモードを使用します。 - 常にHTTPSを使用が無効な場合、セッションアフィニティクッキーは
NoneSameSiteモードを使用します。
secure属性のAuto値は以下の動作を持ちます:
- 常にHTTPSを使用が有効な場合、セッションアフィニティクッキーはSameSite属性に
Secureを含めます。 - 常にHTTPSを使用が無効な場合、セッションアフィニティクッキーはSameSite属性に
Secureを含めません。
APIリクエストでsamesiteをNoneに設定した場合、secureをNeverに設定することはできません。
セッションアフィニティクッキーに特定のSameSite設定が必要な場合、Cloudflareはデフォルトの動作に依存するのではなく、samesiteおよびsecureの値をAuto以外に設定することを推奨します。これにより、SameSiteクッキー属性の値は設定変更(具体的には常にHTTPSを使用)によって変更されることはありません。
訪問者がWAFカスタムルールまたはIPアクセスルールによって提示されたチャレンジを解決すると、訪問者のブラウザにcf_clearanceクッキーが設定されます。cf_clearanceクッキーのデフォルトの有効期限は30分で、チャレンジパッセージを介して設定できます。
Cloudflareは、異なるホスト名からの訪問者リクエストが後のチャレンジやエラーに直面しないようにするために、cf_clearanceクッキーにSameSite=Noneを使用します。SameSite=Noneが使用される場合、Secureフラグと一緒に設定する必要があります。
Secureフラグを使用するには、HTTPS接続を介してクッキーを送信する必要があります。ウェブサイトのどの部分でもHTTPを使用している場合、cf_clearanceクッキーはデフォルトでSameSite=Laxになり、ウェブサイトが正常に機能しない可能性があります。
この問題を解決するには、ウェブサイトのトラフィックをHTTPSに移動させてください。Cloudflareはこの目的のために2つの機能を提供しています: