PHPのCookieとセッションの違いとは?メリット・デメリットを解説
新人
「PHPのCookieとセッションって、何が違うんですか?」
先輩
「Cookieとセッションは、どちらもユーザー情報を保存するための仕組みですが、それぞれ役割が違います。」
新人
「どういう場面で使い分けるんですか?」
先輩
「それぞれの仕組みを理解すれば、どのような場面で使うべきかが分かりますよ。まずは、Cookieから説明していきますね。」
1. Cookieとは?
Cookie(クッキー)とは、Webサイトがユーザーのブラウザ(ChromeやSafariなど)に一時的に保存させる小さなデータのことです。Webサイトを訪問した際にサーバーから送られ、次に同じサイトを訪れたとき、ブラウザがそのデータをサーバーに自動で送り返すことで、「あ、前にも来たあの人だ!」と識別できる仕組みになっています。
プログラミング未経験の方でもイメージしやすい具体例を挙げると、以下のような場面で使われています。
- ECサイト:一度チェックした「最近見た商品」をずっと表示しておく
- ログイン画面:「ログイン状態を保持する」にチェックを入れると、次回から入力が省ける
- カスタマイズ:サイトの背景色を「ダークモード」に設定した情報を覚えておく
このように、サーバー側ではなく「ユーザーの手元のデバイス」に情報を預けるのがCookieの大きな特徴です。
Cookieの基本的な使い方
PHPでCookieを保存するには、setcookie()という関数を使います。最もシンプルな書き方は、「名前」と「値」を指定することです。
<?php
// 「user_type」という名前で「premium」という値を保存する
// 第3引数には有効期限(現在の時刻 + 60秒 * 60分 * 24時間 * 7日間 = 1週間)を指定
setcookie("user_type", "premium", time() + (60 * 60 * 24 * 7), "/");
echo "Cookieを保存しました!1週間有効です。";
?>
上記のコードでは、time()で現在の時刻を取得し、そこに秒数を足すことで期限を決めています。期限を過ぎると、ブラウザから自動的に削除されます。最後の"/"は、サイト内のどのページでもこのCookieを使えるようにするための設定です。
Cookieの取得方法
保存されたデータを取り出すときは、PHPが用意している魔法の変数 $_COOKIE を使います。これは「連想配列」という形式でデータが入っています。
<?php
// issetを使って、Cookieが保存されているか確認してから表示する
if (isset($_COOKIE["user_type"])) {
$type = $_COOKIE["user_type"];
echo "あなたの会員ランクは " . $type . " です。";
} else {
echo "初めてのご訪問ですね!ようこそ。";
}
?>
このように、$_COOKIE["設定した名前"] と書くだけで、ブラウザに保存された値をいつでも呼び出して、ユーザーごとに表示を変える(パーソナライズする)ことが可能になります。
2. セッションとは?
セッション(Session)とは、サーバー側にユーザーのデータを一時的に保存する仕組みのことです。Cookieがユーザーのブラウザ(手元のスマホやPC)にデータを預けるのに対し、セッションはサービスを提供しているサーバーの中にデータを保管します。
未経験の方には「ホテルのクローク(荷物預かり所)」をイメージすると分かりやすいでしょう。Cookieが「自分で持ち歩くカバン」なら、セッションは「フロントに預けて、代わりに『引換券(セッションID)』だけを受け取った状態」です。手元には軽い引換券があるだけで、重い荷物(大切なデータ)は安全な奥の部屋で管理されている、というわけです。
この仕組みは、主に以下のような「セキュリティが重要な場面」や「データ量が多い場面」で活躍します。
- ログイン認証:「誰がログインしているか」という重要情報を安全に保持する
- ショッピングカート:選んだ商品をレジ(決済画面)まで落とさずに運ぶ
- フォーム入力:複数ページにわたるアンケートの回答内容を一時保存する
セッションの基本的な使い方(保存)
PHPでセッションを開始するには、まず「今からセッションを使いますよ!」という合図である session_start() を魔法の呪文のように一番最初に記述します。
<?php
// 1. セッションを開始する(必須の準備)
session_start();
// 2. セッションにデータを保存する
// $_SESSION["名前"] = 保存したい値; という形式で書きます
$_SESSION["user_name"] = "たろう";
$_SESSION["last_login"] = "2026-03-30";
echo "セッションにユーザー名「たろう」を保存しました!";
?>
このコードが実行されると、サーバーにデータが保管され、ブラウザには「セッションID」という名前の小さな引換券(Cookieの一種)が自動で発行されます。これにより、ページを移動してもサーバー側で「あ、この引換券を持っているのは『たろう』さんだ」と判別できるようになります。
セッションの取得方法(呼び出し)
保存したデータを取り出すときも、必ず session_start() から始めます。データは $_SESSION という特別な変数の中にまとめられています。
<?php
// 1. セッションを再開する
session_start();
// 2. 保存されているか確認して表示する
if (isset($_SESSION["user_name"])) {
$name = $_SESSION["user_name"];
echo "おかえりなさい、" . $name . "さん!";
} else {
echo "ログイン情報が見つかりません。";
}
?>
セッションの有効期限は、基本的には「ブラウザを閉じるまで」です。クロークの荷物が当日限りであるように、ブラウザを閉じると引換券が破棄され、サーバーとの接続(セッション)が終了する仕組みになっています。これにより、共有PCなどでログインしたまま離れても、ブラウザさえ閉じれば他人に情報を覗かれにくくなるというメリットがあります。
3. Cookieとセッションの違い(データの保存場所や有効期限の違い)
Cookieとセッションは、どちらも「ユーザーの状態を保持する」という目的は同じですが、その仕組みや特性には決定的な違いがあります。2026年現在のWeb開発においても、この違いを正しく理解して使い分けることは、セキュリティとユーザー体験(UX)の両面で非常に重要です。
特に意識すべき「データの保存場所」と「有効期限」の2点について、初心者の方にも分かりやすく比較表とサンプルコードで解説します。
<div class="table-responsive"> <table class="table table-bordered"> <thead> <tr class="table-secondary"> <th>比較項目</th> <th>Cookie(クッキー)</th> <th>セッション</th> </tr> </thead> <tbody> <tr> <th>データの保存場所</th> <td>ユーザーのブラウザ(PCやスマホ)</td> <td>Webサーバー側</td> </tr> <tr> <th>有効期限</th> <td>自由に指定可能(数日〜数年など)</td> <td>原則、ブラウザを閉じるまで</td> </tr> <tr> <th>セキュリティ</th> <td>ユーザーが見たり書き換えたりできる</td> <td>ユーザーから直接は見えないので安全</td> </tr> <tr> <th>主な用途</th> <td>ログイン保持、言語設定など</td> <td>個人情報、決済、カート内容など</td> </tr> </tbody> </table> </div> <h3>データの保存場所の違い</h3> <p>一番の違いは、<strong>「誰がデータを預かっているか」</strong>です。</p> <ul> <li><strong>Cookie</strong>:データそのものをユーザーのブラウザに預けます。そのため、次回訪問時もブラウザがそのデータを持っていれば、すぐに読み出すことができます。</li> <li><strong>セッション</strong>:データはサーバーの「金庫(メモリやファイル)」に保管されます。ブラウザにはその金庫を開けるための「鍵(セッションID)」だけを預けます。</li> </ul> <h3>有効期限の違いとサンプルコード</h3> <p>Cookieは「いつまで覚えておくか」を秒単位で細かく指定できるのが特徴です。一方、セッションは「今この時だけ」の一時的なやり取りに向いています。</p> <p><strong>Cookieの有効期限設定(30日間保存する場合)</strong></p>
<?php
// time() は現在の時刻。そこに 60秒 × 60分 × 24時間 × 30日 を足して期限を計算します
$expire = time() + (60 * 60 * 24 * 30);
// 「user_pref」という名前で「dark_mode」という値を30日間保存
setcookie("user_pref", "dark_mode", $expire, "/");
echo "設定を30日間保存しました。ブラウザを閉じても消えません。";
?>
セッションの有効期限(ブラウザを閉じると終了)
<?php
// セッションを開始。この時点でサーバーにデータ保存領域が作られます
session_start();
// データを保存。有効期限を指定するコードはありません(ブラウザ終了まで)
$_SESSION["tmp_data"] = "編集中の一時的な内容";
echo "セッションに保存しました。ブラウザを完全に閉じると自動的に消去されます。";
?>
このように、「長く残したい設定はCookie」「短期間で安全に守りたいデータはセッション」という使い分けが基本となります。それぞれのメリット・デメリットを次の章で詳しく見ていきましょう。
4. Cookieを使うメリット・デメリット
Cookieを使うメリット
- データがブラウザに保存されるため、サーバーの負荷が少ない。
- 有効期限を長く設定でき、ログイン情報などを保持しやすい。
- ページ遷移をまたいでもデータが利用可能。
Cookieを使うデメリット
- データがユーザーの端末に保存されるため、盗まれるリスクがある。
- ブラウザの設定によっては、Cookieが無効化されることがある。
- 1つのCookieの保存サイズには制限があり、大量のデータを保持できない。
セキュリティ対策
Cookieを安全に使用するために、以下の設定を推奨します。
<?php
setcookie("secure_cookie", "value", [
"expires" => time() + (86400 * 30),
"path" => "/",
"secure" => true, // HTTPSでのみ送信
"httponly" => true, // JavaScriptからのアクセスを禁止
"samesite" => "Strict" // CSRF対策
]);
?>
5. セッションを使うメリット・デメリット
セッションを使うメリット
- データがサーバー側に保存されるため、安全性が高い。
- 大量のデータを保持できる(サーバーのストレージに依存)。
- ユーザーのブラウザの設定に依存せずに利用できる。
セッションを使うデメリット
- サーバー側でデータを管理するため、負荷がかかる可能性がある。
- ブラウザを閉じるとデフォルトでセッションが無効になる。
- 異なるデバイスでは同じセッション情報を利用できない。
セッションの安全な利用方法
セッションを安全に利用するためには、セッションIDを適切に管理することが重要です。
<?php
session_start();
// セッションIDを変更してセキュリティを強化
session_regenerate_id(true);
$_SESSION["user_id"] = 123;
?>
6. Cookieとセッションの使い分け(どのような場面でどちらを使うべきか)
Cookieとセッションは、それぞれ適した用途があります。どちらを使うべきかは、保存するデータの種類や利用する場面によって決まります。
Cookieを使うべき場面
- ユーザーの設定情報(テーマカラー、言語設定など)を保存したいとき。
- ログイン状態を保持する「Remember Me」機能を実装したいとき。
- ユーザーがアクセスするたびにサーバーと通信しないで済む情報を保存したいとき。
セッションを使うべき場面
- ログイン情報を安全に管理したいとき。
- ショッピングカートのデータを保持したいとき。
- ユーザーごとに一時的なデータを管理したいとき。
Cookieとセッションを組み合わせる方法
ログイン機能などでは、Cookieとセッションを組み合わせて使うのが一般的です。例えば、ログイン情報はセッションに保存し、「Remember Me」機能で自動ログインする場合はCookieを利用します。
<?php
session_start();
if (isset($_COOKIE["remember_me"])) {
$_SESSION["username"] = $_COOKIE["remember_me"];
}
?>
7. セキュリティ対策(CookieのSecure属性、セッションIDの保護 など)
Cookieとセッションは便利ですが、適切なセキュリティ対策を行わないと、情報漏えいや攻撃のリスクがあります。
Cookieのセキュリティ対策
Cookieを安全に利用するためには、以下の設定を行うことが重要です。
- Secure属性:HTTPS通信のみでCookieを送信する。
- HttpOnly属性:JavaScriptからCookieを取得できないようにする。
- SameSite属性:異なるサイトからのリクエストでCookieが送信されないようにする。
<?php
setcookie("secure_cookie", "value", [
"expires" => time() + (86400 * 30),
"path" => "/",
"secure" => true,
"httponly" => true,
"samesite" => "Strict"
]);
?>
セッションのセキュリティ対策
セッションを安全に利用するためには、セッションIDの管理が重要です。
- セッションIDの定期的な変更:攻撃者に盗まれた場合のリスクを減らす。
- HTTPSの使用:通信内容を暗号化し、盗聴を防ぐ。
- セッションの適切な破棄:ログアウト時にセッションを削除する。
<?php
session_start();
session_regenerate_id(true); // セッションIDの変更
?>
8. まとめとおすすめの使い方
Cookieとセッションにはそれぞれ異なる役割があり、適切な場面で使い分けることが重要です。
Cookieを使うべき場面
- ユーザーの設定を保存したいとき。
- ログイン情報を保持する「Remember Me」機能を作りたいとき。
セッションを使うべき場面
- ログイン認証などの重要なデータを扱うとき。
- ショッピングカートのデータを管理するとき。
セキュリティ対策のポイント
- CookieにはSecure、HttpOnly、SameSite属性を設定する。
- セッションIDを定期的に変更し、適切に破棄する。
- HTTPSを利用して通信を暗号化する。
これらのポイントを押さえれば、Cookieとセッションを安全に活用することができます。
まとめ
PHPにおけるCookieとセッションの使い分けは、Webアプリケーションの機能性と安全性の両立に不可欠な知識です。それぞれの仕組みがどのように動作するのかを正しく理解することで、より効率的かつ安全なユーザー体験を設計することが可能になります。
Cookieはクライアント側(ブラウザ)にデータを保存するため、リソース消費が少なく、長期間のデータ保持に適しています。一方、セッションはサーバー側で管理され、外部からのアクセスが困難なため、機密性の高い情報を扱う場面に向いています。
たとえば、ユーザーの名前や選択した言語、テーマ設定などはCookieで保持するのが一般的です。対して、ログイン中のユーザー識別情報や購入中の商品リストのようなセンシティブなデータは、セッションで保持するのが安全です。
Cookieとセッションを併用したログイン処理例
<?php
session_start();
// 自動ログイン処理(Remember Me)
if (!isset($_SESSION['user']) && isset($_COOKIE['remember_me'])) {
$_SESSION['user'] = $_COOKIE['remember_me'];
// セキュリティ向上のためセッションIDを再生成
session_regenerate_id(true);
}
// セッションが設定されていればログイン状態
if (isset($_SESSION['user'])) {
echo "ようこそ " . htmlspecialchars($_SESSION['user']) . " さん";
} else {
echo "ログインしてください。";
}
?>
このようにCookieとセッションを適切に組み合わせることで、「Remember Me」機能なども安全に実現できます。加えて、httponlyやsecure属性の活用、セッションIDの定期的な再生成など、セキュリティに配慮した設計が求められます。
Webアプリケーション開発において、ただ機能が動けば良いという考えではなく、「どの情報をどこに保存すべきか?」という視点を持つことが、安心できるシステム構築につながります。
生徒
「Cookieはブラウザに保存されて、セッションはサーバーに保存されるっていうのが一番の違いなんですね!」
先生
「その通りです。保存場所が違うことで、それぞれ向いている使い方も異なるんですよ。」
生徒
「セッションの方が安全って聞いたんですが、ずっと残しておきたい情報にはCookieの方が向いてるんですか?」
先生
「そうですね。たとえば『次回から自動ログイン』のように、長期間覚えていてほしい情報にはCookieが便利です。ただし、安全に使うためにはセキュリティ設定も忘れずに。」
生徒
「セッションはログイン状態とかショッピングカートにピッタリってことですね!」
先生
「まさにその通り。ユーザーが安心して使えるサイトにするためには、Cookieとセッションの違いを理解して、適切に選ぶことが大切です。」
生徒
「セッションIDを変えるとか、CookieのSecure属性とか、ちゃんと考えて実装するようにします!」
先生
「いい心構えですね。ユーザーの情報を守るための工夫は、開発者としてとても大切な視点ですよ。」