🇯🇵 日本語 | 🇺🇸 English | 🇪🇸 Español | 🇵🇹 Português | 🇹🇭 ไทย | 🇨🇳 中文

【PHP入門】状態を記憶する魔法!セッションでログイン認証を作る方法

Webサイトを見ていると、「ログイン」機能は当たり前のように存在しますよね。一度ログインすれば、別のページに移動しても「ログイン状態」が維持され、会員限定のコンテンツを見ることができます。しかし、Webの通信(HTTP)は本来、各ページのリクエストが独立していて「状態を記憶しない」という性質を持っています。では、どうやってログイン状態を維持しているのでしょうか?

その秘密が、PHPのセッション (Session) という技術です。セッションは、訪問者一人ひとりに「あなたはログイン済みですよ」という合言葉をサーバー側に記憶させておく仕組みです。この記事では、このセッション機能を使って、簡単なパスワード認証付きの「会員限定ページ」を作成する方法を解説します。2つのファイルを作るだけで、Webサイトに必須のログイン機能の核心部分を体験できます。コピペで動かして、状態を記憶する魔法を実感してみましょう!

PHPを動かすための準備(開発環境)まだXAMPP「ザンプ」を構築してない方は、【PHP入門】XAMPPのダウンロードとインストール方法を徹底解説!を参照してください。 インストール後、指定されたフォルダ(`htdocs`など)にPHPファイルを置けば、準備は完了です!

1. セッションの仕組み:PHPの記憶術

セッションとは、Webサイトを訪れたユーザーの情報を、サーバー側に一時的に保存しておくための仕組みです。例えるなら、イベント会場の受付でリストバンドを巻いてもらうようなもの。一度リストバンド(セッション開始)を巻いてもらえば、会場内のどのエリア(ページ)に行っても、スタッフ(サーバー)はあなたが正規の参加者(ログイン済みユーザー)だと認識できます。

PHPでセッションを扱うには、主に3つの命令を覚えるだけでOKです。

  1. session_start(): 「今からセッションを使います!」という開始の合図。セッションを使う全てのページの一番最初に必ず書く必要があります。
  2. $_SESSION: ログイン状態などの情報を保存しておくための特別な配列です。$_SESSION['キー'] = 値; のようにして自由にデータを保存・確認できます。
  3. session_destroy(): ログアウト時などに、サーバーに保存されたセッション情報を完全に削除します。

この3つを使い、ログインシステムを構築していきます。

2. 実践!ログインシステムを作ってみよう

今回は、以下の2つのファイルを作成します。

これら2つのファイルを同じフォルダに保存してください。

ファイル1: login.php(ログインページ)

このファイルは、パスワード入力フォームと、送信されたパスワードが正しいかチェックするロジックを両方含んでいます。

<?php
// ① セッションを開始
session_start();

