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が起こる
主な現象は
- 画面の遷移やフォームをポストするとたまに
CSRF token mismatch
- 別のブラウザから同じユーザにログインしようとすると
CSRF token mismatch
LaravelではcookieでXSRF-TOKEN
とlaravel_session
を保持しています。
1.が起きた前後を比較するとセッションのlaravel_session
の値が変わっていました。
複数台構成でSESSION_DRIVER=file
にしているとサーバごとにsessionを発行してしまい、リクエストが前と違うサーバに振り分けられると、このようなことが起きます。
ただ、今回はSESSION_DRIVER=database
にしてあり、共通のセッションテーブルで動いていることも確認している。
原因: APP_DEBUG=true
リリース前の本番環境を検証環境としていた。
デバックをしやすくするためAPP_DEBUG=true
にしていたことが原因だったようです。。。
false
にしてデバックモードを切るとCSRF token mismatch
が起こらなくなりました。
今回は2台構成でデバックモードにするとサーバ毎にセッションを作ろうとするようです。 それが何故かは調べても分かりませんが、もし同じようなことで悩まれたらデバックモードも確認してみて下さい。
laravel newコマンドでbash:laravel:command not found
Laravelschedule2020-10-05
LaravelのModelsのディレクトリ構成を変更する
Laravelschedule2020-09-02
【Laravel】UserAgentでガラケー用のViewを切り替えるためのmiddleware
Laravelschedule2020-04-21
PHP Warning Illegal string offset 'foo'
PHPschedule2020-02-03