🐘
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再生成)
技術的仕組み
セッションのライフサイクル
-
開始:
session_start()
でサーバーにセッションファイル作成 -
ID発行: 一意のセッションIDを生成(例:
PHPSESSID=3c7fj29cd8a3
) -
データ保存:
$_SESSION
スーパーグローバル変数に連想配列形式で格納 -
終了:
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(); // サーバー側データ削除
セキュリティ対策
-
セッションIDの再生成: 権限昇格時に
session_regenerate_id(true)
を実行 -
Cookie設定:
HttpOnly
とSecure
フラグを有効化 -
タイムアウト:
session.gc_maxlifetime
で有効期限設定 -
サニタイズ:
$_SESSION
への直接代入を避け、入力検証を実施
従来技術との比較
特徴 | セッション | Cookie |
---|---|---|
保存場所 | サーバー側 | クライアント側 |
容量制限 | 無制限 | 4KB程度 |
データ安全性 | 高い | 低い(改竄可能) |
有効期間 | ブラウザ閉じるまで | 任意に設定可能 |
セッションは機密性の高いデータ管理に適し、Cookieは永続的なユーザー設定向けです。両者を適切に組み合わせることで、安全かつ柔軟な状態管理が可能になります。
Discussion