18
12

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

【Laravel】Sessionの扱い方ざっくりまとめ

Posted at

前提

HTTP通信はステートレス

  • HTTP通信単体では「状態」を持てません(これを ステートレス と呼びます)
  • 「ログイン状態」や、「カートに商品をいれた状態」を保ちたい場合、その 「状態」をキープするための仕組み が必要です
  • それが セッション管理 という仕組みです

セッション管理=クッキー+データベース

  • 「一定期間に行う一連の処理」をセッションと呼びます
  • セッション管理は、サーバが セッションID(ランダムな文字列) をクライアントに付与し、 サーバ側がIDを毎回照合・IDに紐づく情報を取得する ことで状態を保持します
  • 具体的には、
    • クッキー(クライアント側にIDを保存) と、
    • データベース(サーバ側にID&保持したい情報を保存) を使用することが多いです
  • 他にも方法はありますが、いずれもセキュリティを考慮する必要があります

クッキー

  • 主にサーバから付与され、ブラウザに保存される文字列データです
  • HTTP通信のレスポンスヘッダ(Set-Cookie)を通して付与されます
  • 保存形式は、 キー名=値 (+更新日時)
  • サーバにアクセスする際、自動送信されます(HTTP通信のリクエストヘッダ)
    • もちろん、他のサーバへは送信しません(セキュリティ)

Laravelのセッション管理について

セッションの設定方法

  • セッションの設定はconfig/session.phpファイルで行います
<?php
return [
    'driver' => env('SESSION_DRIVER', 'file'), // Sessionの保存方法
    'lifetime' => 120, // Cookie(Session)の有効期限(分, 120 = 2時間)
    'expire_on_close' => false, // 有効期限を「ブラウザのタブを閉じるまで」に設定
    'encrypt' => true, // Cookieの暗号化

		// 保存先の設定
    'files' => storage_path('framework/sessions'), // (fileに保存する場合)保存先パス
    'connection' => null, // (database,redisに保存する場合)接続先
    'table' => 'sessions', // (databaseに保存する場合)保存先テーブル
    'store' => null, // (apc,memcashedに保存する場合)キャッシュストア

    'lottery' => [2, 100], // ガベージコレクションの発生確率(2/100 = 2%)
    'cookie' => 'laravel_session', // Cookieのキー名
    'path' => '/', // 有効なパス('/' = サイト全体)
    'domain' => env('SESSION_DOMAIN', null), // 有効なドメイン
    'secure' => env('SESSION_SECURE_COOKIE', false), // 暗号化通信の要否
    'http_only' => true, // HTTP経由でのみアクセス(JavaScript経由ではアクセス不可)
];

Laravel 8.x HTTPセッション

env関数とenvファイル

  • env()では、プロジェクトフォルダ下の.envファイルで設定された環境変数を取得しています
    • 第一引数の値がなければ、第二引数の値(デフォルト値)を返します
  • envファイルの変更を反映させるには、以下のコマンドを使用します
php artisan config:clear

driver(Sessionの保存方法)

サーバ側は情報をデータベース保存する…と書きましたが、実際にはデータベース以外も利用可能です

  • file: storage/framework/sessionsに保存(デフォルトの保存方法)
  • cookie: 暗号化したクッキーに保存
  • database: RDBに保存、テーブルを作成する必要がある
  • memcashed/redis: キャッシュベースの保存域へ保存(👈高速なのでオススメ)
  • dynamodb: AWS DynamoDBへ保存
  • array: PHP配列に保存(永続化しない)

Sessionデータの使い方

Sessionデータへのアクセス方法

  • Laravelでは3通りのアクセス方法があります

1. Requestインスタンス(Request $request

$request->session()->hoge()

2. グローバルSessionヘルパ

session()->hoge()

3. Sessionファサード

Session::hoge()

データをセットする

// Controller
public function sample(Request $request)
{
		$request->session()->put('キー名', ); // sessionデータをセット
		return view('sample');
}
// 複数のデータを保存
$request->session()->put(['key1'=> value1, 'key2'=> value2, ...);

// フラッシュデータを保存
$request->session()->flash('キー名', );
// => 直後のリクエストでのみ利用可能、その後削除される

// 指定したデータを削除
$request->session()->forget('キー名');

// セッションのすべてのデータを削除
$request->session()->flush();

データを取得する

// Controller
public function sample(Request $request)
{
		$value = $request->session()->get('キー名'); // sessionデータから値を取得
		return view('sample');
}
// get()は第二引数にデフォルト値を指定できる
$value = $request->session()->get('キー名', 'デフォルト値');

// 指定したデータを取得後に削除
$value = $request->session()->pull('キー名', 'デフォルト値');

// セッションの全データを取得
$items = $request->session()->all();

// セッションに指定したキーが存在するか調べる
if ($request->session()->exists('キー名')){
	// 処理
}

// 値が存在するか(null以外か)調べる
if ($request->session()->has('キー名')){
	// 処理
}

その他

// セッションIDの再発行
$request->session()->regenerate();

// セッションIDを再生成し、セッションからすべてのデータを削除
$request->session()->invalidate();

参考

Cookieとセッションをちゃんと理解する - Qiita

CookieとWebStorageとSessionについてのまとめ - Qiita

PHPフレームワークLaravel Webアプリケーション開発 バージョン8.x対応

独習PHP 第4版

18
12
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
18
12

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?