| この記事の要点 |
|
結論: SESSION_LIFETIME を変更する
Laravel で CSRF トークンの有効時間を延ばしたい(または短くしたい)場合は、セッションの有効時間を変更します。CSRF トークン専用の有効期限設定はありません。
config/session.php に次の項目があります。
'lifetime' => env('SESSION_LIFETIME', 120),
Laravel 11 以降では (int) env('SESSION_LIFETIME', 120) のように整数へキャストする書き方になっていますが、意味は同じです。上記が修正箇所で、値は .env の SESSION_LIFETIME から読み込まれます。つまり、通常は .env ファイルを変更するだけで済みます。
# .env (単位は分。例: 8 時間)
SESSION_LIFETIME=480
.env に SESSION_LIFETIME の行がない場合は、config/session.php の第 2 引数(既定値 120)が使われます。
仕組み: なぜセッションの時間を変えるのか
Laravel はセッション開始時に CSRF トークンを生成し、セッションデータの一部として保存します。フォームに埋め込まれたトークン(@csrf)と、セッション内のトークンが一致するかを POST のたびに検証します。
- セッションが期限切れで消える → サーバー側のトークンがなくなる → 一致しない
- その結果、HTTP ステータス 419(Page Expired)のエラー画面になる
そのため、トークンの寿命を変えたければセッションの寿命を変える、という関係になります。
lifetime は「最後にアクセスしてからの分数」です。120 分なら、ページを開いたまま 2 時間以上何も操作せずに送信すると期限切れになります。途中で別のページを開くなどしてリクエストがあれば、その時点から数え直されます。
反映されないときの確認ポイント
| 症状 | 原因と対処 |
|---|---|
| .env を変えても変わらない | 設定がキャッシュされている。php artisan config:cache でキャッシュを作り直す |
| 設定値は正しいのに早く切れる | ブラウザを閉じると切れる設定(expire_on_close が true)になっていないか確認 |
| Redis / Memcached でセッション管理している | キャッシュ側の最大メモリやキー削除ポリシーで、期限前に消えていないか確認 |
| ロードバランサ配下で不定期に切れる | セッションドライバが file のままで、サーバーごとにセッションが分かれていないか確認 |
現在の設定値は、tinker で確認できます。
php artisan tinker
>>> config('session.lifetime')
=> 480
どのくらいに設定すべきか
有効時間を長くすると「419 エラーで入力が消えた」という苦情は減りますが、ログイン状態も同じだけ長く残るため、共用 PC での乗っ取りなどのリスクが上がります。
- 一般的な会員サイト・管理画面: 既定の 120 分前後
- 長文入力や業務システムで離席が多い: 数時間程度に延ばし、下記の対策も併用
- 金融・個人情報を扱う画面: 短めにし、再認証を求める
有効時間を延ばす以外の対策
期限切れ時に入力内容を残して戻す
Laravel 11 以降では、bootstrap/app.php で 419 エラー時の動作を変えられます。入力値を保持したまま元の画面に戻し、メッセージを表示する例です。
// bootstrap/app.php
use Illuminate\Http\Request;
use Symfony\Component\HttpKernel\Exception\HttpException;
->withExceptions(function ($exceptions) {
$exceptions->render(function (HttpException $e, Request $request) {
if ($e->getStatusCode() === 419) {
return back()
->withInput($request->except('password', '_token'))
->with('error', '一定時間操作がなかったため、もう一度送信してください。');
}
});
})
Laravel 10 以前では app/Exceptions/Handler.php で TokenMismatchException を捕捉して同様の処理を書きます。
入力中は定期的にセッションを延長する
長いフォームの画面から、数十分おきに軽い GET リクエストを送るとセッションの期限が延びます。ただし、離席したままでも永久にログイン状態が続くことになるため、用途を限定して使います。
よくある質問
「ログイン状態を保持する」にチェックしていても 419 になるのはなぜ?
ログイン保持(Remember Me)は、セッションとは別の長期間有効なクッキーでログインを復元する仕組みです。セッション自体は期限切れで作り直されるため、古い画面に埋め込まれていた CSRF トークンとは一致せず、419 になります。ログイン保持と CSRF の有効時間は別物と考えてください。
API(routes/api.php)でも有効時間を気にする必要はある?
routes/api.php のルートには標準で CSRF 検証がかからないため、この設定は関係しません。トークン認証(Sanctum など)を使う場合は、そのトークンの有効期限を別途設定します。
関連
- Laravel「The page has expired due to inactivity」の原因と対処(CSRF / セッション切れ)
- Laravel .env 設定完全ガイド(DB / APP_KEY / config:cache / 複数環境)
- Web Storage API入門|localStorage・sessionStorage・Cookieの違い
- Forbidden (403) CSRF verification failed. Request aborted.(Django)
子ページはありません
- インストールと設定
- クイックスタート & チュートリアル(初心者向け)
- クイックスタート & チュートリアル(中級者向け)
- ルーティング
- Bladeテンプレート(ビュー/レイアウト)
- コントローラー
- マイグレーションとテーブル定義
- データベースの設定
- Eloquentモデル (ORM)
- SQLとクエリビルダー
- バリデーション
- .envファイルの設定値へのアクセス
- 動作環境による分岐処理
- configフォルダ配下の設定値へのアクセス
- assetヘルパーを利用したpublicフォルダへのアクセス
- storageフォルダへのアクセス
- アプリケーション名の変更
- メンテナンス
- ログイン画面(認証システム)の作成
- ログインの必須化
- ログインユーザー情報の取得
- ルートの認証化
- 本番サーバーへのデプロイ方法
- 多言語化
- csrf_field
- ファイルのダウンロード
- CSVのアップロードおよび読み込み(maatwebsite/excel)
- ページタイトルの設定
- コマンド一覧
- エラー一覧
- SQLの実行ログ出力方法
- キャッシュのクリア
- Selectの結果の最初もしくは最後に任意の値を追加する方法
- ajaxでPOST通信する際の注意点
- ソーシャルログインの実装
- セッション情報の確認
- ログイン、ユーザー登録、パスワードリセット後のリダイレクト先の変更方法
- redirectやreturn viewにメッセージを付与する方法
- クッキー(cookie)の設定と取得
- クラスの再読み込み
- csrfの有効時間を変更する方法
- ViewComposerを用いてviewに共通の値を付与する方法
- View::shareを用いて共通の値を各ビューに渡す方法
- ミドルウェアを用いた処理の共通化
- Middleware内でAuth::check()などを使用する方法
- Controller以外でリダイレクトする方法
- セッションの値の取得/保存/更新/削除
- $requestの値を変更する方法
- 常時SSL化
- ページング(ページネーション)をする方法
- vue.jsとの連携
- Vue.jsと連携するSPA実行環境構築
- .envの値をvue.jsで参照する方法
- vue.jsを本番環境にリリースする方法
- could not find driver(Windows, MySQL編)
人気ページ
- 1 Eclipseで「サーバーに追加または除去できるリソースがありません。」の原因と対処法
- 2 tomcat の起動 / 停止ログと catalina.log・catalina.out の違い
- 3 JavaScript で base URL を取得する方法|window.location.origin
- 4 YouTube Data API v3 エラー一覧|403・400・404 の原因と対処
- 5 Laravel エラー一覧|500/Blade/DB 接続/ルーティングの代表エラー
- 6 3Dグラフィックスとは|モデリング/レンダリング/主要ソフトウェア (Blender / Maya)
- 7 Spring Frameworkのアノテーション一覧
- 8 【Spring】@Valueアノテーションとは
- 9 CATALINA_HOME の確認方法 (Linux / Mac)
- 10 【Spring】@Autowiredアノテーションとは
最近更新/作成されたページ
- プロジェクトをTomcatプロジェクトとして認識させる方法 2026-10-07 22:32:50
- MySQLの1366 Incorrect string value|Laravelの文字コード・絵文字エラー 2026-10-07 21:54:03
- curlの証明書ホスト名不一致|旧エラー51・現行60の確認と対処 2026-10-07 21:54:03
- LaravelのMassAssignmentException|fillableの原因と安全な対処 2026-10-07 21:54:03
- Eclipse で Tomcat の起動ログがコンソールに出ない時の確認手順 2026-10-07 21:54:02
- MySQLにおける中央値(Median)の導き方(バージョン8未満) 2026-10-07 13:49:45
- getInputForward 2026-10-07 13:41:15
- JSONから配列に変換 2026-10-07 13:41:15
- ビューから値をモデルに格納しコントローラーで受け取る方法 2026-10-07 13:23:41
- Laravelのテーブル作成と定義変更|マイグレーション・up/down・注意点 2026-10-07 13:23:41
- NumPy 配列に要素を追加する方法 (append / concatenate) 2026-10-07 13:23:41
- MariaDB・MySQLで現在日時を取得する方法|NOW・タイムゾーン・保存型 2026-10-07 13:13:36
- 【django】テンプレートで定数を使用する方法 2026-10-07 13:10:15
- Spring BootにおけるApplication.propertiesの環境依存設定の分割方法 2026-10-07 12:09:35
- Not supported for DML operations【Springエラー】 2026-10-07 11:09:38