【PHP8.x】setcookie関数の使い方

作成日: 更新日:

setcookie関数は、HTTP Cookieを設定するために使用される関数です。クライアントのブラウザにCookieを送信し、そのCookieはブラウザによって保存され、以降のリクエストでサーバーに自動的に送信されます。

この関数を使用することで、ユーザーの認証情報、設定、トラッキング情報などをクライアント側に保存し、サーバー側で利用することができます。Cookieは、Webアプリケーションにおけるセッション管理やユーザーエクスペリエンスの向上に不可欠な要素です。

setcookie関数は、最低でもCookieの名前を指定する必要があります。その他の引数として、Cookieの値、有効期限、パス、ドメイン、セキュリティ設定(HTTPSのみで送信するかどうか)、HTTPOnly属性(スクリプトからのアクセスを制限するかどうか)などを指定できます。

有効期限を指定しない場合、CookieはセッションCookieとなり、ブラウザを閉じると削除されます。有効期限を指定することで、Cookieを永続的に保存できます。

パスを指定すると、そのパス以下のURLに対してのみCookieが送信されます。ドメインを指定すると、そのドメインおよびサブドメインに対してCookieが送信されます。

セキュリティ設定を有効にすると、HTTPS接続でのみCookieが送信されるようになります。HTTPOnly属性を有効にすると、JavaScriptなどのスクリプトからCookieにアクセスできなくなり、セキュリティリスクを軽減できます。

setcookie関数はHTTPヘッダーを送信するため、HTMLを出力する前に呼び出す必要があります。すでにHTMLが出力されている場合は、エラーが発生します。

基本的な使い方

構文(syntax)

<?php

setcookie(
    "userName",
    "guest",
    [
        'expires' => time() + 3600,
        'path' => '/',
        'domain' => '',
        'secure' => true,
        'httponly' => true,
        'samesite' => 'Lax'
    ]
);

?>

引数(parameters)

string $name, string $value = "", int|array $expires_or_options = 0, string $path = "", string $domain = "", bool $secure = false, bool $httponly = false

  • string $name: 設定するクッキーの名前
  • string $value = "": クッキーに保存する値。デフォルトは空文字列
  • int|array $expires_or_options = 0: クッキーの有効期限(UNIXタイムスタンプ)またはオプションの配列。デフォルトはセッション終了時
  • string $path = "": クッキーが有効なサーバー上のパス。デフォルトは現在のディレクトリ
  • string $domain = "": クッキーが有効なドメイン。デフォルトは現在のホスト
  • bool $secure = false: trueに設定すると、HTTPS接続でのみクッキーが送信される
  • bool $httponly = false: trueに設定すると、HTTPプロトコル経由でのみクッキーがアクセス可能になり、JavaScriptなどからのアクセスを防ぐ

戻り値(return)

bool

setcookie 関数は、HTTP ヘッダーとしてクッキーを設定できる関数です。クッキーの設定に成功した場合は true を、失敗した場合は false を返します。

サンプルコード

PHPでSameSite属性付きクッキーを設定する

<?php

/**
 * SameSite属性を含むHTTPクッキーを設定する関数。
 *
 * システムエンジニアを目指す初心者向けに、PHPのsetcookie関数を使用して
 * SameSite属性を含むセキュアなクッキーを設定する方法を示します。
 * SameSite属性は、クロスサイトリクエストフォージェリ (CSRF) 攻撃からの保護に役立ちます。
 *
 * @param string $name クッキーの名前
 * @param string $value クッキーの値
 * @return bool クッキーの設定が成功した場合はtrue、それ以外はfalse
 */
function setSecureSameSiteCookie(string $name, string $value): bool
{
    // クッキーの有効期限を設定 (例: 現在時刻から1時間後)
    $expire = time() + (60 * 60);

    // PHP 7.3 以降では、setcookie関数に連想配列でオプションを指定できます。
    $options = [
        'expires'  => $expire,           // クッキーの有効期限 (Unixタイムスタンプ)
        'path'     => '/',               // クッキーが有効なパス (通常はサイト全体を示す '/')
        'domain'   => '',                // クッキーが有効なドメイン (空にすると現在のドメインに自動設定)
        'secure'   => true,              // HTTPS接続時のみクッキーを送信する (本番環境では 'true' を強く推奨)
        'httponly' => true,              // JavaScriptからクッキーにアクセスできないようにする (XSS対策)
        'samesite' => 'Lax',             // SameSite属性を設定 ('Lax', 'Strict', 'None' のいずれか)
                                         // 'Lax': ユーザーがナビゲートする際のいくつかのクロスサイトリクエストでクッキーを送信
                                         // 'Strict': 同一サイトリクエスト時のみクッキーを送信
                                         // 'None': クロスサイトリクエストでもクッキーを送信するが、'secure'がtrueであること必須
    ];

    // setcookie関数でクッキーを設定
    // setcookieはHTTPヘッダーを送信するため、この関数が呼び出される前に
    // いかなる出力もあってはなりません。
    $cookieSet = setcookie($name, $value, $options);

    // クッキー設定の結果を出力(デバッグ用)
    if ($cookieSet) {
        echo "クッキー '{$name}' が正常に設定されました。<br>";
        echo "値: '{$value}'<br>";
        echo "SameSite属性: '{$options['samesite']}'<br>";
        echo "Secure: " . ($options['secure'] ? 'true' : 'false') . "<br>";
    } else {
        // 通常、このエラーはsetcookieがHTTPヘッダー送信後に呼び出された場合に発生します。
        echo "エラー: クッキー '{$name}' の設定に失敗しました。ヘッダーが既に送信されている可能性があります。<br>";
    }

    return $cookieSet;
}

