概要

Web アプリの ログイン はしくみだけ見ると驚くほどシンプル。「ユーザーがフォームから ID とパスワードを送る → サーバーで照合 → 合っていたら $_SESSION['user_id'] = 42 のように記録」これだけ。以降のリクエストは「$_SESSION['user_id'] があるか?」を見るだけでログイン判定。ログアウトは session_destroy()$_SESSION = []

ここで 絶対にやってはいけない のがパスワードを 平文で保存すること。DB に password = 'taro123' と入れるのは事故待ち。PHP 標準の password_hash($password, PASSWORD_DEFAULT) で必ずハッシュ化し、ログイン時は password_verify($input, $hash) で照合する。bcrypt / argon2 など現代的なアルゴリズムを PHP が自動で選ぶ神関数。

ログインは本来 2 リクエスト分の動き (フォーム送信 → セッション保存 → 別ページで確認) なので、ドリルでは 1 ファイル内で連続実行して擬似化する。ログイン直後の session_regenerate_id(true) (次の ch06 で深掘り) もここから仕込むのが定石。php -S で動かせば PHPSESSID Cookie が本物の Session ID として機能する様子を確認できる。

学習目標

ドリル

no 内容
01 「ログイン → マイページ表示」を 1 スクリプトで擬似化
02 「ログイン → ログアウト → 状態確認」を 1 スクリプトで擬似化

本物のセッション動作で確認したい場合

cd topics/session-cookie/ch04-login-flow/drill/01-login/
php -S localhost:8000 answer.php

ブラウザで http://localhost:8000/?name=太郎 を開くと「ようこそ、太郎さん」が出る。 リロードすると Session が保たれて同じ表示。

演習: ドリル 01 — ログイン → マイページ表示

問題

$_SESSION を使って「ログイン → マイページ表示」を 1 スクリプトで擬似化してください。

このドリルの入力例 (tests/input.txt):

name=太郎

期待される出力:

ようこそ、太郎さん

ヒント

// 「リクエスト 1: ログインフォーム送信」
$line = trim(fgets(STDIN) ?: '');
parse_str($line, $_POST);
$_SESSION['user'] = ['name' => $_POST['name']];

// 「リクエスト 2: マイページ」
if (isset($_SESSION['user'])) {
    echo "ようこそ、{$_SESSION['user']['name']}さん\n";
} else {
    echo "未ログイン\n";
}

本物の Web で確認したい場合

cd topics/session-cookie/ch04-login-flow/drill/01-login/
php -S localhost:8000 answer.php

ブラウザで http://localhost:8000/?name=太郎 を開く (ドリルでは $_POST 想定だが、php -S 単独確認時は $_GET で代用可)。

演習: ドリル 02 — ログイン → ログアウト → 状態確認

問題

$_SESSION を使って「ログイン → ログアウト → マイページ再表示」を 1 スクリプトで擬似化してください。

このドリルの入力例 (tests/input.txt):

name=太郎

期待される出力:

ログイン: 太郎
ログアウト済

ヒント

// リクエスト 1: ログイン
parse_str(trim(fgets(STDIN) ?: ''), $_POST);
$_SESSION['user'] = ['name' => $_POST['name']];
echo "ログイン: {$_SESSION['user']['name']}\n";

// リクエスト 2: ログアウト
$_SESSION = [];
@session_destroy();

// リクエスト 3: 再アクセス
@session_start();
if (isset($_SESSION['user'])) {
    echo "ようこそ、{$_SESSION['user']['name']}さん\n";
} else {
    echo "ログアウト済\n";
}

本物の Web で確認したい場合

cd topics/session-cookie/ch04-login-flow/drill/02-logout/
php -S localhost:8000 answer.php

この章を AI に聞く

  1. 「ch04 — ログイン状態を `$_SESSION` で保つ」のつまずきやすいポイントを、初学者向けに3つ教えてください

    💬 ChatGPT 📘 Claude ✨ Gemini

  2. 「ch04 — ログイン状態を `$_SESSION` で保つ」について、自分の手で試せる練習問題を3つ出してください (難易度を上げながら)

    💬 ChatGPT 📘 Claude ✨ Gemini

  3. 「ch04 — ログイン状態を `$_SESSION` で保つ」を学んだ後、次に学ぶと良いトピックは何ですか?理由も教えてください

    💬 ChatGPT 📘 Claude ✨ Gemini

🎉 受講お疲れさまでした!

ch04 — ログイン状態を `$_SESSION` で保つ」を読み終えました。
学んだことを誰かに教えると、もっと記憶に残ります。

X で共有 Hatena LINE