🐘

PHPとセッション

に公開

PHPにおけるセッションの基本概念

セッションはサーバー側でユーザー固有のデータを一時的に保持する仕組みです。ブラウザを閉じるまで(またはセッションが明示的に破棄されるまで)複数ページ間で状態を維持できます。HTTPプロトコル自体がステートレス(状態を保持しない)なため、ログイン状態やカート情報などの永続化に必須の技術です。


主な用途と実践例

1. ユーザー認証管理

ログイン状態の維持に最も頻繁に使用されます:

session_start();
if ($_POST['username'] === 'admin' && $_POST['password'] === 'secret') {
    $_SESSION['loggedin'] = true;
    $_SESSION['username'] = 'admin';
}

認証後、全ページで$_SESSION['loggedin']を確認してアクセス制御が可能。

2. データの一時保存

用途 具体例
ショッピングカート 商品選択状態の保持
フォーム入力途中 マルチページフォームのデータ引き継ぎ
ユーザー設定 テーマカラーや言語設定の保存

3. セキュリティ関連

  • CSRFトークンの生成・検証
  • 認証試行回数の記録
  • セッションハイジャック対策(session_regenerate_id(true)によるID再生成)

技術的仕組み

セッションのライフサイクル

  1. 開始: session_start()でサーバーにセッションファイル作成
  2. ID発行: 一意のセッションIDを生成(例: PHPSESSID=3c7fj29cd8a3
  3. データ保存: $_SESSIONスーパーグローバル変数に連想配列形式で格納
  4. 終了: session_destroy()でサーバー側データ削除

データ保存の仕組み

  • クライアント側: セッションIDのみCookie(またはURLパラメータ)で保持
  • サーバー側: セッションIDに対応するデータをファイル/RDB/NoSQLに保存

実装上の注意点

必須プラクティス

// セッション開始(スクリプト最上部で実行)
session_start();

// セキュリティ強化
ini_set('session.cookie_httponly', 1);
ini_set('session.cookie_secure', 1);

// データ保存例
$_SESSION['user'] = [
    'id' => 123,
    'last_access' => time()
];

// 適切な終了処理
$_SESSION = []; // メモリ上のデータクリア
session_destroy(); // サーバー側データ削除

セキュリティ対策

  1. セッションIDの再生成: 権限昇格時にsession_regenerate_id(true)を実行
  2. Cookie設定: HttpOnlySecureフラグを有効化
  3. タイムアウト: session.gc_maxlifetimeで有効期限設定
  4. サニタイズ: $_SESSIONへの直接代入を避け、入力検証を実施

従来技術との比較

特徴 セッション Cookie
保存場所 サーバー側 クライアント側
容量制限 無制限 4KB程度
データ安全性 高い 低い(改竄可能)
有効期間 ブラウザ閉じるまで 任意に設定可能

セッションは機密性の高いデータ管理に適し、Cookieは永続的なユーザー設定向けです。両者を適切に組み合わせることで、安全かつ柔軟な状態管理が可能になります。

Discussion