CodeIgniterのセッション管理を徹底解説!DBセッションを使うメリットと設定方法
生徒
「Webサイトでログイン状態を維持する『セッション』って何ですか?CodeIgniterではどうやって管理するのが良いんでしょうか?」
先生
「セッションは、ユーザーがサイトを移動しても『誰がアクセスしているか』を覚えている仕組みのことです。CodeIgniterでは、この情報をデータベース(DB)で管理する方法が非常に推奨されています。」
生徒
「データベースを使うと、普通のやり方と何が違うんですか?初心者でも設定できますか?」
先生
「はい、設定自体はとてもシンプルですよ。DBセッションを使うと、セキュリティや安定性がグッと高まります。それでは、基本から設定手順まで詳しく見ていきましょう!」
1. セッションとは?Webサイトがあなたを覚えている仕組み
インターネットで買い物をしたり、SNSにログインしたりするとき、ページを移動しても自分の名前が表示され続けたり、カートの中身が消えなかったりしますよね。これは、サーバー側があなたを識別するための「セッション(Session)」という仕組みを使っているからです。
通常、Webサイトへのアクセスは一回ごとに完結してしまい、サーバーは「さっきアクセスしてきた人と、今アクセスしてきた人が同じ人か」を判別できません。そこで、目印となるチケットのようなデータを発行し、それをブラウザとやり取りすることで、一連の操作(セッション)を維持しています。
CodeIgniter(コードイグナイター)というPHPのフレームワークを使えば、この複雑な仕組みをたった数行のコードで実現できます。しかし、その「チケットの控え」をどこに保存するかが、システムの安全性や性能に大きく関わってきます。
2. DBセッションとは?データを「ファイル」ではなく「倉庫」で管理する
CodeIgniterの初期設定では、セッション情報はサーバー内の「ファイル」として保存されます。これを、MySQLなどの「データベース(DB)」に保存する方法をDBセッションと呼びます。
「ファイル」での管理は、個人の日記帳を机の引き出しに入れておくようなものです。一人で使う分には簡単ですが、たくさんの人が同時にアクセスしたり、複数のサーバーで動かしたりする場合、どこに日記帳があるか分からなくなったり、中身が壊れたりするリスクがあります。
一方で「データベース」での管理は、セキュアな巨大な倉庫にデータを保管するようなイメージです。整理整頓が得意で、大量のデータを高速かつ安全に処理することに特化しているため、本格的なWebアプリケーションを作るなら、DBセッションの設定は欠かせません。
3. DBセッションを使う3つの大きなメリット
なぜプロの開発者は、わざわざ設定を変更してまでデータベースにセッションを保存するのでしょうか。それには明確なメリットがあるからです。
① セキュリティの向上: ファイル保存の場合、サーバーの設定によっては他のユーザーからファイルの中身を覗き見られる危険性がゼロではありません。データベースに保存すれば、アクセス権限を厳格に管理できるため、乗っ取りなどのリスクを低減できます。
② サーバー負荷の分散(スケーラビリティ): サイトが人気になり、サーバーを2台、3台と増やした場合(冗長化)、ファイル保存だと「1号機にログインしたけど、2号機にアクセスしたらログインが切れた」という現象が起きます。データベースを共有していれば、どのサーバーからでも同じセッション情報を参照できます。
③ データの信頼性と管理のしやすさ: データベースはデータの整合性を保つのが得意です。古いセッションの削除(ガベージコレクション)も効率的に行われるため、サーバーのディスク容量を圧迫しにくくなります。
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を書き換える
次に、設定ファイルを編集します。CodeIgniterの基本設定は app/Config/App.php というファイルにまとまっています。この中にあるセッション関連の項目を探して、以下のように書き換えてください。
初心者の方は、「$sessionDriver」という文字を検索(Ctrl + F)で見つけるとスムーズです。
// 以前の設定:public $sessionDriver = 'CodeIgniter\Session\Handlers\FileHandler';
// 変更後の設定
public $sessionDriver = 'CodeIgniter\Session\Handlers\DatabaseHandler';
// 保存先の指定(作成したテーブル名を指定します)
public $sessionSavePath = 'ci_sessions';
この sessionDriver を DatabaseHandler に変えることで、保存先がファイルからデータベースに切り替わります。また、sessionSavePath には、先ほど作成したテーブルの名前を記述します。これだけで、基本的な切り替え作業は完了です!パソコンを触り慣れていない方でも、指定の場所を書き換えるだけなので、落ち着いて行えば大丈夫です。
6. 実際にセッションにデータを保存してみよう
設定が終わったら、実際にプログラムからセッションを使ってみましょう。例えば、ユーザーがログインしたときに「ユーザーID」を保存するプログラムは以下のようになります。PHPのコードは、コントローラーというファイルに記述します。
// セッションサービスの読み込み
$session = \Config\Services::session();
// データの保存(セット)
// 'user_id' という名前に、'123' という値を紐付けて保存します
$session->set('user_id', '123');
// 保存されたか確認するためのメッセージ
echo 'セッションにユーザーIDを保存しました!';
このコードを実行すると、CodeIgniterは自動的にデータベースの ci_sessions テーブルに暗号化されたデータを書き込みます。自分でSQL文を書かなくても、裏側で勝手にやってくれるのがフレームワークの便利なところです。
7. 保存したセッションデータを取り出して表示する
保存したデータは、別のページに移動しても簡単に取り出すことができます。例えば、トップページで「こんにちは、〇〇さん!」と表示したい場合、以下のように記述します。これもコントローラーやビューの中で行います。
// セッションサービスの読み込み
$session = \Config\Services::session();
// データの取得(ゲット)
$userId = $session->get('user_id');
// データがあるかどうかで処理を分ける(if文)
if ($userId) {
echo 'おかえりなさい!ユーザーID:' . $userId . ' さん';
} else {
echo 'ログインしていません。ゲストさん、こんにちは!';
}
$session->get('名前') を使うだけで、データベースから正しい情報を探してきてくれます。もし、データベースの中身を直接見てみると、不思議な文字列が並んでいるはずです。それはセキュリティのためにデータが加工されている証拠なので、安心してくださいね。
8. 不要になったセッションを削除する方法
ログアウトボタンが押されたときなど、保存したデータを消去したい場合もあります。特定のデータだけを消す方法と、すべてのセッションを破棄する方法の2パターンを覚えておきましょう。
$session = \Config\Services::session();
// 特定のデータ(user_id)だけを削除する
$session->remove('user_id');
// すべてのセッション情報を完全に削除してログアウトする
$session->destroy();
echo 'ログアウトしました。セッションをクリアしました。';
remove は特定の荷物だけを倉庫から出すイメージ、destroy は倉庫にある自分のスペースを丸ごと空っぽにするイメージです。用途に合わせて使い分けましょう。これで、DBセッションの「作成・保存・取得・削除」という一通りの流れが理解できました!
9. 初心者がハマりやすい注意点:Cookieとの関係
DBセッションを使っていても、実は「Cookie(クッキー)」という仕組みも同時に動いています。セッションの本体(データ)はサーバーのデータベースにありますが、その「鍵(セッションID)」だけは、ユーザーのブラウザのCookieに保存されているのです。
もしブラウザの設定でCookieが無効になっていると、いくらデータベースを正しく設定してもセッションは機能しません。また、データベースの接続設定(app/Config/Database.php)が間違っていても、当然セッションはエラーになります。もし動かないな?と思ったら、「データベースには接続できているか?」「テーブル名は合っているか?」をまず確認してみてください。
プログラミングは最初は難しく感じるかもしれませんが、一つひとつの仕組みを分解して理解していけば、パズルのように楽しく組み立てられるようになります。DBセッションは、そのパズルの中でも「安全な基盤」を作るための大切なピースです。ぜひ自分の手で設定して、その便利さを実感してみてください。