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を利用する、必要に応じてセッション固定攻撃対策を実装しましょう。
まとめ
クッキーは端末に保存、セッションはサーバーに保存と覚え、用途に合わせて使い分けるのがポイントです。ユーザーの利便性とセキュリティを両立するために、クッキーとセッションを正しく活用しましょう。