PHP

セッション

ページを移動してもユーザーの状態を引き継ぐ方法を学びましょう。

01

セッションとは

HTTPは本来、前のアクセス状態を覚えていません。セッションを使うと、サーバー側にユーザーごとのデータを保存し、ログイン状態や買い物かごを複数ページで共有できます。

セッションIDを受け取るサーバーのデータを特定状態を復元
02

値を保存・取得する

session_start() はHTMLを出力する前に呼び出します。その後は $_SESSION を配列のように使えます。??は、左側のキーが存在しないか値がnullのときに右側の既定値を使うnull合体演算子です。

セッションの基本PHP
<?php
session_start();

$_SESSION['user_name'] = 'Mity';
$userName = $_SESSION['user_name'] ?? 'ゲスト';
?>

<p>こんにちは、<?= htmlspecialchars(
    $userName,
    ENT_QUOTES,
    'UTF-8'
) ?>さん</p>
03

ログイン状態を保存する

パスワードは平文保存せず password_hash() でハッシュ化し、ログイン時は password_verify() で確認します。

ログイン成功時PHP
session_start();

if (password_verify($password, $user['password_hash'])) {
    session_regenerate_id(true);
    $_SESSION['user_id'] = $user['id'];
    header('Location: /mypage.php');
    exit;
}

ログインが必要なページでは、処理の最初にユーザーIDの有無を確認します。

ログイン確認PHP
session_start();

if (!isset($_SESSION['user_id'])) {
    header('Location: /login.php');
    exit;
}
04

ログアウトする

logout.phpPHP
session_start();
$_SESSION = [];

if (ini_get('session.use_cookies')) {
    $params = session_get_cookie_params();
    setcookie(session_name(), '', time() - 42000, $params['path']);
}

session_destroy();
header('Location: /login.php');
exit;
05

一度だけ表示するメッセージ

保存完了など、次のページで一度だけ見せたい通知にもセッションを使えます。

フラッシュメッセージPHP
// リダイレクト前
$_SESSION['flash'] = '保存しました。';

// 移動先
$message = $_SESSION['flash'] ?? null;
unset($_SESSION['flash']);
06

安全に使うために

必ず意識すること
  • ログイン成功時に session_regenerate_id(true) を呼ぶ
  • Cookieへ SecureHttpOnly、適切な SameSite を設定する
  • 重要な操作にはCSRFトークンを使う
  • セッションにパスワードやカード番号を保存しない
  • 一定時間でログインを失効させる

セッションCookieの属性は、session_start() より前に設定します。次の例では、HTTPS通信だけでCookieを送信し、JavaScriptからの読み取りを禁止しています。

Cookieの安全設定PHP
session_set_cookie_params([
    'secure' => true,
    'httponly' => true,
    'samesite' => 'Lax',
]);

session_start();
HTTPSが前提 securetrue にすると、ブラウザーはHTTP接続ではCookieを送信しません。http://localhost などHTTPのローカル環境で試す場合は、一時的に 'secure' => false へ変更してください。公開する本番環境ではHTTPSを使い、必ず true に戻します。