PHP 入門

PHP $_COOKIE

クッキー(Cookie)は、サーバーから Web ブラウザに送信される小さなデータです。ブラウザはこれをローカルに保存し、その後に同じドメインに対して行われるすべてのリクエストにおいて、自動的にこのデータをヘッダーに含めてサーバーへ送り戻します。PHP では、$_COOKIE スーパーグローバル・アレイ(Superglobal Array)を通じてこれらの値を読み取るインターフェースが提供されており、言語設定、ショッピングカート ID、あるいは「ログイン状態を保持する」ためのトークンなど、複数のページ遷移にわたってユーザー情報を永続化させることができます。

1. setcookie() を使用したクッキーの作成

$_SESSION$_COOKIE から値を読み取る前に、まずはクッキーを作成する必要があります。ブラウザにデータを保存させるには setcookie() 関数を使用します。クッキーは HTTP ヘッダーの一部として送信されるため、setcookie() 関数はブラウザに何らかのアウトプット(HTML タグ、あるいはスペース一つでも)を送信する前に呼び出す必要があります。

<?php
// 構文:setcookie(名称, 値, 有効期限またはオプションのアレイ, パス, ドメイン, HTTPS限定か, HTTPのみアクセス可能か)

// 有効期限が 30 日間のシンプルな永続クッキーを作成
$cookieName = "user_theme";
$cookieValue = "dark-mode"; // ダークモード
$expiration = time() + (86400 * 30); // 86400 秒 = 1 日

setcookie($cookieName, $cookieValue, $expiration, "/");
?>

2. $_COOKIE からのデータ読み取り

ブラウザが一度クッキーを保存すると、それ以降そのドメインに対するすべてのリクエストの HTTP ヘッダーに自動的にクッキーが含まれるようになります。PHP はこれらの値を自動的に抽出し、$_COOKIE スーパーグローバル・アレイに格納します。これらへのアクセスは、他のアソシエイティブ・アレイ(連想配列)と同様に簡単です。

<?php
// isset() を使用してクッキーが存在するかチェック
if (isset($_COOKIE['user_theme'])) {
    $theme = $_COOKIE['user_theme'];
    // 出力時は必ず htmlspecialchars を使用して XSS 攻撃を防止
    echo "現在のテーマ設定: " . htmlspecialchars($theme);
} else {
    echo "テーマ設定が保存されていません。デフォルトテーマを使用します。";
}
?>

3. クッキーのセキュリティに関する注意事項

クッキーは完全にクライアントサイド(ブラウザ)に保存されるため、本質的に不安全なものです。パスワード、クレジットカード番号、あるいは生(プレーンテキスト)のユーザー ID といったセンシティブデータ(Sensitive Data)を直接クッキーに保存してはいけません。クッキーをセットする際は、Web の脆弱性を防ぐために httponly および secure フラグを常に使用することを強く推奨します。

  • httponly (HTTP のみ): true に設定すると、そのクッキーは JavaScript からアクセスできなくなります。これにより、クロスサイトスクリプティング(XSS)攻撃によるセッションクッキーの盗難を効果的に防ぐことができます。
  • secure (安全な接続): true に設定すると、そのクッキーは HTTPS でエンクリプト(暗号化)された接続を介してのみ送信され、転送中のデータの安全性が確保されます。
<?php
// PHP 7.3+ でサポートされているオプションアレイ構文を使用した、高セキュリティなクッキーの設定
setcookie("session_token", "abc123xyz", [
    'expires' => time() + 3600,    // 1 時間後に期限切れ
    'path' => '/',                 // サイト全体で有効
    'domain' => 'example.com',     // あなたのドメイン
    'secure' => true,              // HTTPS 経由でのみ送信
    'httponly' => true,            // JavaScript からのアクセスを禁止
    'samesite' => 'Strict'         // CSRF(クロスサイトリクエストフォージェリ)攻撃を緩和
]);
?>

4. クッキーのライフサイクル

サーバーがクライアントとどのように通信し、クッキーベースの状態を永続化させるかの流れを以下に示します。

  1. HTTP リクエスト: ユーザー(ブラウザ)が PHP サーバーにリクエストを送信します。
  2. HTTP レスポンス(Set-Cookie 含む): サーバーがロジックを処理し、レスポンスヘッダーに Set-Cookie 指令を含めてブラウザに返します。
  3. ローカルストレージ: ブラウザが指令を受け取り、ユーザーのローカルディスクやメモリにクッキーを保存します。
  4. 後続の HTTP リクエスト: ブラウザが再度そのサイトにリクエストを送る際、自動的にリクエストヘッダーに Cookie データを含めます。
  5. PHP 読み取り: サーバーサイドの PHP スクリプトは $_COOKIE['key'] を通じてそのデータの読み取りに成功します。

5. クッキーの削除

クッキーを削除するには、既存のクッキーと同じ名称で setcookie() 関数を呼び出し、その有効期限を過去の時点に設定します。これにより、ブラウザはそのクッキーを即座に破棄するように強制されます。

<?php
// 有効期限を 1 時間前に設定することで、クッキーを即座に期限切れにし削除する
setcookie("user_theme", "", time() - 3600, "/");
?>