🌸
【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を無効化するだけ
- サーバーコントロールパネルにログイン
- セキュリティ → WAF設定
- 対象ドメインで「利用しない」を選択
総括
案件の都合上契約することになりWAFもセキュリティの観点からつけとくか〜
からこんな沼にハマってしまうとは、、、
慣れない環境を利用する場合はとりあずオプション設定しとくってのをやめようの会
Discussion