$error_message = '';
// ② POSTリクエスト(フォーム送信)があった場合
if ($_SERVER['REQUEST_METHOD'] === 'POST') {
    // ③ ハードコーディングされたパスワードと照合
    $correct_password = 'password123'; // 本来はデータベースで管理します
    $input_password = $_POST['password'];

    if ($input_password === $correct_password) {
        // ④ パスワードが一致した場合
        $_SESSION['is_logged_in'] = true; // ログイン状態をセッションに保存
        header('Location: member_page.php'); // 会員ページへリダイレクト
        exit;
    } else {
        // パスワードが不一致の場合
        $error_message = 'パスワードが間違っています。';
    }
}
?>
<!DOCTYPE html>
<html lang="ja">
<head>
    <meta charset="UTF-8">
    <title>ログイン</title>
    <style>
        body { font-family: sans-serif; padding: 20px; text-align: center; }
        .login-form { max-width: 300px; margin: 50px auto; padding: 20px; border: 1px solid #ccc; border-radius: 8px; }
        input[type="password"] { width: 100%; padding: 10px; margin: 10px 0; box-sizing: border-box; }
        button { width: 100%; padding: 10px; background-color: #007bff; color: white; border: none; border-radius: 4px; cursor: pointer; }
        .error { color: red; margin-bottom: 10px; }
    </style>
</head>
<body>
    <div class="login-form">
        <h1>ログイン</h1>
        <?php if ($error_message): ?>
            <p class="error"><?php echo $error_message; ?></p>
        <?php endif; ?>
        <form action="login.php" method="POST">
            <input type="password" name="password" placeholder="パスワード" required>
            <button type="submit">ログイン</button>
        </form>
    </div>
</body>
</html>

ファイル2: member_page.php(会員限定ページ)

このページは、アクセス時に「ログイン済み」の証拠(セッション情報)があるかどうかをチェックします。証拠がなければ、問答無用でログインページに追い返します。

<?php
// ① セッションを開始
session_start();

// ② ログイン状態をチェック
//    $_SESSION['is_logged_in'] が存在しない、またはfalseの場合はログインページにリダイレクト
if (!isset($_SESSION['is_logged_in']) || $_SESSION['is_logged_in'] !== true) {
    header('Location: login.php');
    exit;
}
?>
<!DOCTYPE html>
<html lang="ja">
<head>
    <meta charset="UTF-8">
    <title>会員限定ページ</title>
    <style>
        body { font-family: sans-serif; padding: 20px; }
        .content { border: 2px dashed #007bff; padding: 20px; background: #f0f8ff; }
        a { color: #d9534f; }
    </style>
</head>
<body>
    <h1>ようこそ、会員様!</h1>
    <div class="content">
        <p>ここはログインした人だけが見ることができる特別なコンテンツです。</p>
        <p>(ここに会員限定の情報を表示します)</p>
    </div>
    <p><a href="logout.php">ログアウトする</a></p>
</body>
</html>

これで準備完了です!ブラウザで`login.php`にアクセスし、パスワードに「`password123`」と入力してみてください。正しければ会員ページに移動し、間違っていればエラーメッセージが表示されるはずです。また、ログインせずに直接`member_page.php`にアクセスしようとすると、`login.php`に強制的に戻されることも確認できます。

3. 気をつけるべき点と応用例

このシンプルな仕組みは強力ですが、実際の運用ではセキュリティをさらに高める必要があります。

パスワードの安全な保管

今回の例では、パスワードを`'password123'`のように直接コードに書きました(ハードコーディング)。これは非常に危険です。実際の開発では、パスワードは必ず**ハッシュ化**という処理を施して、元のパスワードが分からない形でデータベースに保存します。

PHPには、そのための`password_hash()`関数と`password_verify()`関数が用意されています。

<?php
// パスワードをハッシュ化して保存する(ユーザー登録時など)
$hashed_password = password_hash('password123', PASSWORD_DEFAULT);

// ログイン時に入力されたパスワードと、保存されたハッシュが一致するか検証する
if (password_verify('password123', $hashed_password)) {
    echo 'パスワードが一致しました!';
} else {
    echo 'パスワードが間違っています。';
}
?>

ログアウト処理

会員ページには「ログアウト」リンクを設置しました。このリンク先である`logout.php`では、セッションを安全に破棄する処理が必要です。

<?php
session_start();

// セッション変数を全て解除
$_SESSION = array();

// セッションを破棄
session_destroy();

// ログアウト後にログインページへリダイレクト
header('Location: login.php');
exit;
?>

session_destroy()でセッションを完全に破壊することで、ログアウトが完了します。

4. まとめ

今回は、PHPのセッション機能を使って、Webサイトに「状態」を記憶させ、簡単なログインシステムを構築する方法を学びました。`session_start()`でセッションを開始し、`$_SESSION`配列に情報を格納、そしてページを移動してもその情報が維持される、という流れが掴めたでしょうか。

このセッションの仕組みは、ログイン認証だけでなく、複数ページにまたがる入力フォームや、ショッピングカートの中身を記憶させておくなど、様々な場面で応用されるWebアプリケーションの根幹をなす技術です。ぜひこの基本をマスターして、より高度な機能開発に挑戦してみてください!