PHPセッション管理とは?ログイン認証の仕組みを初心者向けに徹底解説
PHPでログイン機能を作ると必ず登場するのがセッション(Session)です。
「ログインしたのに別ページへ移動してもログイン状態が維持されるのはなぜ?」と疑問に思ったことはありませんか?
その答えがPHPのセッション管理です。
今回紹介するコードは、実際のWebシステムでもよく使われるオーソドックスなログイン認証の実装です。
この記事ではコードの処理を1行ずつ追いながら、中学生でも理解できるように図解イメージを交えて詳しく解説します。
結論|このコードはPHPセッションでログイン状態を管理している
まず結論からいうと、このプログラムは次の流れでログイン状態を管理しています。
- ブラウザへセッションIDを保存する
- サーバ側へログイン情報を保存する
- ページを開くたびにセッションIDを送信する
- サーバがログイン中か判定する
つまり、ログイン情報そのものをブラウザへ保存しているのではなく、「ログイン情報が保存されている場所を示す番号(セッションID)」だけをCookieへ保存しているという仕組みです。
セッション開始(session_start)の役割
// セッションが開始されていなければ開始する
if (session_status() === PHP_SESSION_NONE) {
session_start();
}
最初に実行されるのがこの処理です。
session_start()は「今回のアクセスで使うセッションを読み込んでください」という命令になります。
処理の流れ
- ブラウザがCookieを送信する
- Cookieの中にPHPSESSIDが入っている
- PHPがサーバ内のセッションデータを探す
- $_SESSIONへ自動的に展開する
例えばブラウザが次のCookieを送ったとします。
PHPSESSID=abc123
サーバにはこのようなデータがあります。
$_SESSION = [
'user_id' => 5,
'username' => 'suzuki'
];
すると、この情報が自動的に復元され、ログイン状態が維持されます。
ログイン判定(isLoggedIn)の仕組み
// user_idが存在すればログイン中
function isLoggedIn(): bool
{
return isset($_SESSION['user_id']);
}
この関数では非常にシンプルな判定をしています。
$_SESSION['user_id']が存在するかだけを確認しています。
| セッション内容 | 判定結果 |
|---|---|
| user_idあり | ログイン中 |
| user_idなし | 未ログイン |
つまり、user_idがログイン状態を表す鍵になっています。
ログイン必須ページの制御(requireLogin)
// 未ログインならログイン画面へ移動
function requireLogin(): void
{
if (!isLoggedIn()) {
header('Location: login.php');
exit;
}
}
この関数はマイページなど、ログインしていないと見られてはいけないページで使用します。
例えば、ページの先頭で次のように呼び出します。
requireLogin();
ログイン済みならそのまま処理を続行し、未ログインならlogin.phpへリダイレクトされます。
実務ではほぼ必須となる処理です。
現在ログイン中のユーザー情報を取得する
// セッションのuser_idからDBのユーザー情報を取得
function currentUser(): ?array
{
if (!isLoggedIn()) {
return null;
}
return findUserById($_SESSION['user_id']);
}
ここが実務でも非常によく使われる設計です。
セッションにはユーザー情報すべてを保存せず、user_idだけを保持しています。
そして必要になったタイミングでデータベースから最新情報を取得します。
なぜこの設計が良いの?
- 最新のユーザー情報を取得できる
- セッション容量が小さい
- 情報の整合性が保たれる
- セキュリティ面でも比較的安全
ログイン処理(loginUser)の流れ
// ログイン成功時の処理
function loginUser(array $user): void
{
// セッション固定攻撃対策
session_regenerate_id(true);
$_SESSION['user_id'] = $user['id'];
$_SESSION['username'] = $user['username'];
}
このコードで最も重要なのがsession_regenerate_id(true)です。
なぜセッションIDを変更するのか?
ログイン前のセッションIDをそのまま使い続けると、「Session Fixation(セッション固定攻撃)」という攻撃を受ける可能性があります。
例えば、ログイン前は次のIDだったとします。
PHPSESSID = aaa111
ログイン成功後に新しいIDへ変更します。
PHPSESSID = zzz999
これにより攻撃者が事前に知っていたセッションIDは無効になり、安全性が大きく向上します。
これはPHPログイン認証のベストプラクティスです。
ログアウト処理
// セッションを破棄してログアウト
function logoutUser(): void
{
$_SESSION = [];
session_destroy();
}
ログアウトは2段階で行われます。
- $_SESSIONを空にする
- session_destroy()でサーバ側のセッションを削除する
これでログイン情報は完全に削除されます。
セッション管理全体の流れ
- session_start()でセッション開始
- ログイン成功
- session_regenerate_id(true)実行
- user_idを$_SESSIONへ保存
- ブラウザがPHPSESSIDを保持
- 次回アクセス時に同じセッションIDを送信
- PHPが$_SESSIONを復元
- isLoggedIn()でログイン判定
- ログアウト時にセッション削除
実務でよくある失敗例
- session_start()を書き忘れる
- header()の前にHTMLを出力してしまう
- session_regenerate_id()を実行していない
- ログアウト時にCookieを削除していない
- セッションタイムアウトを設定していない
さらに安全にするベストプラクティス
- ログアウト時はCookieも削除する
- 30分程度のセッションタイムアウトを設ける
- currentUser()で存在しないユーザーなら強制ログアウトする
- CookieへHttpOnly・Secure・SameSite属性を設定する
- HTTPS通信を利用する
まとめ
このコードはPHPで最も標準的なセッション認証の実装です。
- session_start()でセッションを開始する
- ログイン成功時にuser_idをセッションへ保存する
- ブラウザはPHPSESSIDだけを保持する
- ページを開くたびにセッション情報が復元される
- isLoggedIn()で認証状態を判定する
- session_regenerate_id(true)でセッション固定攻撃を防止する
- logoutUser()でセッションを破棄する
このように、ブラウザとサーバがセッションIDを介して連携することで、ページを移動してもログイン状態を維持できています。
さらにCookie削除やセッションタイムアウトを追加すれば、より実務レベルで安全なログインシステムになります。
初心者向け学習ポイント
- CookieとSessionの違いを理解する
- session_start()の役割を覚える
- $_SESSIONの使い方を身につける
- header()によるリダイレクトを理解する
- Session Fixation対策の重要性を知る
実務での活用例
- 会員サイトのログイン認証
- ECサイトのマイページ
- 管理画面(CMS)
- 予約システム
- 社内Webシステム
- ブログ管理画面
次に学ぶべき関連記事候補
- PHP Cookieとは?セッションとの違いを初心者向けに解説
- PHP header()関数の使い方とリダイレクトの基本
- PHP password_hash()とpassword_verify()による安全なパスワード認証
- PHP CSRF対策の基本と実装方法
- PHPで安全なログイン機能を作るベストプラクティス







0 件のコメント:
コメントを投稿