Laravelはセッション管理を自動的に行ってくれます。
Laravelでは、ユーザーがサイトを訪問したときに自動的にセッションが開始され、
セッションIDが生成されます。
セッションの基本
セッションデータは、デフォルトでサーバーサイドに保存され、
クッキーを利用してユーザーのブラウザにセッションIDが保存されます。
このセッションIDをもとに、ユーザーが再度アクセスした際にLaravelは
セッションデータを識別し、利用することができます。
このセッションIDを保存する場所がcookieです。
Webアプリケーションには、ユーザーPC(クライアント)へデータを保持できる仕組み
「クッキー(cookie)」が用意されています。保存可能なデータは小さなテキスト形式です。
セキュリティ上の問題から、一般的にサーバはクライアント上のファイルを自由に
読み書きすることはできませんが、このクッキーだけは例外となっています。
サーバがクライアントに対して自ら読み書きすることができる仕組みです。
サーバー側がコミュニケーションをとるのに必要な情報を保存できる仕組みです。
なので、ブラウザーの送信に付随して送られます。
サーバーがブラウザから送られてきたデータ(セッションID、名前など)を
ブラウザのcookieに保存し、サーバーとブラウザの共通のデータとして扱えるので
エラー時のIDや名前、住所などを再度の入力をする必要が無くなります。
セッションデータはサーバーサイドで保存され、cookieデータはブラウザに保存される
事になります。
なので、セッションIDなどの小さなデータをcookieに保存し、そのセッションIDに付随する
買い物のカート情報などは、セッションデータとしてサーバーに保存となります。
Laravelのセッションの特徴
- 自動開始: ユーザーが初めてアクセスしたとき、セッションが自動で生成されます。
セッションIDがクッキーとして保存されるため、ユーザーがブラウザを閉じても、
再度開けばセッションが引き続き利用可能です。 - セッションの保存方法:
config/session.phpでセッションの保存場所を設定できます。
デフォルトでは「file」で、サーバー上のファイルにセッションデータが保存されます。
他にも「cookie」「database」「redis」「memcached」「dynamodb」など、
様々な保存方法を指定することができます。 - 簡単なAPIで操作可能:
session()ヘルパーを使うことで、セッションデータの
設定・取得・削除が簡単に行えます。
使い方の例
Laravelでは、以下のようにセッションデータを操作できます。
セッションへのデータ追加
session(['key' => 'value']);
もしくは、putメソッドを使用する方法もあります。
session()->put('key', 'value');
セッションからデータを取得
$value = session('key', 'default');
第二引数の'default'は、キーが存在しない場合のデフォルト値です。
セッションからデータを削除
session()->forget('key');
全セッションデータを削除
session()->flush();
セッションの設定
セッションの設定は、config/session.phpで行います。主な設定項目は以下の通りです。
driver: セッションの保存方法を指定(例:file,cookie,database,redisなど)lifetime: セッションが無効になるまでの時間(分単位)expire_on_close: ブラウザを閉じたときにセッションを終了させるかencrypt: セッションデータを暗号化するかどうか
具体的には、
Laravelでは、セッションの設定をconfig/session.phpファイルで行います。このファイルにはセッションに関連する設定項目が含まれており、セッションの保存場所や有効期限などを調整できます。
以下に、主な設定項目について説明します。
1. driver(セッション保存場所の設定)
driverは、セッションデータを保存する場所を指定する設定です。Laravelは複数の保存方法をサポートしており、アプリケーションの要件に応じて最適な方法を選択できます。
file: デフォルトの保存方法で、サーバー内のファイルに保存されます。開発環境や小規模アプリケーションに適しています。cookie: セッションデータを暗号化した上でクッキーに保存します。セッションのデータ量が少ない場合に適しています。database: データベースに保存します。多くのサーバー間でセッションを共有する場合に便利です。redis: 高速なインメモリデータベースのRedisに保存します。分散アプリケーションに適しており、スケーラビリティの高い構成に向いています。memcached: インメモリキャッシュのMemcachedに保存します。Redisと同様、スケーラビリティが必要な場合に使用します。dynamodb: AWSのDynamoDBを利用する方法です。AWSで構築されたアプリケーションに適しています。
'driver' => env('SESSION_DRIVER', 'file'),
上記の設定では、.envファイルのSESSION_DRIVER値を参照し、設定されていない場合はfileが使われます。
2. lifetime(セッションの有効期限)
lifetimeは、セッションが有効な期間(分単位)を指定します。この期間を過ぎるとセッションが自動的に無効となります。
'lifetime' => env('SESSION_LIFETIME', 120),
デフォルトは120分ですが、.envファイルでSESSION_LIFETIMEを変更できます。
3. expire_on_close(ブラウザ終了時のセッション終了)
このオプションをtrueに設定すると、ユーザーがブラウザを閉じたときにセッションが終了します。ブラウザを閉じてもセッションを保持したい場合はfalseに設定します。
'expire_on_close' => false,
4. encrypt(セッションデータの暗号化)
セッションデータを暗号化する場合は、trueに設定します。セキュリティを強化するため、通常は暗号化を有効にすることが推奨されます。
'encrypt' => false,
5. files(セッションファイルの保存パス)
セッションをfileドライバーで保存する場合、セッションファイルの保存先を指定します。この設定はdriverがfileの場合にのみ適用されます。
'files' => storage_path('framework/sessions'),
デフォルトでは、storage/framework/sessionsディレクトリに保存されます。
6. connection(キャッシュサーバー接続の指定)
セッションをRedisやMemcachedに保存する場合に使用します。キャッシュドライバーが複数の接続を持つ場合、このオプションで特定の接続を指定できます。
'connection' => env('SESSION_CONNECTION', null),
7. table(データベーステーブルの指定)
databaseドライバーを使用する場合、セッションを保存するデータベーステーブル名を指定します。デフォルトではsessionsテーブルを使用します。テーブルを作成するには、以下のコマンドを実行しマイグレーションを作成します。
php artisan session:table
php artisan migrate
設定例:
'table' => 'sessions',
8. cookie(セッションクッキー名)
セッションIDを保存するクッキーの名前を指定します。複数のアプリケーションで異なるセッションを識別したい場合にカスタマイズします。
'cookie' => env('SESSION_COOKIE', Str::slug(env('APP_NAME', 'laravel'), '_').'_session'),
9. path と domain(クッキーのパスとドメイン)
クッキーが有効なパスやドメインを指定します。サブドメイン間でセッションを共有したい場合などに、domainをカスタマイズします。
'path' => '/',
'domain' => env('SESSION_DOMAIN', null),
10. secure(HTTPSのみでセッションを許可)
このオプションをtrueにすると、HTTPS接続の場合にのみクッキーが送信されます。HTTPSを使用している場合は、セキュリティのためtrueにすることが推奨されます。
'secure' => env('SESSION_SECURE_COOKIE', false),
11. http_only(JavaScriptからのアクセス制限)
このオプションをtrueにすると、JavaScriptからセッションクッキーへのアクセスが禁止されます。クロスサイトスクリプティング(XSS)攻撃から保護するため、通常はtrueに設定します。
'http_only' => true,
12. same_site(サードパーティクッキーの制御)
same_site属性を指定することで、クッキーがサードパーティからのリクエストで送信されるかを制御します。strict、lax、またはnullが設定可能です。
'same_site' => 'lax',
.env ファイルでのセッション設定
config/session.phpの設定値は.envファイルからも読み込めます。例えば、.envファイルで以下のように定義できます。
SESSION_DRIVER=file
SESSION_LIFETIME=120
SESSION_CONNECTION=redis
SESSION_COOKIE=myapp_session
SESSION_DOMAIN=.example.com
SESSION_SECURE_COOKIE=true
このように、config/session.phpと.envを使ってLaravelのセッションの挙動を柔軟にカスタマイズできます。セッション設定をアプリケーションのセキュリティ要件や性能要件に応じて最適化することで、信頼性やユーザー体験を向上させることが可能です。
Laravelはこうした設定や便利なヘルパーを提供することで、開発者がセッションを
簡単に管理できるようにしています。
ブラウザとの同期のタイミングは、
Laravelのセッションは、リクエストが終了するタイミングで同期され、セッションデータ
がサーバーに保存されます。
具体的には、リクエストが完了してレスポンスがユーザーに送信される直前に
セッションデータがレスポンスデータに反映されます。
この仕組みによって、セッションデータの更新が確実にサーバーに反映されるように
なっています。
セッション同期のタイミングと流れ
- リクエスト開始:
- ユーザーがリクエストを送信すると、Laravelはリクエストに関連する
セッションデータを読み込みます。
- ユーザーがリクエストを送信すると、Laravelはリクエストに関連する
- セッションデータの変更:
- コントローラーやミドルウェアで、
session()ヘルパーやSessionファサード
を使用してセッションデータの取得や設定を行います。 - 例えば、ユーザーの操作やアクションに応じて、セッションに新しいデータが
追加されたり、既存のデータが変更されたりします。
- コントローラーやミドルウェアで、
- リクエスト終了時に同期:
- リクエストが終了する際、Laravelは変更されたセッションデータを保存します。
- 具体的には、
TerminateMiddlewareというミドルウェアが実行されるタイミングで、
セッションがディスクやデータベースに書き込まれ、
ユーザーのセッションが同期されます。
セッションの同期を制御する場面
- AJAXリクエスト:
- Laravelでは、AJAXリクエストであっても、通常のHTTPリクエストと同様に
セッションが自動的に同期されます。ただし、非同期通信で大量のリクエストが
発生すると、セッションファイルのロックが原因で処理が遅れることがあります。
負荷を考慮して、必要に応じてセッションの読み取り専用化(read-only)や
キャッシュの使用も検討できます。
- Laravelでは、AJAXリクエストであっても、通常のHTTPリクエストと同様に
- 一部のミドルウェアによる同期の制御:
- Laravelの
Sessionミドルウェアがセッションの読み取りと書き込みを担当しますが、
一部のルートやコントローラーでwebミドルウェアを使わない設定にした場合、
セッションが同期されないことがあります。
- Laravelの
- セッションを同期しない場合:
- 特定の場面でセッションの同期が不要な場合、
session()->save()を呼び出して
明示的に同期せずに続行することもできます。
- 特定の場面でセッションの同期が不要な場合、
Laravelのセッションは、通常のWebアプリケーションの流れでは自動で同期されるように
設計されているため、基本的に開発者が意識せずとも安全に扱える仕組みになっています。

