PHPセッション管理とは?ログイン認証の仕組みを図解で徹底解説|session_start・$_SESSION・session_regenerate_idの役割まで初心者向け

2026年7月13日月曜日

Laravel PHP バックエンド プログラミング

t f B! P L

PHPセッション管理とは?ログイン認証の仕組みを初心者向けに徹底解説

PHPでログイン機能を作ると必ず登場するのがセッション(Session)です。

「ログインしたのに別ページへ移動してもログイン状態が維持されるのはなぜ?」と疑問に思ったことはありませんか?

その答えがPHPのセッション管理です。

今回紹介するコードは、実際のWebシステムでもよく使われるオーソドックスなログイン認証の実装です。

この記事ではコードの処理を1行ずつ追いながら、中学生でも理解できるように図解イメージを交えて詳しく解説します。


結論|このコードはPHPセッションでログイン状態を管理している

まず結論からいうと、このプログラムは次の流れでログイン状態を管理しています。

  • ブラウザへセッションIDを保存する
  • サーバ側へログイン情報を保存する
  • ページを開くたびにセッションIDを送信する
  • サーバがログイン中か判定する

つまり、ログイン情報そのものをブラウザへ保存しているのではなく、「ログイン情報が保存されている場所を示す番号(セッションID)」だけをCookieへ保存しているという仕組みです。


セッション開始(session_start)の役割

// セッションが開始されていなければ開始する
if (session_status() === PHP_SESSION_NONE) {
    session_start();
}

最初に実行されるのがこの処理です。

session_start()は「今回のアクセスで使うセッションを読み込んでください」という命令になります。

処理の流れ

  1. ブラウザがCookieを送信する
  2. Cookieの中にPHPSESSIDが入っている
  3. PHPがサーバ内のセッションデータを探す
  4. $_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段階で行われます。

  1. $_SESSIONを空にする
  2. session_destroy()でサーバ側のセッションを削除する

これでログイン情報は完全に削除されます。


セッション管理全体の流れ

  1. session_start()でセッション開始
  2. ログイン成功
  3. session_regenerate_id(true)実行
  4. user_idを$_SESSIONへ保存
  5. ブラウザがPHPSESSIDを保持
  6. 次回アクセス時に同じセッションIDを送信
  7. PHPが$_SESSIONを復元
  8. isLoggedIn()でログイン判定
  9. ログアウト時にセッション削除

実務でよくある失敗例

  • 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で安全なログイン機能を作るベストプラクティス

このブログを検索

Welcome



旅するWebライター「Hide」のブログへようこそ!

2年間の世界一周を終え、今は旅の思い出を言葉にしながら、AIやプログラミングという新しい冒険を楽しんでいます。最新技術を味方につけて、もっと自由でクリエイティブな発信を続けていきます!

人気の投稿

QooQ