【Laravel】セッションの実践的な使い方を解説

Laravel

こんにちは!

今回はLaravelのセッションの使い方について、ご紹介していきます。

Webアプリケーション開発において、セッション管理は欠かせない重要な要素の一つです。特に初学者にとっては、セッションの使い方や実践的な活用方法について理解することは、スキルの向上に大きく貢献します。

本記事では、Laravelのセッションの実践的な使い方に焦点を当てて、基本から応用までを解説していきます。

読者
読者

「セッション管理ってそもそも何?」

「Laravelのセッションはあまり触ったことがなくて、使い方がわからないなぁ」

このような方には参考になる内容かと思います。

ぜひ、本記事を通してセッション管理の理解を深めて、実務での活用に役立ててください。

セッションの概要

WebではHTTP通信という通信手段が使われていますが、HTTP通信はステートレスにやりとりを行います。ステートレスというのは、「状態を持てない」ということです。

例えば、ECサイトではカートに商品を追加した場合、ページを変えてもカートの中の商品データは保持しておかないといけませんよね?
ところが、HTTP通信ではこういったことができません。
そこで、セッションが登場します。

セッションを使えば、複数のリクエストにまたがってデータを保持することができます。例えば、ECサイトの例であれば、カートに追加された商品データを保持しておくことができます。

そして、このセッションを管理する仕組みが今回紹介する「セッション管理」です。

それでは、セッション管理はどのように行うかというと、以下の流れになります。

  1. サーバー側でセッションIDを生成する
  2. サーバーはセッションIDをクライアント側のCookieにセットする
  3. 次回以降のリクエストで、クライアントはサーバーにセッションIDを送信する
  4. サーバー側でセッションIDを照合し、セッションに保存したデータを取得する
  5. サーバーはセッションデータを返す

なお、クライアント側のCookieに保持されたセッションIDは一度セットされると、次回以降は自動的にリクエストヘッダーに付与されることになります。

セッションの基本

Laravelでのセッションの設定方法

Laravelの場合、セッションの設定ファイルは「config/session.php」になります。

まずは設定ファイルの中のドライバーを設定しましょう。デフォルトでは、以下のようにファイルドライバーが設定されています。これは、セッションデータをファイルで管理する、という意味です。

'driver' => env('SESSION_DRIVER', 'file'),

ドライバーには他にも様々な選択肢があり、以下から選ぶことができます。

  • file・・・セッションをstorage/framework/sessionsに保存する
  • cookie・・・セッションを暗号化され安全なクッキーに保存する
  • database・・・セッションをリレーショナルデータベースへ保存する
  • memcashed/redis・・・セッションを高速なキャッシュデータベースの保存域へ保存する
  • dynamodb・・・セッションをAWS DynamoDBへ保存する
  • array・・・セッションをPHP配列に格納し、永続化はしない

ドライバーにデータベースを選択した場合は、セッション用のテーブルを作成しなければいけません。以下のコマンドを実行することで、マイグレーションを作成することができます。

$ php artisan session:table
$ php artisan migrate

Redisは高速なキャッシュデータベースであるため、非常におすすめな選択です。ただし、Redisを選択する場合は、predisというパッケージをインストールする必要があります。

$ composer require predis/predis

Redisの設定方法などの詳細は、以下の公式サイトを参照してください。

10.x Redis Laravel

セッションの設定ファイルでは、ドライバーだけではなく、セッションの有効期限や暗号化などの設定を行うこともできます。

セッションの実装方法

セッションの実装方法として、大きく以下の3つあります。

Requestインスタンス

use Illuminate\Http\Request;

public function example(Request $request)
{
    // セッションからデータを取得
    $value = $request->session()->get('key');

    // セッションにデータを保存
    $request->session()->put('key', 'value');

    // セッションからデータを削除
    $request->session()->forget('key');

    // セッションを完全に削除
    $request->session()->flush();
}

sessionヘルパー

public function example()
{
    // セッションからデータを取得
    $value = session('key');

    // セッションにデータを保存
    session(['key' => 'value']);

    // セッションからデータを削除
    session()->forget('key');

    // セッションを完全に削除
    session()->flush();
}

