MeWrite Docs

Laravel Session Persistence Issues

Laravelでセッションデータが保持されない・消える問題の原因と解決策

概要

Laravelでセッションデータが正しく保持されない、リクエスト間でセッションが消えてしまう問題です。認証状態が維持されない、フラッシュメッセージが表示されないなどの症状が発生します。

エラーメッセージ

Session store not set on request.
Session data not persisting between requests.
User logged out unexpectedly.
Flash message not showing.

原因

  1. Middlewareの設定不足: webミドルウェアグループが適用されていない
  2. Cookieドメインの設定: 複数ドメインやサブドメインでの設定ミス
  3. セッションドライバの問題: file/database/redisの設定不備
  4. HTTPS/HTTPの混在: Secure Cookie設定の問題
  5. 同時リクエストによる競合: Ajax等での同時アクセス

解決策

1. webミドルウェアの確認

ルートがwebミドルウェアグループに含まれているか確認します。

1
2
3
4
5
6
7
8
// routes/web.php(自動的にwebミドルウェアが適用される)
Route::get('/dashboard', [DashboardController::class, 'index']);

// routes/api.phpに書いてしまうとセッションが使えない
// APIルートにセッションが必要な場合
Route::middleware(['web'])->group(function () {
    Route::get('/api/user', [UserController::class, 'show']);
});

2. セッション設定の確認

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
// config/session.php

return [
    // セッションドライバ(file, cookie, database, redis等)
    'driver' => env('SESSION_DRIVER', 'file'),

    // セッションの有効期限(分)
    'lifetime' => env('SESSION_LIFETIME', 120),

    // ブラウザを閉じたら期限切れにするか
    'expire_on_close' => false,

    // HTTPSのみでCookieを送信
    'secure' => env('SESSION_SECURE_COOKIE', false),

    // Cookieのドメイン(サブドメイン共有時は .example.com)
    'domain' => env('SESSION_DOMAIN', null),

    // SameSite属性(lax, strict, none)
    'same_site' => 'lax',
];

3. .envファイルの設定

1
2
3
4
5
6
7
# .env
SESSION_DRIVER=file
SESSION_LIFETIME=120
SESSION_SECURE_COOKIE=false  # 開発環境
# SESSION_SECURE_COOKIE=true  # 本番環境(HTTPS)
SESSION_DOMAIN=null  # 単一ドメイン
# SESSION_DOMAIN=.example.com  # サブドメイン共有時

4. セッションディレクトリの権限確認

1
2
3
4
5
6
# storage/framework/sessionsの権限を確認
ls -la storage/framework/sessions

# 権限を修正
chmod -R 775 storage/framework/sessions
chown -R www-data:www-data storage/framework/sessions

5. データベースセッションの場合

1
2
3
# セッションテーブルのマイグレーション作成
php artisan session:table
php artisan migrate
1
2
// .envを変更
SESSION_DRIVER=database

6. Redisセッションの場合

1
2
# Redisパッケージをインストール
composer require predis/predis
1
2
3
4
5
// .env
SESSION_DRIVER=redis
REDIS_HOST=127.0.0.1
REDIS_PASSWORD=null
REDIS_PORT=6379

7. CORS/Ajax問題の対応

1
2
3
4
// config/cors.php
return [
    'supports_credentials' => true,  // 重要
];
1
2
3
4
5
6
7
// フロントエンド側
fetch('/api/endpoint', {
    credentials: 'include',  // Cookieを送信
    headers: {
        'X-Requested-With': 'XMLHttpRequest',
    }
});

8. セッションのデバッグ

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
// セッションの状態を確認
Route::get('/debug-session', function () {
    // セッションIDを確認
    dump(session()->getId());

    // セッションデータを確認
    dump(session()->all());

    // セッションに値を設定
    session(['test' => 'value']);

    return 'Session debug';
});

よくある間違い

  • routes/api.phpにルートを書いてセッションが使えないと悩む
  • HTTPとHTTPS混在環境でSecure Cookieを有効にしてしまう
  • サブドメイン間でセッション共有時にSESSION_DOMAINを設定し忘れる
  • storage/framework/sessionsの書き込み権限不足

関連エラー

参考リンク

Laravel の他のエラー

最終更新: 2025-12-14