1. PHP

【PHP】セッションとクッキーの違いと使い分けをわかりやすく解説!

Share

Webアプリケーション開発で避けて通れないのが「セッション」と「クッキー」の扱いです。

どちらもユーザーの状態を保持するための仕組みですが、役割や保存場所などに明確な違いがあります。

この記事ではセッションとクッキーの仕組みと違い、そして適切な使い分け方をわかりやすく解説します。

クッキーとは?

クッキー(Cookie) は、ユーザーのブラウザに小さなデータを保存する仕組みです。

クッキーに保存した情報は、ユーザーが同じサイトを訪れる際に自動的にサーバーへ送信されます。

クッキーの特徴

  • 保存場所:ユーザーのブラウザ(PCやスマホなどの端末側)
  • 有効期限を設定できる
  • データ容量は4KB程度が一般的な上限
  • クライアント側でデータを確認・改変できる可能性があるため、重要な情報は保存しない

PHPでクッキーを設定・取得する例

// クッキーを設定
setcookie('username', 'taro', time() + 3600); // 1時間有効

// クッキーを取得
if (isset($_COOKIE['username'])) {
    echo 'こんにちは、' . htmlspecialchars($_COOKIE['username'], ENT_QUOTES, 'UTF-8') . 'さん!';
}

セッションとは?

セッション(Session) は、ユーザーごとにサーバー側で情報を管理する仕組みです。

サーバー上に情報を保持し、ユーザーのブラウザにはセッションID(識別子)だけがCookieとして保存されます。

セッションの特徴

  • 保存場所:サーバー
  • データ容量に大きな制限はない(サーバーのリソースに依存)
  • サーバー側管理なので、改ざんされにくく安全性が高い
  • ブラウザを閉じるか、セッションの有効期限が切れるとデータは破棄される

PHPでセッションを利用する例

session_start(); // セッション開始

// セッションにデータを保存
$_SESSION['username'] = 'taro';

// セッションからデータを取得
if (isset($_SESSION['username'])) {
    echo 'こんにちは、' . htmlspecialchars($_SESSION['username'], ENT_QUOTES, 'UTF-8') . 'さん!';
}

セッションとクッキーの違い

項目クッキーセッション
保存場所ユーザーのブラウザサーバー
保存容量4KB程度までサーバーの容量次第で柔軟に管理可
安全性改ざんされるリスクあり改ざんされにくく安全性が高い
有効期限自由に設定可能ブラウザを閉じる、またはサーバー設定で管理

使い分けのポイント

  • 簡単な情報や利便性の向上(前回入力したフォーム情報など)→ クッキー
  • ログイン状態の保持など重要なデータ → セッション

例えば、ユーザーが「次回から自動ログイン」にチェックを入れた場合、クッキーを使ってIDを保存し、パスワード認証は毎回サーバー側で行うなど、併用するケースも多いです。

以下は、記事に追記できる「クッキーとセッションの詳細な設定方法」の解説です。用途に合わせて設定できる具体的なパラメータやおすすめ設定例を含めました。

クッキーの詳細設定

setcookie() は第3引数以降を使うことで、より細かくクッキーを制御できます。

setcookie(
    'username',      // クッキー名
    'taro',          // 値
    time() + 3600,   // 有効期限(UNIXタイムスタンプ)
    '/',             // パス(/はサイト全体で有効)
    'example.com',   // ドメイン
    true,            // HTTPS接続のみ送信する場合true
    true             // JavaScriptからアクセス不可にする場合true(HttpOnly)
);

よく使うオプション

  • パス:どのURLパスでクッキーを有効にするか指定。'/' でサイト全体に適用。
  • ドメイン:サブドメイン間で共有したい場合に指定(例:.example.com)。
  • secure:HTTPS通信時のみクッキーを送信したい場合に true を指定。
  • HttpOnly:JavaScript経由でのクッキーアクセスを禁止することでXSS攻撃を軽減。

セッションの詳細設定

PHPのセッションは php.ini やスクリプト内の ini_set() で様々な挙動をカスタマイズできます。代表的なものは以下の通りです。

セッションの有効期限

セッションが破棄されるまでの最大時間を設定します。

// セッションデータの有効期限を30分に設定(秒単位)
ini_set('session.gc_maxlifetime', 1800);

セッションIDの保存方法

デフォルトではクッキーでセッションIDを管理しますが、URLに付与する方法も可能です。URLへのID付与は漏洩リスクが高いため、基本的にはクッキーを使いましょう。

// セッションIDをクッキーで管理するか
ini_set('session.use_cookies', 1);

// URLでのID管理を無効化
ini_set('session.use_only_cookies', 1);

セッションIDの安全性を高める

セッションIDを再生成することで、セッション固定攻撃を防げます。ログイン完了後などに呼び出すと効果的です。

session_regenerate_id(true);

セッションの保存場所変更

セッションデータはサーバー上の一時ディレクトリに保存されます。必要に応じて保存先を変更できます。

// セッションデータの保存ディレクトリを変更
session_save_path('/path/to/sessions');

クッキーの SameSite 属性

クロスサイトリクエストフォージェリ(CSRF)対策として SameSite 属性を設定することも重要です。PHP 7.3以降では次のように配列形式で指定できます。

setcookie('username', 'taro', [
    'expires' => time() + 3600,
    'path' => '/',
    'domain' => 'example.com',
    'secure' => true,
    'httponly' => true,
    'samesite' => 'Strict', // LaxやNoneも選択可能
]);

セキュリティ上の注意

  • クッキーにパスワードや個人情報を直接保存するのは避けましょう。
  • セッションIDの漏洩を防ぐため、HTTPSを利用する、必要に応じてセッション固定攻撃対策を実装しましょう。

まとめ

クッキーは端末に保存、セッションはサーバーに保存と覚え、用途に合わせて使い分けるのがポイントです。ユーザーの利便性とセキュリティを両立するために、クッキーとセッションを正しく活用しましょう。

公式リファレンス