sessionファサード

use Session;

public function example()
{
    // セッションからデータを取得
    $value = Session::get('key');

    // セッションにデータを保存
    Session::put('key', 'value');

    // セッションからデータを削除
    Session::forget('key');

    // セッションを完全に削除
    Session::flush();
}

セッションの開始と終了

セッションを使うためには、セッションを開始して終了する必要がありますが、Laravelでは非常にシンプルな方法でこれらを実装できます。

セッションの開始

通常、Laravelでは自動的にセッションを開始します。そのため、基本的にはセッションの開始は考える必要がないですが、もし手動でセッションを開始する必要がある場合は以下のように記述します。

session()->start();

セッションの終了

Laravelの場合は、セッションの終了に関しても自動的に処理されます

ただ、明示的にセッションを終了するには、flushメソッドを使用します。こちらのメソッドはセッションを完全に削除します。

session()->flush();

セッションのデータ操作

前述した通り、セッションには実装方法が3つほどありますが、このセクション以降はRequestインスタンスによるセッションの実装方法を使って進めていきます。

セッションにデータを保存する方法

セッションにデータを保存する場合は、以下のようなコードになります。

$request->session()->put('key', 'value');

これで、キーと値のペアをセッションに保存できます。

複数のデータをセッションに保存したい場合は、以下のように連想配列を渡します。

// 複数のデータを一度にセッションに保存する
$request->session()->put([
    'key1' => 'value1',
    'key2' => 'value2',
    'key3' => 'value3'
]);

セッションからデータを取得する方法

セッションからデータを取得するには、以下のように記述します。

// セッションからデータを取得する
$data = $request->session()->get('key');

キーを指定することで、キーに対応する値を取得することができます。

また、以下のようにキーが存在しなかった場合に返すデフォルト値を設定することもできます。

$data = $request->session()->get('key', 'default');

セッションに保存しているすべてのデータを取得したい場合は、以下のように記述します。

// セッションに保存されている全データを取得する
$allData = $request->session()->all();

セッションの更新と削除

セッションデータの更新を行う場合は、以下のように記述します。

// セッションにデータを更新する
$request->session()->put('key', 'new_value');

また、セッションのデータを削除する場合は、以下のように記述します。

// セッションからデータを削除する
$request->session()->forget('key');

セッションの応用

このセクションからはセッションの応用的な使い方をみていきます。

フラッシュメッセージの利用

フラッシュメッセージとは、ユーザーに一度だけ表示され、その後自動的に消えるメッセージのことです。よく、操作が成功した場合や失敗した場合などに「〇〇が成功しました!」みたいに出てくるアレのことです。

Laravelのセッションを利用すると、フラッシュメッセージも実装することができます。

まずは、フラッシュメッセージを一時的にセッションに保存します。

// フラッシュメッセージをセッションに保存する
$request->session()->flash('message', '操作が成功しました。');

フラッシュメッセージを表示するには、ビューファイルでセッションからデータを取得します。

@if(session('message'))
    <div class="alert alert-success">
        {{ session('message') }}
    </div>
@endif

あとは、JavaScriptなどを使用して一定時間経過したら自動的に消えるようにすればOKです。

ログイン認証とセッション

Webアプリケーションでは通常、ログイン認証時にログインユーザーのデータをセッションに保存します。

$credentials = $request->validate([
    'email' => ['required', 'email'],
    'password' => ['required'],
]);

if (Auth::attempt($credentials)) {
    $request->session()->regenerate(); // セッションを再生成

    return redirect()->intended('dashboard');
}

return back()->withErrors([
    'email' => 'The provided credentials do not match our records.',
])->onlyInput('email');

ログイン処理時に気をつけなければならないのは、セッション固定化攻撃を防ぐためにセッションを再生成しておくことです。セッション固定化攻撃とは、攻撃者の用意したセッションIDをログインユーザーに使わせるように強制させる攻撃のことです。

また、Laravelでは自動的にログインユーザーのデータをセッションに保存しているので、Authファサードを使うことによってログインユーザーのデータを取得することができます。

