【Laravel】セッションファイルが原因の2回目以降ログインできない現象
はじめに
Laravelを使っていて「最初のログインは成功するのに、なぜか2回目以降はログインできない...」という現象に遭遇したことはありませんか?
本記事では、この現象のつまずきやすいポイントと、その解決方法について実体験を交えてご紹介します。
再現した現象
- Laravelアプリをブラウザで開き、ログインフォームから正常にログイン
- ログアウト後、再度ログインしようとすると認証エラー(ログイン失敗)
-
storage/framework/sessions
にランダムな文字列の名前のファイル(セッションファイル)が生成されている - 1回目のログインは成功するが、2回目以降が失敗してしまう
解消方法
-
storage/framework/sessions
フォルダ内のセッションファイルを削除する。
(その後、再びログインできるようになる)
原因
Laravelのセッションドライバがfile
に設定されていると、セッション情報は storage/framework/sessions
に保存されます。
このとき、何らかの理由でセッションファイルが破損したり、Laravel側で正しく読み取れない場合、ユーザーの認証が正常に行えず、ログインできなくなります。
原因の切り分けポイント
.env
でのセッション設定確認
1. SESSION_DRIVER=file
SESSION_LIFETIME=120
-
SESSION_DRIVER
がfile
になっているか -
SESSION_LIFETIME
が極端に短すぎないか(例:1など)
2. セッションファイルのパーミッション
$ chmod -R 775 storage
$ chown -R www-data:www-data storage
特に本番環境では、Webサーバーユーザー(例:www-data
)に適切な権限があるか確認しましょう。
3. Laravelのキャッシュクリア
$ php artisan config:clear
$ php artisan cache:clear
$ php artisan view:clear
$ php artisan route:clear
(参考) セッションドライバの変更
file
ドライバは簡単に使える一方で、複数ユーザーやスケーラブルな運用には不向きなケースがあります。より安定した運用のためには以下のようなドライバが推奨されます。
-
database
:DBにセッションを保存。永続性が高く管理しやすい -
redis
:パフォーマンスを重視した高速セッションストア
database
ドライバに切り替える手順
$ php artisan session:table
$ php artisan migrate
.env
を次のように変更
SESSION_DRIVER=database
おわりに
今回の現象の原因は、セッションファイルの取り扱いミスでしたが、Laravelのセッション管理について深掘りすることで、ログインの裏側で何が起きているのかを理解する良いきっかけになりました。ログインできないという一見単純なエラーも、ファイル権限や設定値など多くの要素が関わっていることに気づけたのは、大きな学びでした。
本記事が、同じような現象をに困った方の一助になれば幸いです。
株式会社ONE WEDGE
【Serverlessで世の中をもっと楽しく】
ONE WEDGEはServerlessシステム開発を中核技術としてWeb系システム開発、AWS/GCPを利用した業務システム・サービス開発、PWAを用いたモバイル開発、Alexaスキル開発など、元気と技術力を武器にお客様に真摯に向き合う価値創造企業です。
Discussion