Skip to content

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

動的コンテンツとログインの問題

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

ログインフォーム、チェックアウトフロー、認証済みアプリケーションルートなどの動的ページは、キャッシュが強すぎると壊れます。

よくある症状は次のとおりです。

  • ログインページは開けるが、送信後にサインインフォームが失敗する。
  • サインイン成功後にセッションが維持されない。
  • オリジンは 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 はキャッシュしないでください。

代わりに次を行います。

  1. Eligible for cache または Cache Everything を静的パスだけに限定します。
  2. /login/account/cart/checkout、アプリケーション API パスなどのルートでキャッシュをバイパスまたは無効にする、より具体的な Cache Rule を追加します。
  3. オリジンがキャッシュを制御する必要がある場合は、ページを強制的にキャッシュする Edge TTL の上書きを削除します。
  4. 修正後のレスポンスが CF-Cache-Status: DYNAMICMISS、または BYPASS を返し、Set-Cookie が保持されることを確認します。

Cookie の動作について詳しくは、Set-Cookie レスポンスヘッダーと Cache の相互作用 を参照してください。

ログインまたはフォームフローでのチャレンジループ

セキュリティチャレンジも、動的フローを中断することがあります。

よくあるパターンは次の 2 つです。

  • ログインページの最初の GET リクエストでチャレンジが発生する。ユーザーはチャレンジを解決しますが、アプリケーションは元のセッションまたは CSRF コンテキストを失う。
  • ログインフォームやその他の機密操作を送信する POST リクエストでチャレンジが発生する。チャレンジ後にブラウザーがリクエストを再送する必要があり、元のフォーム送信が壊れることがある。

確認方法

WAF カスタムルールマネージドルール、または レート制限ルール がログインパスに適用されているかを確認します。

/login/signin/checkout/api/auth/* などのルートだけで問題が起き、それらのパスでチャレンジを無効にするとアプリケーションが動く場合、チャレンジがフローを中断しています。

解決方法

次のいずれかの方法を使います。

  1. チャレンジルールからログインまたはフォーム送信パスを除外します。
  2. ルール式を絞り、疑わしいトラフィックだけに適用します。
  3. ルートを保護する必要がある場合は、ページ読み込みでは影響の小さい制御を使い、フローの他の箇所でより強いアクションを適用します。

デバッグ時は、ルールが /cdn-cgi/* など Cloudflare が生成するパスに一致していないかも確認します。

チャレンジ関連の動作について詳しくは、Rules のトラブルシューティングCloudflare WAF のトラブルシューティング を参照してください。

役に立ちましたか?