Caution

お使いのブラウザはJavaScriptが実行できない状態になっております。
当サイトはWebプログラミングの情報サイトの為、
JavaScriptが実行できない環境では正しいコンテンツが提供出来ません。
JavaScriptが実行可能な状態でご閲覧頂くようお願い申し上げます。

PHP辞典

  1. トップページ
  2. PHP辞典
  3. setcookie() / $_COOKIE

setcookie() / $_COOKIE対応: PHP 4(2000)

Cookieをクライアントのブラウザに送信し、次回以降のリクエストで『$_COOKIE』から値を取得します。ユーザーの設定保存や「ログイン状態を保持する」機能の実装に使用されます。

構文
// Cookieを送信します。
setcookie($name, $value, $expires_or_options, $path, $domain, $secure, $httponly);

// PHP 7.3以降では配列で指定できます。
setcookie($name, $value, $options);

// Cookieの値を取得します。
$_COOKIE['name'];
関数・変数一覧
関数 / 変数概要
setcookie($name, $value, $options)HTTPレスポンスヘッダーにCookieを含めてブラウザに送信します。HTMLを出力する前に呼び出す必要があります。
$_COOKIEクライアントから送信されたCookieの値を格納するスーパーグローバル配列です。Cookieを設定したリクエストでは値が反映されず、次のリクエストから参照できます。
オプション一覧
オプション概要
expiresCookieの有効期限をUnixタイムスタンプで指定します。『0』を指定するとブラウザを閉じるまで有効です。
pathCookieが有効なパスを指定します。『"/"』を指定するとサイト全体で利用できます。
domainCookieが有効なドメインを指定します。サブドメインでも使いたい場合は『".example.com"』のように先頭にドットを付けます。
secure『true』にするとHTTPS接続でのみCookieを送信します。
httponly『true』にするとJavaScriptからCookieにアクセスできなくなります。
samesite『"Strict"』『"Lax"』『"None"』のいずれかを指定します。CSRF対策に有効です。
サンプルコード
<?php
// Cookieを設定します。30日間有効にしています。
setcookie('username', '山田太郎', [
	'expires' => time() + 60 * 60 * 24 * 30, // 30日後に期限切れになります。
	'path' => '/',
	'secure' => true,
	'httponly' => true,
	'samesite' => 'Lax'
]);

// Cookieの値を取得します。次のリクエスト以降で参照できます。
if (isset($_COOKIE['username'])) {
	echo "こんにちは、" . htmlspecialchars($_COOKIE['username']) . "さん!";
}

// 「ログイン状態を保持する」機能の実装例です。
$remember_token = bin2hex(random_bytes(32)); // 安全なトークンを生成します。
setcookie('remember_token', $remember_token, [
	'expires' => time() + 60 * 60 * 24 * 30,
	'path' => '/',
	'secure' => true,
	'httponly' => true,
	'samesite' => 'Lax'
]);

// テーマ設定をCookieに保存する例です。
$theme = 'dark';
setcookie('theme', $theme, [
	'expires' => time() + 60 * 60 * 24 * 365, // 1年間有効です。
	'path' => '/',
	'secure' => true,
	'httponly' => false, // JavaScriptからも参照するため false にしています。
	'samesite' => 'Lax'
]);

// Cookieを削除するには有効期限を過去に設定します。
setcookie('username', '', [
	'expires' => time() - 3600, // 1時間前を指定して期限切れにします。
	'path' => '/',
	'secure' => true,
	'httponly' => true,
	'samesite' => 'Lax'
]);

// すべてのCookieを確認します。
foreach ($_COOKIE as $name => $value) {
	echo $name . ": " . htmlspecialchars($value) . "\n";
}
概要

『setcookie()』はHTTPレスポンスヘッダーを通じてブラウザにCookieを送信する関数です。HTMLを1バイトでも出力した後では『setcookie()』を呼び出せません。必ずPHPスクリプトの先頭で設定してください。

Cookieの値はクライアント側に保存されるため、ユーザーが自由に書き換えることができます。セキュリティ上重要なデータはCookieに保存せず、サーバー側の『セッション』を使用してください。Cookieに保存するのはテーマ設定や言語設定など、改ざんされても問題のないデータに限定するのが安全です。

Cookieの値を出力する際は、XSS対策として必ず『htmlspecialchars()』でエスケープしてください。『$_COOKIE』に設定された値は次のリクエスト以降で参照できるようになるため、設定した直後のリクエストでは『$_COOKIE』に値が入っていない点に注意してください。

記事の間違いや著作権の侵害等ございましたらお手数ですがまでご連絡頂ければ幸いです。