🌸

【Laravel】さくらサーバーでCSRFトークン不一致

に公開

発生した問題

Laravelにて開発したエントリー管理のプロダクトをさくらサーバーにデプロイしたところ、
ログインやフォーム送信で 419エラー(CSRF token mismatch) が発生

Login failed: ApiError: CSRF token mismatch.
本番環境はさくらレンタルサーバーでステージング環境はXserver(こういうのほんとよくない)
コードの問題ではなくサーバー固有の問題じゃないかなぁと、、、、

原因:さくらサーバーのWAF機能

そこでドキュメントを血眼で漁ってたらさくらのサポートページにおもろい一文

監視対象となるプロトコルは HTTPとHTTPS(共有SSL・独自SSL)です。Cookieの引き継ぎはできません。

さくらのサポート情報

さくらのWAF(SiteGuard)を有効にすると:

  • CookieにENC_プレフィックスが付与される
  • HttpOnlyフラグが強制的に設定される
  • JavaScriptからCookieが読み取れなくなる

Laravel
SanctumはXSRF-TOKENクッキーをJavaScriptで読み取り、X-XSRF-TOKENヘッダーとして送信する仕組み。WAFがこれを妨害していた(本末転倒)

解決方法

さくらサーバーのコントロールパネルからWAFを無効化するだけ

  1. サーバーコントロールパネルにログイン
  2. セキュリティWAF設定
  3. 対象ドメインで「利用しない」を選択

総括

案件の都合上契約することになりWAFもセキュリティの観点からつけとくか〜
からこんな沼にハマってしまうとは、、、

慣れない環境を利用する場合はとりあずオプション設定しとくってのをやめようの会

参考

Discussion