ログインフォーム、チェックアウトフロー、認証済みアプリケーションルートなどの動的ページは、キャッシュが強すぎると壊れます。
よくある症状は次のとおりです。
- ログインページは開けるが、送信後にサインインフォームが失敗する。
- サインイン成功後にセッションが維持されない。
- オリジンは
Set-Cookieヘッダーを送っているが、ブラウザーが Cookie を保存しない。 - チャレンジページが表示され、解決後にログインページへ戻る、またはフォームの状態が失われる。
よくある原因は、動的 HTML をキャッシュするように設定した Cache Rule または従来の Page Rule です。
次の条件がすべて当てはまるときに起きがちです。
- ページが Eligible for cache または Cache Everything に設定されている。
- レスポンスが
/loginや/accountなどの動的 HTML である。 - オリジンが
Set-Cookieヘッダーを送っている。 - Edge TTL またはステータスコード TTL がオリジンのキャッシュディレクティブを上書きしている。
この設定では、Cloudflare がレスポンスをキャッシュし、エッジに保存する前に Set-Cookie ヘッダーを取り除くことがあります。その結果、ブラウザーはログインページを受け取りますが、次のリクエストに必要なセッション Cookie を受け取れません。
ログインページまたは他の動的ルートのレスポンスを確認します。
次の両方が見える場合、キャッシュすべきでないページがキャッシュされています。
CF-Cache-Status: HITまたはCF-Cache-Status: EXPIRED- オリジンが通常設定する
Set-Cookieヘッダーがレスポンスにない
フォーム送信後に、フレームワーク固有の失敗が見えることもあります。例:
- ログインページへのリダイレクト
- サインイン後の
403または500 - CSRF 検証エラー
- サーバー側のセッション状態の欠落
この問題は、最初のページ読み込みでセッションまたは CSRF Cookie に依存するフレームワークでよく起きます。対象には JavaServer Faces、ASP.NET、PHP のセッションハンドラー、Django、Rails、Laravel があります。
ログインページやその他の認証済み HTML はキャッシュしないでください。
代わりに次を行います。
- Eligible for cache または Cache Everything を静的パスだけに限定します。
/login、/account、/cart、/checkout、アプリケーション API パスなどのルートでキャッシュをバイパスまたは無効にする、より具体的な Cache Rule を追加します。- オリジンがキャッシュを制御する必要がある場合は、ページを強制的にキャッシュする Edge TTL の上書きを削除します。
- 修正後のレスポンスが
CF-Cache-Status: DYNAMIC、MISS、またはBYPASSを返し、Set-Cookieが保持されることを確認します。
Cookie の動作について詳しくは、Set-Cookie レスポンスヘッダーと Cache の相互作用 を参照してください。
セキュリティチャレンジも、動的フローを中断することがあります。
よくあるパターンは次の 2 つです。
- ログインページの最初の
GETリクエストでチャレンジが発生する。ユーザーはチャレンジを解決しますが、アプリケーションは元のセッションまたは CSRF コンテキストを失う。 - ログインフォームやその他の機密操作を送信する
POSTリクエストでチャレンジが発生する。チャレンジ後にブラウザーがリクエストを再送する必要があり、元のフォーム送信が壊れることがある。
WAF カスタムルール、マネージドルール、または レート制限ルール がログインパスに適用されているかを確認します。
/login、/signin、/checkout、/api/auth/* などのルートだけで問題が起き、それらのパスでチャレンジを無効にするとアプリケーションが動く場合、チャレンジがフローを中断しています。
次のいずれかの方法を使います。
- チャレンジルールからログインまたはフォーム送信パスを除外します。
- ルール式を絞り、疑わしいトラフィックだけに適用します。
- ルートを保護する必要がある場合は、ページ読み込みでは影響の小さい制御を使い、フローの他の箇所でより強いアクションを適用します。
デバッグ時は、ルールが /cdn-cgi/* など Cloudflare が生成するパスに一致していないかも確認します。
チャレンジ関連の動作について詳しくは、Rules のトラブルシューティング と Cloudflare WAF のトラブルシューティング を参照してください。