カテゴリ: CodeIgniter 更新日: 2026/05/24

CodeIgniterのセッション管理を徹底解説!DBセッションを使うメリットと設定方法

CodeIgniterでDBセッションを使うメリットと設定方法
CodeIgniterでDBセッションを使うメリットと設定方法

先生と生徒の会話形式で理解しよう

生徒

「Webサイトでログイン状態を維持する『セッション』って何ですか?CodeIgniterではどうやって管理するのが良いんでしょうか?」

先生

「セッションは、ユーザーがサイトを移動しても『誰がアクセスしているか』を覚えている仕組みのことです。CodeIgniterでは、この情報をデータベース(DB)で管理する方法が非常に推奨されています。」

生徒

「データベースを使うと、普通のやり方と何が違うんですか?初心者でも設定できますか?」

先生

「はい、設定自体はとてもシンプルですよ。DBセッションを使うと、セキュリティや安定性がグッと高まります。それでは、基本から設定手順まで詳しく見ていきましょう!」

1. セッションとは?Webサイトがあなたを覚えている仕組み

1. セッションとは?Webサイトがあなたを覚えている仕組み
1. セッションとは?Webサイトがあなたを覚えている仕組み

インターネットで買い物をしたり、SNSにログインしたりするとき、ページを移動しても自分の名前が表示され続けたり、カートの中身が消えなかったりしますよね。これは、サーバー側があなたを識別するための「セッション(Session)」という仕組みを使っているからです。

通常、Webサイトへのアクセスは一回ごとに完結してしまい、サーバーは「さっきアクセスしてきた人と、今アクセスしてきた人が同じ人か」を判別できません。そこで、目印となるチケットのようなデータを発行し、それをブラウザとやり取りすることで、一連の操作(セッション)を維持しています。

CodeIgniter(コードイグナイター)というPHPのフレームワークを使えば、この複雑な仕組みをたった数行のコードで実現できます。しかし、その「チケットの控え」をどこに保存するかが、システムの安全性や性能に大きく関わってきます。

2. DBセッションとは?データを「ファイル」ではなく「倉庫」で管理する

2. DBセッションとは?データを「ファイル」ではなく「倉庫」で管理する
2. DBセッションとは?データを「ファイル」ではなく「倉庫」で管理する

CodeIgniterの初期設定では、セッション情報はサーバー内の「ファイル」として保存されます。これを、MySQLなどの「データベース(DB)」に保存する方法をDBセッションと呼びます。

「ファイル」での管理は、個人の日記帳を机の引き出しに入れておくようなものです。一人で使う分には簡単ですが、たくさんの人が同時にアクセスしたり、複数のサーバーで動かしたりする場合、どこに日記帳があるか分からなくなったり、中身が壊れたりするリスクがあります。

一方で「データベース」での管理は、セキュアな巨大な倉庫にデータを保管するようなイメージです。整理整頓が得意で、大量のデータを高速かつ安全に処理することに特化しているため、本格的なWebアプリケーションを作るなら、DBセッションの設定は欠かせません。

3. DBセッションを使う3つの大きなメリット

3. DBセッションを使う3つの大きなメリット
3. DBセッションを使う3つの大きなメリット

なぜプロの開発者は、わざわざ設定を変更してまでデータベースにセッションを保存するのでしょうか。それには明確なメリットがあるからです。

① セキュリティの向上: ファイル保存の場合、サーバーの設定によっては他のユーザーからファイルの中身を覗き見られる危険性がゼロではありません。データベースに保存すれば、アクセス権限を厳格に管理できるため、乗っ取りなどのリスクを低減できます。

② サーバー負荷の分散(スケーラビリティ): サイトが人気になり、サーバーを2台、3台と増やした場合(冗長化)、ファイル保存だと「1号機にログインしたけど、2号機にアクセスしたらログインが切れた」という現象が起きます。データベースを共有していれば、どのサーバーからでも同じセッション情報を参照できます。

