Webサイトの基盤であるHTTP通信は、「ステートレス(stateless)」という性質を持っています。これは、ページを移動するたびにサーバーがユーザーのことを忘れてしまう、つまり「前のページで誰が何をしていたか」を覚えていない、ということです。
このままでは、ログイン状態を維持したり、ショッピングカートの中身を保持したりすることができません。この問題を解決し、ユーザーの状態を維持するための仕組みが「クッキー(Cookie)」と「セッション(Session)」です。
両者は似て非なるもので、その違いと適切な使い分けを理解することは、安全で快適なWebアプリケーションを構築する上で非常に重要です。
1. クッキー (Cookie) 〜ブラウザに情報を保存〜
クッキーとは、サーバーからの指示で、ユーザーのWebブラウザ(クライアント側)に保存される小さなテキストデータのことです。
【身近な例え:お店のポイントカード】 お店(サーバー)が、あなた(ブラウザ)にポイントカード(クッキー)を発行します。あなたはそのカードを持ち歩き、次回来店時に提示することで、お店は「ああ、いつものお客様ですね」と認識できます。カード自体に会員番号などの情報が書き込まれています。
1.1. クッキーの保存と削除
PHPでクッキーを保存するにはsetcookie()
関数を使います。
<?php
// 'user_preference'という名前で'dark_mode'という値をクッキーに保存
// 有効期限は30日間 (60秒 * 60分 * 24時間 * 30日)
$expires = time() + (60 * 60 * 24 * 30);
setcookie('user_preference', 'dark_mode', $expires, '/');
// クッキーを削除するには、有効期限を過去の日付に設定する
// setcookie('user_preference', '', time() - 3600, '/');
?>
<h1>クッキーを保存しました</h1>
<p><a href="check.php">次のページで確認</a></p>
setcookie()
は、HTTPヘッダーを送信するため、HTMLが出力されるよりも前に呼び出す必要があります。
1.2. クッキーの読み取り
保存されたクッキーは、$_COOKIE
というスーパーグローバル変数から読み取ることができます。
<?php // check.php
$preference = $_COOKIE['user_preference'] ?? 'not set';
echo 'あなたの設定は: ' . htmlspecialchars($preference); // あなたの設定は: dark_mode
1.3. クッキーの特性と注意点
- 長所:
- 有効期限を長く設定すれば、ユーザーがブラウザを閉じても情報を保持できる(「ログイン状態を保持する」など)。
- 短所・危険性:
- データはユーザーのPCに保存されるため、中身を閲覧・改ざんされる危険性がある。
- パスワードなどの機密情報をクッキーに保存するのは絶対にNG。
- 保存できるデータ量に制限がある(約4KB)。
2. セッション (Session) 〜サーバーに情報を保存〜
セッションは、クッキーのセキュリティ問題を解決するための仕組みです。ユーザーごとのデータ(ログイン情報、カートの中身など)をサーバー側に保存し、ユーザーのブラウザには「セッションID」という合言葉だけをクッキーに保存します。
【身近な例え:スポーツジムのロッカーの鍵】 ジム(サーバー)は、あなたの荷物(ユーザーデータ)をロッカーに保管し、あなたにはロッカー番号が書かれた鍵(セッションID)だけを渡します。あなたは鍵だけを持っていれば、ジムはどのロッカーがあなたのものか分かり、荷物を出し入れできます。重要な荷物(データ)はジム(サーバー)が安全に管理してくれます。
2.1. セッションの開始とデータ操作
セッションを利用するすべてのPHPファイルの冒頭で、必ずsession_start()
を呼び出す必要があります。
【session_set.php
– データの保存】
<?php
// セッションを開始(または再開)
session_start();
// $_SESSION配列にデータを保存
$_SESSION['user_id'] = 12345;
$_SESSION['user_name'] = 'Taro';
$_SESSION['cart']['item_A'] = 2; // カート情報なども保存できる
echo 'セッションにデータを保存しました。';
?>
<p><a href="session_check.php">次のページで確認</a></p>
<p><a href="session_delete.php">セッションを削除</a></p>
【session_check.php
– データの読み取り】
<?php
session_start(); // セッションを再開
$user_name = $_SESSION['user_name'] ?? 'ゲスト';
$item_a_count = $_SESSION['cart']['item_A'] ?? 0;
?>
<p>こんにちは、<?php echo htmlspecialchars($user_name); ?>さん</p>
<p>カート内の商品Aの数: <?php echo $item_a_count; ?>個</p>
2.2. セッションの削除
unset()
で個別のデータを削除したり、セッション全体を完全に破棄することができます。
【session_delete.php
– セッションの完全な破棄】
<?php
session_start();
// 1. セッション変数をすべて空にする
$_SESSION = [];
// 2. セッションIDのクッキーを削除
if (isset($_COOKIE[session_name()])) {
setcookie(session_name(), '', time() - 3600, '/');
}
// 3. サーバー上のセッションファイルを破棄
session_destroy();
echo 'セッションを完全に削除しました。';
3. CookieとSessionの比較と使い分け
項目 | クッキー (Cookie) | セッション (Session) |
データ保存場所 | クライアント(ユーザーのブラウザ) | サーバー |
セキュリティ | 低い(改ざん可能) | 高い |
データ容量 | 小さい(約4KB) | 大きい(サーバーの性能次第) |
有効期限 | 長期設定可能 | ブラウザを閉じると失効(基本) |
主な用途 | 利便性向上(「次回から自動ログイン」など) | ログイン状態、カート情報など重要データの保持 |
【使い分けの鉄則】
- セッション: ログイン状態や個人情報、カートの中身など、重要で改ざんされては困るデータはすべてセッションに保存する。
- クッキー: サイトの表示設定(テーマカラーなど)や、「ログイン状態を保持する」ための目印(安全なトークン)など、利便性を高めるための、漏洩してもリスクの低い情報に限定して使用する。
まとめ
- クッキーは、ブラウザ側にデータを保存する仕組み。手軽だがセキュリティは低い。
- セッションは、サーバー側にデータを保存する仕組み。安全性が高く、重要なデータを扱う際の標準的な方法。
Webアプリケーションにおける状態管理は、ほとんどの場合セッションが主役となります。この2つの仕組みの違いを正しく理解し、セキュリティを最優先に考えた使い分けを徹底することが、信頼性の高いサービスを構築するための第一歩です。