PHPでユーザーごとにセッションを管理する方法!初心者にもわかるWebログインの仕組み
生徒
「PHPでログイン機能を作ったときに、ユーザーごとの情報を覚えておく方法ってありますか?」
先生
「はい、PHPでは“セッション”という仕組みを使って、ユーザーごとの情報を管理することができますよ。」
生徒
「セッションって何ですか?なんだか難しそう…」
先生
「心配しなくて大丈夫です。わかりやすく、例えを使って説明していきますね!」
1. セッションとは?PHPのログイン管理の基本用語
セッション(Session)とは、PHPでユーザーがWebサイトを利用している間に、その人が「誰なのか」「どんな操作をしたのか」といった情報を一時的に覚えておく仕組みです。
例えば、遊園地の入場券のようなものです。入場券を見せれば、スタッフは「この人はチケットを買った人だな」とわかりますよね。セッションはその「入場券」をWeb上で実現するような働きをします。
ログイン処理をすると、サーバーは「この人はログインしている人だ」と覚えておきます。ログイン後に別のページに移動しても、セッションがあることでログイン状態をキープできます。
2. PHPでセッションを使う基本の書き方
PHPでセッションを使うときは、まず最初にsession_start()という命令を書きます。これによって、PHPがセッションを開始し、ユーザーごとの情報を保存できるようになります。
使い方の基本は次のようになります。
<?php
session_start();
$_SESSION['user'] = 'taro';
?>
ここで$_SESSION['user']は、「セッションの中に"user"という名前で"taro"という情報を保存する」という意味です。
3. ログイン時にユーザー情報をセッションに保存しよう
次は、ユーザーがログインしたときに、セッションを使ってログイン状態を管理する例です。まずはログイン処理を書いてみましょう。
<?php
session_start();
$username = $_POST['username'];
$password = $_POST['password'];
// 仮のユーザー情報
if ($username === 'taro' && $password === 'pass123') {
$_SESSION['user'] = $username;
header('Location: mypage.php');
exit;
} else {
echo 'ログインに失敗しました。';
}
?>
このように、ログインに成功したら、セッションにユーザー名を保存して次のページへ移動します。
4. マイページでユーザーごとの情報を表示する
次はログイン後のページ、いわゆる「マイページ」でセッションを使ってログイン中のユーザーの名前を表示してみましょう。
<?php
session_start();
if (!isset($_SESSION['user'])) {
header('Location: loginform.html');
exit;
}
echo "ようこそ、" . $_SESSION['user'] . "さん!";
?>
issetは「この変数が存在しているか?」を調べる関数です。セッションにuserがあるかを確認し、なければログイン画面に戻します。
5. セッションを使ってユーザー情報を保持するとは?
セッションを使えば、ユーザーが別のページに移動しても、その間に「ログイン中かどうか」や「誰が操作しているか」を記録し続けることができます。
たとえば、買い物サイトで「カートに入れた商品」は、セッションを使って一時的に記録されます。ページを移動しても商品は消えませんよね。それと同じことがログイン状態にも当てはまります。
6. ログアウト処理でセッションを削除しよう
ログアウトするには、セッションを削除する必要があります。次のように書きます。
<?php
session_start();
session_unset();
session_destroy();
header('Location: loginform.html');
exit;
?>
session_unset()はセッションの中身を全部空にし、session_destroy()はセッション自体を破棄します。ログアウト後はログインページへ戻すのが一般的です。
7. 複数ユーザーを管理するにはどうする?
実際には、1人ではなく複数のユーザーが同時にWebサイトにアクセスします。でもセッションは「その人ごとに自動で別々に管理」されるので安心です。
たとえば、同じページをAさんとBさんが開いたとしても、それぞれのセッションはサーバー側で別々に処理され、$_SESSION['user']にAさんとBさんの名前がそれぞれ別に入ります。
8. セッションIDとは?安全性も意識しよう
セッションには、内部的に「セッションID(アイディー)」という一意の番号が使われています。これはユーザーごとに発行され、クッキーという仕組みを通じて自動的に管理されます。
セッションIDが漏れると、他人になりすまされるリスクがあるので、ログイン状態を守るためにはsession_regenerate_id()を使って、IDを再発行するのが安全です。
<?php
session_start();
session_regenerate_id(true);
?>
ログイン直後にこの関数を使うと、安全性が高まります。
まとめ
セッション管理の重要ポイントを振り返る
本記事では、PHPにおけるセッション管理の基本から応用までを段階的に解説してきました。セッションとは、ユーザーがWebサイトを利用している間、そのユーザー固有の情報をサーバー側で一時的に保持する仕組みであり、ログイン機能やカート機能など、現代のWebアプリケーションにおいて欠かせない存在です。
特にPHPでは、session_start()を起点としてセッション処理が始まり、$_SESSIONというスーパーグローバル変数を通じてデータの保存・取得を行います。これにより、ページ遷移を跨いでもユーザーの状態を維持することが可能となります。
ログイン機能とセッションの関係
ログイン機能では、ユーザー認証に成功したタイミングでセッションにユーザー情報を保存することが基本となります。これにより、マイページや会員専用ページにアクセスした際に「誰がアクセスしているか」を判別できるようになります。
また、isset()を使ってセッションの有無を確認することで、不正アクセスを防止する処理も実現できます。これはセキュリティ対策として非常に重要なポイントです。
ログアウト処理とセキュリティ対策
ログアウト処理では、session_unset()とsession_destroy()を組み合わせてセッション情報を完全に削除します。これにより、他のユーザーが同じ端末を使った場合でもログイン状態が引き継がれることを防げます。
さらに、安全性を高めるためにはセッションIDの管理も重要です。session_regenerate_id()を使用することで、セッション固定攻撃のリスクを軽減でき、より安全なログインシステムを構築できます。
実践で役立つセッション活用のポイント
セッションは単なるログイン管理だけでなく、ショッピングカートやフォーム入力内容の保持など、さまざまな用途に応用できます。複数ユーザーが同時にアクセスしても、それぞれのセッションは独立して管理されるため、安心して利用できます。
実務では、セッションの有効期限やクッキー設定、HTTPS通信の利用なども含めて総合的に設計することが重要です。これにより、ユーザー体験とセキュリティの両立が実現できます。
サンプルプログラムで復習
<?php
session_start();
// ログイン処理
if ($_POST['username'] === 'taro' && $_POST['password'] === 'pass123') {
session_regenerate_id(true);
$_SESSION['user'] = $_POST['username'];
header('Location: mypage.php');
exit;
}
// マイページ処理
if (isset($_SESSION['user'])) {
echo "ようこそ、" . $_SESSION['user'] . "さん!";
} else {
header('Location: loginform.html');
exit;
}
// ログアウト処理
session_unset();
session_destroy();
?>
生徒
「セッションって最初は難しそうに感じましたが、ユーザーごとの情報を覚えておく仕組みだとわかってイメージしやすくなりました。」
先生
「その理解でとても良いですね。ログイン機能を作る上でセッションは基本中の基本です。」
生徒
「ログイン後に別ページに移動しても情報が残る理由が、セッションのおかげだと理解できました。」
先生
「その通りです。そして、セッションがあるからこそマイページやカート機能も実現できるのです。」
生徒
「ログアウト時にセッションを削除する理由も納得できました。安全のためなんですね。」
先生
「はい。さらにセッションIDの再生成なども含めて考えると、より安全なシステムになります。」
生徒
「これからはセッションを使って、ちゃんとしたログイン機能を作れそうです。」
先生
「ぜひ実際に手を動かしてみてください。理解が一気に深まりますよ。」