導入
Web開発において、ユーザーの識別やセッション管理に欠かせない「Cookie」。PHPでは標準でサポートされていますが、実装のタイミングを誤ると「Headers already sent」というエラーに遭遇し、頭を抱えるエンジニアは少なくありません。本記事では、PHPにおけるCookieの正しい扱い方と、実務でトラブルを避けるための実装ポイントを解説します。
基礎知識
Cookieとは、サーバーがクライアント(ブラウザ)に保存させる小さなデータです。PHPでは setcookie() 関数を使用します。重要な点は、CookieがHTTPレスポンスヘッダーの一部として送信されることです。HTTPの仕様上、ヘッダー情報はボディ(HTMLなどのコンテンツ)より先に送出される必要があるため、一度でも画面に文字を出力した後に setcookie() を呼び出すとエラーになります。また、クライアントから送られてきたCookieは、PHPのスーパーグローバル変数 $_COOKIE を通じて簡単に参照可能です。
実装/解決策
Cookieを安全に設定するためには、以下の2点を徹底してください。
1. 出力前に呼び出す: HTMLタグや空白を含め、一切の出力をする前に setcookie() を実行する。
2. 出力バッファリングの活用: どうしても処理の途中でヘッダーを送る必要がある場合は、ob_start() を使用して出力を一時的にバッファへ溜め、ヘッダー送信後にフラッシュさせる手法が有効です。
サンプルプログラム
以下のコードは、実務でよくある「ユーザーの閲覧履歴をCookieに保存する」例です。
応用・注意点
実務でCookieを扱う際は、以下の点に注意してください。
セキュリティ対策の徹底
Cookieには機密情報を含めないのが鉄則です。また、XSS(クロスサイトスクリプティング)攻撃を防ぐため、必ず httponly 属性を有効にしてください。
例: setcookie(‘key’, ‘value’, [‘httponly’ => true, ‘secure’ => true]);
※PHP 7.3以降では、第3引数以降にオプション配列を渡す形式が推奨されています。
配列形式のCookie
複数の値をひとつのCookie名で管理したい場合、名前の末尾に [] を付与することで、PHP側で自動的に配列として解釈してくれます。
例: setcookie(“items[]”, “apple”); setcookie(“items[]”, “banana”);
これにより、$_COOKIE[‘items’] は配列として取得可能です。
これらの知識を押さえておくことで、Cookie関連のトラブルを未然に防ぎ、堅牢なバックエンド処理を実現しましょう。