1. Cookie(クッキー)とは? Webサイトにおける基本的な役割
Cookie(クッキー)は、Webサイトの訪問者に関する情報を一時的に保存するために、ユーザーのWebブラウザ(ChromeやSafariなど)に保存される小さなテキストデータのことです。
このデータには、ユーザーがサイトを最後に訪れた日時や、ログイン状態、カートに入れた商品、サイト表示の好みなどの情報が含まれます。
Cookieの最も基本的な役割は、ユーザーの識別です。Webサイトは、このCookieに保存された情報を読み取ることで、「以前このサイトを訪れたことがある人だ」「この人はログイン状態だ」と認識することができます。これにより、以下のような便利な機能が実現されています。
- ログイン状態の維持: 一度ログインすれば、ブラウザを閉じても、再度アクセスしたときにログインし直す手間が省けます。
- ショッピングカート: カートに商品を入れた状態で他のページに移動したり、サイトを離れたりしても、後で戻ってきたときに商品が保持されています。
- サイトの表示設定: 言語設定やテーマ(ダークモードなど)といった、ユーザーごとの設定を記憶できます。
Cookieは、サイトを快適に利用するために不可欠な技術であり、Web開発の基礎として理解しておくべき重要な要素です。
2. PHPにおけるCookieの仕組み:クライアントとサーバー間のデータのやり取り
PHPを使ってWeb開発を行う際、CookieはWebサーバーとクライアント(ユーザーのWebブラウザ)の間でやり取りされます。この仕組みを理解することが、PHPでCookieを扱うための第一歩です。
- クライアント:Webサイトを閲覧しているユーザーのWebブラウザ(PCやスマートフォンのブラウザ)。
- サーバー:WebサイトのデータやPHPプログラムが動作している場所(Webサーバー)。
Cookieのデータの流れ
【サーバーからクライアントへ】Cookieの生成と送信(設定)
- ユーザーがWebサイトにアクセスし、PHPプログラムが動作します。
- PHPは、ユーザーのブラウザに保存したい情報(例:user_id=123)を含む特別なヘッダー(HTTPレスポンスヘッダーのSet-Cookie)を生成します。
- サーバーはこのヘッダーをブラウザに送り返します。
- ブラウザはそれを受け取り、指定された情報(Cookie)をローカルに保存します。
【クライアントからサーバーへ】Cookieの保持と再送信(利用)
- ユーザーが次に同じサイトの別のページにアクセスしたり、リロードしたりします。
- ブラウザは、保存されているそのサイトのCookieを自動的にリクエスト(HTTPリクエストヘッダーのCookie)に含めてサーバーへ送信します。
- サーバー側のPHPは、送信されたCookieのデータを受け取り、ユーザーを識別したり、必要な処理を実行したりします。
このように、Cookieはサーバーが設定し、ブラウザが保持し、アクセスごとにブラウザがサーバーに送り返すことで、状態を持たないHTTP通信に「状態」を持たせる役割を果たしています。
3. Cookieを設定する:setcookie()関数の基本的な使い方
PHPで新しいCookieをユーザーのブラウザに設定するには、組み込み関数である setcookie() を使用します。
この関数は、前述の「サーバーからクライアントへ」の段階で、ブラウザに「この情報を保存してください」と指示するためのHTTPヘッダー(Set-Cookie)を生成します。
setcookie()関数の基本構文と必須引数
setcookie() 関数は、設定したい情報に応じて様々な引数を持ちますが、最も基本的な使い方で重要なのは以下の2つです。
setcookie(名前, 値);
| 引数の位置 | 名称 | 説明 |
|---|---|---|
| 1 | name(名前) | Cookieを識別するための名前(必須) |
| 2 | value(値) | Cookieに保存したいデータ(必須) |
実践的な使い方:有効期限の設定
Cookieを設定する際、通常は有効期限(expire)を設定します。有効期限を過ぎると、ブラウザは自動的にそのCookieを削除します。
有効期限はUNIXタイムスタンプ(1970年1月1日 00:00:00 UTCからの経過秒数)で指定します。time() 関数で現在のタイムスタンプを取得し、それに秒数を足して未来の時間を指定するのが一般的です。
【コード例】Cookieを1時間有効で設定する
<?php
// Cookieの名前
$cookie_name = "user_preference";
// Cookieに保存する値
$cookie_value = "dark_mode_on";
// 有効期限: 現在時刻 (time()) + 3600秒 (1時間)
$expire_time = time() + (60 * 60);
// setcookie関数でCookieを設定
setcookie($cookie_name, $cookie_value, $expire_time);
// ※注意:setcookie()は、HTMLがブラウザに送信される前に実行する必要があります。
// これより前にechoやprint_rなどの出力があるとエラーになる可能性があります。
?>
<!DOCTYPE html>
<html>
<head>
<title>Cookie設定</title>
</head>
<body>
<?php
if (isset($_COOKIE[$cookie_name])) {
echo "<p>Cookie '{$cookie_name}' が設定されました。</p>";
}
?>
</body>
</html>
ポイント: setcookie() は、ページの先頭で、いかなるHTML出力よりも前に実行しなければならないという厳格なルールがあります。これは、Cookieを運ぶためのHTTPヘッダーが、HTML本文の前に送信されるためです。
4. Cookieの取得と利用方法:保存されたデータを読み込む
ユーザーのブラウザに保存されたCookieのデータは、PHPプログラム内で $_COOKIE というスーパーグローバル変数(PHPのどこからでもアクセスできる特殊な変数)を使って簡単に読み取ることができます。
$_COOKIE変数の構造
$_COOKIE は連想配列(キーと値のペアでデータを保持する配列)の形式を取っています。配列の「キー」がCookieの名前、「値」がCookieに保存された値に対応します。
| Cookie名(Key) | Cookie値(Value) |
|---|---|
| user_preference | dark_mode_on |
| user_id | 123 |
これらは、PHPプログラム内で以下のようにアクセスできます。
// 例:$_COOKIE['Cookie名'] で値を取得
$preference = $_COOKIE['user_preference']; // 'dark_mode_on' が取得されます
$user_id = $_COOKIE['user_id']; // '123' が取得されます
実践的な使い方:データが存在するかどうかの確認
Cookieはユーザーがブラウザで削除したり、有効期限切れになったりすることがあるため、使用する前に必ずそのCookieが存在するかどうかを確認する必要があります。
isset() 関数(変数がセットされているかを確認する関数)を使って確認するのが、Web開発での鉄則です。
【コード例】Cookieの有無を確認して利用する
<?php
// 読み取りたいCookieの名前
$cookie_name = "last_visit_time";
// isset()でCookieが存在するか確認
if (isset($_COOKIE[$cookie_name])) {
// Cookieが存在する場合、値を取得して利用
$last_time = $_COOKIE[$cookie_name];
echo "<p>前回のご訪問日時: " . htmlspecialchars($last_time) . "</p>";
// 現在の日時でCookieを更新する処理などを続けて行う
// setcookie($cookie_name, date('Y-m-d H:i:s'), time() + (60 * 60 * 24 * 30));
} else {
// Cookieが存在しない(初回訪問など)場合
echo "<p>初めまして!ご訪問ありがとうございます。</p>";
// 初回訪問用のCookieを設定
// setcookie($cookie_name, date('Y-m-d H:i:s'), time() + (60 * 60 * 24 * 30));
}
?>
ポイント: 取得したCookieの値は、HTMLに出力する前に htmlspecialchars() などでエスケープ処理を行うことで、セキュリティリスク(XSS攻撃)を軽減できます。
5. Cookieを削除する方法とその手順
Cookieの役割が終わったとき(例:ユーザーがログアウトしたとき)や、設定を変更したいときには、そのCookieを削除する必要があります。
Cookieを削除するための専用の関数はPHPにはありません。代わりに、setcookie() 関数を使い、有効期限を過去の時刻に設定することで、ブラウザに「このCookieはもう期限切れです」と認識させて削除を促します。
Cookie削除の具体的な手順
Cookieを削除する手順は非常にシンプルで、以下の2つの条件を満たすように setcookie() を呼び出します。
- Cookieの名前と値: 削除したいCookieの名前を1番目の引数に指定します。値(2番目の引数)は、空の文字列(
"")で問題ありません。 - 有効期限: 現在の時刻よりも過去の時刻(例:
time() - 3600など)を3番目の引数に設定します。
【コード例】Cookieを削除する
<?php
// 削除したいCookieの名前
$cookie_name = "user_preference";
// 1. setcookie()の値を空にする
// 2. 有効期限を過去(例:1時間前)に設定する
setcookie($cookie_name, "", time() - 3600);
// Cookieが削除されたか確認
if (!isset($_COOKIE[$cookie_name])) {
echo "<p>Cookie '{$cookie_name}' は削除されました。</p>";
}
?>
注意点: Cookieを削除する際も、設定時と同様に setcookie() 関数はいかなる出力よりも前に実行する必要があります。
また、Cookieのパスやドメインなど、設定時とまったく同じ引数(名前と期限を除く)を指定しないと削除が正しく行われない場合があるため注意が必要です。
6. Cookieを利用する上でのセキュリティと注意点
Cookieは非常に便利ですが、ユーザーの個人情報やセッション(ログイン)情報を扱うため、セキュリティに十分配慮する必要があります。WEB開発者が特に注意すべき主要なポイントを解説します。
盗聴や改ざんを防ぐための「Secure」属性
Cookieには、そのCookieを扱う上での制約を設定する属性(オプションの引数)があります。その中でも、Secure 属性は重要です。
- Secure属性: この属性を設定すると、CookieはHTTPS接続(暗号化された安全な接続)でのみ送信されるようになります。
// Secure属性の設定例
// 第6引数を true に設定する
setcookie("session_id", $id_value, $expire, "/", "example.com", true, true);
重要な情報(ログイン情報など)を扱うCookieには、必ずSecure属性を設定し、サイト全体をHTTPSで運用するようにしましょう。
XSS対策のための「HttpOnly」属性
HttpOnly 属性は、XSS(クロスサイトスクリプティング)攻撃によるCookieの盗難を防ぐための最も効果的な手段の一つです。
- HttpOnly属性: この属性を設定すると、JavaScriptから
document.cookieなどの方法でCookieにアクセスすることができなくなります。
悪意のあるスクリプトが埋め込まれたとしても、JavaScriptからCookieを読み取れないため、セッションIDなどが外部に漏れるリスクを大幅に下げることができます。
// HttpOnly属性の設定例
// 第7引数を true に設定する(Secure属性の後の引数)
setcookie("session_id", $id_value, $expire, "/", "example.com", true, true);
セッションIDなど、機密性の高い情報を含むCookieには必ず HttpOnly 属性を設定しましょう。
個人情報保護とCookieポリシー
日本の法令やGDPR(EU一般データ保護規則)などの影響により、Cookieの利用に関する規制が強化されています。
- 同意の取得: サイト訪問者のトラッキングや分析に使用されるCookie(サードパーティCookieなど)を設定する前に、ユーザーから同意を得る必要があります。
- Cookieポリシーの明記: どのようなCookieを使用しているか、何のために使用しているかを明記したCookieポリシーのページを用意することが求められます。
ユーザーの信頼を得るためにも、法令を遵守したCookieの運用が現代のWeb開発の常識となっています。
7. PHPのセッションとCookie:違いと使い分けのポイント
PHPのセッション(Session)とCookieは、どちらもWebサイトでユーザーの状態を維持するために使われますが、データの保存場所や用途に大きな違いがあります。これらを適切に使い分けることが、よりセキュアで効率的なWebアプリケーション開発につながります。
セッションとCookieの決定的な違い
| 項目 | Cookie(クッキー) | セッション(Session) |
|---|---|---|
| データの保存場所 | クライアント側(ユーザーのブラウザ) | サーバー側(Webサーバー) |
| 保存できるデータ | ログインID、設定、トラッキング情報など(少量) | ログイン状態、ユーザー情報、アクセス権限など(容量の制限はほぼない) |
| セキュリティ | データがクライアントに見えるため、機密情報の保存は不向き | データがサーバーにあるため、機密情報の保存に適している |
| 有効期限 | setcookie()で設定した期限(数日〜数年) | 基本的にブラウザを閉じるまで(セッションCookie) |
セッションの仕組みとCookieの役割
セッションは、基本的に以下の仕組みで動作します。
- ユーザーがサイトにアクセスすると、PHPはサーバー内にユーザーごとのセッションデータ(例:ログイン済み)を生成し、一意のセッションIDを発行します。
- このセッションIDだけをCookieとしてユーザーのブラウザに保存します。(これは通常、PHPが自動で行います)
- ユーザーが他のページにアクセスする際、ブラウザはセッションIDのCookieをサーバーに送り返します。
- サーバーは送られてきたセッションIDに対応するサーバー内のデータを読み込み、ユーザーの状態を識別します。
つまり、セッションにおけるCookieの役割は、「サーバーに保存されている本物のデータにアクセスするための鍵(セッションID)」を運ぶことです。
使い分けのポイント
| 用途 | 推奨される技術 | 理由 |
|---|---|---|
| ログイン状態の維持 | セッション | ユーザーの機密情報(ログインの真偽、権限)はサーバー側で安全に管理すべきだから。 |
| カートの中身 | セッション | 容量が大きくなる可能性があるため、サーバー側で管理するのが一般的。 |
| ユーザーの表示設定 | Cookie | 「ダークモード」や「言語設定」など、サーバー側で管理するほどではない、比較的重要度の低い情報はCookieで。 |
| アクセス解析、トラッキング | Cookie | サイトを横断して識別するために使われるため、Cookieが必須。 |
結論として、セッションID以外の機密情報や重要なデータは、セキュリティ上の観点からCookieに直接保存するのではなく、PHPのセッション機能を利用してサーバー側で管理することが推奨されます。