③ データの信頼性と管理のしやすさ: データベースはデータの整合性を保つのが得意です。古いセッションの削除(ガベージコレクション)も効率的に行われるため、サーバーのディスク容量を圧迫しにくくなります。

4. 準備:セッション情報を保存するテーブルを作成しよう

4. 準備:セッション情報を保存するテーブルを作成しよう
4. 準備:セッション情報を保存するテーブルを作成しよう

DBセッションを利用するには、まずデータベースの中にセッション専用の「箱(テーブル)」を作る必要があります。CodeIgniter 4(CI4)を使用している場合、コマンド一つでこのテーブルを作成する準備が整います。まずはターミナルやコマンドプロンプトを開いて、プロジェクトのルートディレクトリで以下のコマンドを実行してみましょう。


php spark session:migration
php spark migrate

これにより、自動的に「sessions」という名前のテーブルが作成されます。手動で作成したい場合や、古いバージョンを使っている場合は、以下のようなSQLプログラムを実行してテーブルを作成します。


// SQLでセッションテーブルを作成する例(MySQL用)
CREATE TABLE IF NOT EXISTS `ci_sessions` (
    `id` varchar(128) NOT NULL,
    `ip_address` varchar(45) NOT NULL,
    `timestamp` timestamp DEFAULT CURRENT_TIMESTAMP NOT NULL,
    `data` blob NOT NULL,
    PRIMARY KEY (id),
    KEY `ci_sessions_timestamp` (`timestamp`)
);

これで、データを保存するための入れ物が完成しました。次は、CodeIgniter側に「これからファイルじゃなくてDBを使うよ!」と教えてあげる設定を行います。

5. 設定ファイルの編集:app/Config/App.phpを書き換える

5. 設定ファイルの編集:app/Config/App.phpを書き換える
5. 設定ファイルの編集:app/Config/App.phpを書き換える

次に、設定ファイルを編集します。CodeIgniterの基本設定は app/Config/App.php というファイルにまとまっています。この中にあるセッション関連の項目を探して、以下のように書き換えてください。

初心者の方は、「$sessionDriver」という文字を検索(Ctrl + F)で見つけるとスムーズです。


// 以前の設定:public $sessionDriver = 'CodeIgniter\Session\Handlers\FileHandler';
// 変更後の設定
public $sessionDriver = 'CodeIgniter\Session\Handlers\DatabaseHandler';

// 保存先の指定(作成したテーブル名を指定します)
public $sessionSavePath = 'ci_sessions';

この sessionDriverDatabaseHandler に変えることで、保存先がファイルからデータベースに切り替わります。また、sessionSavePath には、先ほど作成したテーブルの名前を記述します。これだけで、基本的な切り替え作業は完了です!パソコンを触り慣れていない方でも、指定の場所を書き換えるだけなので、落ち着いて行えば大丈夫です。

6. 実際にセッションにデータを保存してみよう

6. 実際にセッションにデータを保存してみよう
6. 実際にセッションにデータを保存してみよう

設定が終わったら、実際にプログラムからセッションを使ってみましょう。例えば、ユーザーがログインしたときに「ユーザーID」を保存するプログラムは以下のようになります。PHPのコードは、コントローラーというファイルに記述します。


// セッションサービスの読み込み
$session = \Config\Services::session();

// データの保存(セット)
// 'user_id' という名前に、'123' という値を紐付けて保存します
$session->set('user_id', '123');

// 保存されたか確認するためのメッセージ
echo 'セッションにユーザーIDを保存しました!';

このコードを実行すると、CodeIgniterは自動的にデータベースの ci_sessions テーブルに暗号化されたデータを書き込みます。自分でSQL文を書かなくても、裏側で勝手にやってくれるのがフレームワークの便利なところです。

7. 保存したセッションデータを取り出して表示する

7. 保存したセッションデータを取り出して表示する
7. 保存したセッションデータを取り出して表示する

保存したデータは、別のページに移動しても簡単に取り出すことができます。例えば、トップページで「こんにちは、〇〇さん!」と表示したい場合、以下のように記述します。これもコントローラーやビューの中で行います。


