589 文字
3 分
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()でサーバー側データ削除

データ保存の仕組み#

graph LR
A[ブラウザ] -->|セッションID| B(PHPサーバー)
B -->|ファイル/DB| C[セッションデータ]
  • クライアント側: セッション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は永続的なユーザー設定向けです。両者を適切に組み合わせることで、安全かつ柔軟な状態管理が可能になります。