schedule2020-02-04

複数ノードのLaravelでCSRF token mismatch.が頻発する

2台構成のサーバでLaravelを動かしている構成でCSRF token mismatchがランダムなタイミング起こった。

環境

  • Laravel 5.8
  • PHP 7.3
  • Apache 2.4
  • CentOS 7.7 このノードが2台ある構成、DBのMySQLが別のサーバで動いています。

SESSION_DRIVER=databaseとしてあり、sessionテーブルでセッションを管理していることを確認している。

CSRF token mismatchが起こる

主な現象は

  1. 画面の遷移やフォームをポストするとたまにCSRF token mismatch
  2. 別のブラウザから同じユーザにログインしようとするとCSRF token mismatch

LaravelではcookieでXSRF-TOKENlaravel_sessionを保持しています。 1.が起きた前後を比較するとセッションのlaravel_sessionの値が変わっていました。

複数台構成でSESSION_DRIVER=fileにしているとサーバごとにsessionを発行してしまい、リクエストが前と違うサーバに振り分けられると、このようなことが起きます。 ただ、今回はSESSION_DRIVER=databaseにしてあり、共通のセッションテーブルで動いていることも確認している。

原因: APP_DEBUG=true

リリース前の本番環境を検証環境としていた。

デバックをしやすくするためAPP_DEBUG=trueにしていたことが原因だったようです。。。 falseにしてデバックモードを切るとCSRF token mismatchが起こらなくなりました。

今回は2台構成でデバックモードにするとサーバ毎にセッションを作ろうとするようです。 それが何故かは調べても分かりませんが、もし同じようなことで悩まれたらデバックモードも確認してみて下さい。