// === サンプルコードの実行 ===
// setcookie関数はHTTPヘッダーを送信するため、スクリプトの実行開始時に呼び出す必要があります。
// 既に何らかの出力が行われている場合、クッキーは設定されません。
if (headers_sent($file, $line)) {
    echo "警告: ヘッダーが既に {$file}{$line} 行目で送信されているため、クッキーを設定できませんでした。<br>";
} else {
    // 例1: ユーザーセッションIDをSameSite=Laxで設定
    setSecureSameSiteCookie('user_session_id', 'a1b2c3d4e5f6');

    echo "<br>";

    // 例2: 言語設定をSameSite=Laxで設定
    setSecureSameSiteCookie('preferred_language', 'en');
}

// 注意: 設定されたクッキーは、次のリクエストから $_COOKIE スーパーグローバル変数でアクセス可能になります。
// 例えば、このページをブラウザでリロードすると、$_COOKIE['user_session_id'] などが利用可能になります。
// var_dump($_COOKIE); // この行は、現在のリクエストで受信したクッキーを表示します。
                    // 設定したクッキーがすぐには表示されないことに注意してください。
?>

PHPのsetcookie関数は、ウェブブラウザに情報を一時的に保存する「クッキー」を設定するために使用されます。この関数は、ユーザーの状態を維持したり、設定を記憶したりする際に非常に重要です。

setcookie関数は、設定したいクッキーの名前と値を指定するのが基本です。PHP 7.3以降では、セキュリティや動作に関する詳細なオプションを連想配列として第3引数に渡すことができます。例えば、expiresで有効期限、pathでクッキーが有効なパス、domainで有効なドメインを指定します。

特に重要なオプションとして、securetrueに設定するとHTTPS接続時のみクッキーが送信され、httponlytrueに設定するとJavaScriptからのアクセスが制限され、クロスサイトスクリプティング(XSS)攻撃の対策となります。

さらに、クロスサイトリクエストフォージェリ(CSRF)攻撃から保護するためのsamesite属性も設定できます。samesiteにはLaxStrictNoneのいずれかを指定し、クッキーを送信する条件を制御します。Laxは一般的な利用で推奨され、ユーザーがサイト間を移動する際の安全性を保ちます。Strictは同一サイトからのリクエストのみを許可し、Noneはクロスサイトリクエストでも許可しますが、secure属性が必須です。

この関数はクッキーの設定が成功した場合はtrue、失敗した場合はfalseを論理値として返します。setcookieはHTTPヘッダーを送信する性質上、この関数が呼び出される前にいかなる出力も行ってはならない点に注意が必要です。設定されたクッキーは、次のHTTPリクエストから$_COOKIEスーパーグローバル変数を通じてアクセスできるようになります。

setcookie関数は、HTML出力やechoなどの何らかの出力よりも前に必ず呼び出す必要があります。既にヘッダーが送信されているとクッキーは設定されず、エラーとなります。PHP 7.3以降では、expirespathsamesiteなどのクッキーオプションを連想配列でまとめて指定できます。特にセキュリティ対策として、samesite属性はクロスサイトリクエストフォージェリ対策に重要で、LaxまたはStrictを推奨します。また、HTTPS環境ではsecuretrueに、JavaScriptからのアクセスを防ぐためにhttponlytrueに設定することを強く推奨します。設定したクッキーは同じリクエスト中には$_COOKIEで利用できず、次のHTTPリクエストからアクセス可能になる点にご注意ください。

PHPでクッキーに有効期限を設定する

<?php

/**
 * クッキーを設定し、有効期限を指定するサンプルコード
 *
 * このスクリプトは、ブラウザに「user_preference」という名前のクッキーを設定します。
 * クッキーの値は「dark_mode」で、有効期限は現在の時刻から1時間後です。
 *
 * setcookie()関数は、HTTPレスポンスヘッダーの一部としてクッキー情報を送信します。
 * このため、setcookie()関数は、いかなるHTML出力やecho文よりも前に呼び出す必要があります。
 */