// ログインユーザーの名前を取得する
$username = Auth::user()->name;

また、ログアウト時にはセッションを無効にしてCSRFトークンを再生成することが推奨されています。

Auth::logout();

$request->session()->invalidate(); // セッションを無効化

$request->session()->regenerateToken();

return redirect('/');

カート情報の管理

ここで、セッションを使用した具体的な活用例を見てみましょう。

ECサイトなどではカート機能が必須であります。このカートに追加される商品データなどはまさにセッションで管理される代表例です。

それでは、実装するとどうなるかみてみましょう。

use Illuminate\Http\Request;

class CartController extends Controller
{
    public function addProductToCart(Request $request, $productId)
    {
        // 商品情報を取得する(仮)
        $product = Product::find($productId);

        // セッションからカート情報を取得する
        $cart = $request->session()->get('cart', []);

        // カートに商品を追加する
        $cart[$product->id] = [
            'name' => $product->name,
            'price' => $product->price,
            'quantity' => 1, // 初期数量を1とする
        ];

        // カート情報をセッションに保存する
        $request->session()->put('cart', $cart);

        return redirect()->route('cart.show');
    }

    public function showCart(Request $request)
    {
        // セッションからカート情報を取得する
        $cart = $request->session()->get('cart', []);

        return view('cart.show', ['cart' => $cart]);
    }
}

上記の例では、カートに商品を追加するaddProductToCartメソッドと、カート内の商品データを表示するshowCartメソッドを作成しています。

セッションを使用してカート情報を管理することで、ユーザーがアプリケーションを移動してもカート内の情報が保持され、シームレスなショッピング体験を提供することができます。

セッションのセキュリティ

セッションハイジャック対策

セッションハイジャックというのは、悪意のあるユーザーがセッションIDを盗み、そのセッションIDを使用して他のユーザーのアカウントに不正アクセスする攻撃のことです。

セッションハイジャックのような攻撃を防ぐには、セッションのセキュリティを強化する必要があります。とは言っても、Laravelではデフォルトである程度のセキュリティ対策が施されています。

以下に具体的に気をつけることを列挙します。

・セッションIDの暗号化
セッションIDを暗号化することで、セッションIDが盗まれても、盗み取られたセッションIDを復号化することが難しくなります。Laravelでは、セッションの暗号化がデフォルトで有効になっています。

・HTTPSの使用
HTTPSを使用することで、通信が暗号化され、セッションIDが盗聴されるリスクが低減します。HTTPSを使用することで、通信のプライバシーとセキュリティが向上し、セッションハイジャックのリスクを軽減することができます。

・セッションの有効期限の設定
セッションの有効期限を適切に設定することで、セッションIDが長期間有効である場合に、悪意のあるユーザーによるセッションIDの盗難が発生するリスクを軽減することができます。セッションの有効期限を短く設定することで、セッションIDが盗まれても有効期限が切れる前にセッションが無効になります。

・セッションの再設定
ユーザーが重要な操作を行った後やセッションの状態が変わった後に、セッションを再設定することで、セッションIDを再生成し、悪意のあるユーザーが既存のセッションIDを使用してアクセスできないようにすることができます。

・CSRFトークンの使用
Laravelでは、CSRF(Cross-Site Request Forgery)攻撃から保護するために、CSRFトークンを使用します。このトークンは、フォーム送信時に生成され、セッションに保存されます。悪意のあるユーザーがフォームを改ざんしても、CSRFトークンが一致しない限り、リクエストは拒否されます。

これらを組み合わせることで、セキュリティが強化されます。Laravelはデフォルトでセキュリティ対策が施されていますが、これらは知っておきましょう。

まとめ

セッション管理はWebアプリケーションにおいて重要な機能で、Laravelを使うとセッションの管理を簡単に行うことができます。

本記事では、セッション管理の基本から応用まで実践的な活用方法をご紹介しました。これを機にセッションに関してさらに理解を深め、ぜひ実務にも活用していってください。

ではでは😊

参考


PHPフレームワークLaravel入門第2版 [ 掌田津耶乃 ]

10.x 認証 Laravel

コメント

タイトルとURLをコピーしました