// セッションサービスの読み込み
$session = \Config\Services::session();

// データの取得(ゲット)
$userId = $session->get('user_id');

// データがあるかどうかで処理を分ける(if文)
if ($userId) {
    echo 'おかえりなさい!ユーザーID:' . $userId . ' さん';
} else {
    echo 'ログインしていません。ゲストさん、こんにちは!';
}

$session->get('名前') を使うだけで、データベースから正しい情報を探してきてくれます。もし、データベースの中身を直接見てみると、不思議な文字列が並んでいるはずです。それはセキュリティのためにデータが加工されている証拠なので、安心してくださいね。

8. 不要になったセッションを削除する方法

8. 不要になったセッションを削除する方法
8. 不要になったセッションを削除する方法

ログアウトボタンが押されたときなど、保存したデータを消去したい場合もあります。特定のデータだけを消す方法と、すべてのセッションを破棄する方法の2パターンを覚えておきましょう。


$session = \Config\Services::session();

// 特定のデータ(user_id)だけを削除する
$session->remove('user_id');

// すべてのセッション情報を完全に削除してログアウトする
$session->destroy();

echo 'ログアウトしました。セッションをクリアしました。';

remove は特定の荷物だけを倉庫から出すイメージ、destroy は倉庫にある自分のスペースを丸ごと空っぽにするイメージです。用途に合わせて使い分けましょう。これで、DBセッションの「作成・保存・取得・削除」という一通りの流れが理解できました!

9. 初心者がハマりやすい注意点:Cookieとの関係

9. 初心者がハマりやすい注意点:Cookieとの関係
9. 初心者がハマりやすい注意点:Cookieとの関係

DBセッションを使っていても、実は「Cookie(クッキー)」という仕組みも同時に動いています。セッションの本体(データ)はサーバーのデータベースにありますが、その「鍵(セッションID)」だけは、ユーザーのブラウザのCookieに保存されているのです。

もしブラウザの設定でCookieが無効になっていると、いくらデータベースを正しく設定してもセッションは機能しません。また、データベースの接続設定(app/Config/Database.php)が間違っていても、当然セッションはエラーになります。もし動かないな?と思ったら、「データベースには接続できているか?」「テーブル名は合っているか?」をまず確認してみてください。

プログラミングは最初は難しく感じるかもしれませんが、一つひとつの仕組みを分解して理解していけば、パズルのように楽しく組み立てられるようになります。DBセッションは、そのパズルの中でも「安全な基盤」を作るための大切なピースです。ぜひ自分の手で設定して、その便利さを実感してみてください。

カテゴリの一覧へ
新着記事
New1
Laravel
Laravelのルーティングでサブドメインを使う方法!初心者向けにやさしく解説
New2
Laravel
Laravelでマルチ言語ルートを設定する方法!ロケールごとのprefixで簡単管理
New4
Laravel
Laravelのインストール方法まとめ!ComposerとLaravel Installerの使い方
人気記事
No.1
Java&Spring記事人気No1
Symfony
SymfonyのRemember Me機能を完全解説!初心者でもわかるログイン保持の仕組み
No.2
Java&Spring記事人気No2
Laravel
Laravelのインストール方法まとめ!ComposerとLaravel Installerの使い方
No.3
Java&Spring記事人気No3
Laravel
LaravelのFeatureテストとUnitテストの違いを理解しよう
No.4
Java&Spring記事人気No4
Laravel
Laravelでルートに中間処理を追加する方法!ミドルウェア活用ガイド
No.5
Java&Spring記事人気No5
CodeIgniter
CodeIgniterで多言語対応(Language)を徹底解説!言語切り替え機能を実装
No.6
Java&Spring記事人気No6
Laravel
Laravelでログを出力する方法(Monolog・storage/logs)
No.7
Java&Spring記事人気No7
Laravel
Laravelでドメインルートを使う方法!マルチドメイン対応を初心者向けに解説
No.8
Java&Spring記事人気No8
Laravel
Laravelのルーティングでサブドメインを使う方法!初心者向けにやさしく解説