// クッキーの名前と値を定義
$cookie_name = "user_preference";
$cookie_value = "dark_mode";

// 有効期限をUNIXタイムスタンプで計算
// time() は現在のUNIXタイムスタンプを返します。
// 60秒 * 60分 = 3600秒 (1時間)
$expiration_time = time() + (60 * 60); // 現在時刻から1時間後に有効期限切れ

// setcookie()関数を使ってクッキーを設定
// 引数: 名前, 値, 有効期限, パス, ドメイン, セキュア, HTTP Only
$cookie_set_success = setcookie(
    $cookie_name,       // クッキーの名前
    $cookie_value,      // クッキーの値
    $expiration_time,   // 有効期限 (UNIXタイムスタンプ)。この例では1時間後。
    '/',                // クッキーが有効なサーバーパス。'/'はドメイン全体で有効。
    '',                 // クッキーが有効なドメイン。空欄は現在のドメイン。
    false,              // セキュア: trueにするとHTTPS接続でのみ送信される。初心者向けにfalse。
    true                // HTTP Only: trueにするとJavaScriptからのアクセスを禁止し、セキュリティを高める。
);

// クッキーの設定結果を表示
if ($cookie_set_success) {
    echo "<h1>クッキーの設定が成功しました!</h1>";
    echo "<p>以下のクッキーがブラウザに設定されました。</p>";
    echo "<ul>";
    echo "<li><strong>名前:</strong> '{$cookie_name}'</li>";
    echo "<li><strong>値:</strong> '{$cookie_value}'</li>";
    echo "<li><strong>有効期限:</strong> " . date('Y-m-d H:i:s', $expiration_time) . " (現在時刻から1時間後)</li>";
    echo "<li><strong>パス:</strong> /</li>";
    echo "<li><strong>HTTP Only:</strong> はい</li>";
    echo "</ul>";
    echo "<p>ブラウザの開発者ツール(F12キーで開くことが多い)の「アプリケーション」または「ストレージ」タブから、クッキーを確認できます。</p>";
    echo "<p>このページをリロードすると、ブラウザが設定されたクッキーをサーバーに送信します。</p>";
} else {
    echo "<h1>クッキーの設定に失敗しました。</h1>";
    echo "<p>原因として、すでに何らかの出力が行われている可能性があります。</p>";
}

?>

PHPのsetcookie関数は、ウェブブラウザにクッキー(Cookie)を設定するために使用されます。クッキーは、ユーザーのブラウザに少量の情報を保存し、次回アクセス時にその情報を利用できるようにする仕組みです。この関数は、HTTPレスポンスヘッダーの一部としてクッキー情報を送信するため、HTML出力やecho文など、コンテンツの出力よりも前に呼び出す必要があります。

引数$nameでクッキーの名前、$valueでその値を指定します。最も重要な機能の一つが有効期限の設定で、$expires_or_options引数にUNIXタイムスタンプ形式で指定します。サンプルコードではtime()関数で現在時刻を取得し、それに秒数を加算することで「現在時刻から1時間後」という有効期限を設定しています。これにより、指定した時間が経過するとブラウザからクッキーが自動的に削除されます。

また、$pathでクッキーが有効なパスを、$domainで有効なドメインを指定できます。$securetrueにするとHTTPS接続でのみクッキーが送信され、$httponlytrueにするとJavaScriptからのクッキーアクセスを禁止し、セキュリティを高めることができます。

setcookie関数は、クッキーの設定に成功した場合はtrueを、失敗した場合はfalseをブール値で返します。この戻り値を確認することで、クッキーが正しく設定されたかどうかの判定が可能です。このようにsetcookie関数は、ユーザーの状態を管理する上で重要な役割を果たします。

PHPのsetcookie関数を使う際、最も重要な点は、ブラウザにHTMLなどの内容を出力する前にこの関数を呼び出す必要があることです。HTTPヘッダーの一部としてクッキー情報が送信されるため、一度でもechoやHTMLが出力されるとクッキーは設定されません。有効期限は、time()関数で取得した現在時刻に秒数を加算し、UNIXタイムスタンプで指定します。例えば1時間後はtime() + 3600と計算します。セキュリティを強化するため、secureオプションをtrueにしてHTTPS接続時のみ送信したり、httponlyオプションをtrueにしてJavaScriptからのアクセスを禁止したりすることを検討してください。設定されたクッキーは、ブラウザの開発者ツールの「アプリケーション」タブなどで確認できます。関数は成功したかどうかを真偽値で返しますので、その結果を元に適切なエラーハンドリングを行うと良いでしょう。

【PHP8.x】setcookie関数の使い方 | いっしー@Webエンジニア