PHPのCookieとSessionを理解しよう!違いと使い分けを徹底解説

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つの仕組みの違いを正しく理解し、セキュリティを最優先に考えた使い分けを徹底することが、信頼性の高いサービスを構築するための第一歩です。

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!

この記事を書いた人

私が勉強したこと、実践したこと、してることを書いているブログです。
主に資産運用について書いていたのですが、
最近はプログラミングに興味があるので、今はそればっかりです。

目次