セキュリティの専門家の方から
■セッション管理に使用するCookie(クッキー)にセキュア属性(secure属性)を付けるようにしろ!!
■セッション管理に使用するCookie(クッキー)のパスはちゃんと設定しろ!!
という指摘を受けました。

secure属性を付与することで、HTTPS通信時にのみCookieを送信できるようになります。

そこで、今回は、PHP初心者の方に向けて「Cookieとは何か」「セキュア属性の役割」「PHPでの設定方法」をわかりやすく解説します。

Cookieとセキュア属性とは?

Cookieとは?

Cookieは、Webサイトがユーザーのブラウザに保存する小さなデータです。
例えば、次のような用途に使われます。

  • ログイン情報の保持(次回アクセス時に自動ログイン)
  • ショッピングカートの中身の保存
  • 言語設定やテーマ設定などユーザーの好みを記録

Cookieの仕様については、MDN Web Docs – Set-Cookieを参考にすると、より理解が深まります。

セキュア属性とは?

セキュア属性(secure属性)を付けると、CookieがHTTPS通信時にのみブラウザから送信されるようになります。
これにより、暗号化されていないHTTP通信経路でCookieが盗まれるリスクを防げます。

なお、Cookieのセキュリティを高めるには以下の属性と組み合わせるのがおすすめです。

  • HttpOnly属性:JavaScriptからCookieを読み取れなくする
  • SameSite属性:クロスサイトリクエストフォージェリ(CSRF)対策

セキュリティのベストプラクティスは、OWASP – Secure Cookie Attributesに詳しくまとまっています。
合わせてお読みください。

PHPでCookieを設定する基本方法

PHPでは、setcookie()関数を使ってCookieを送信します。

<?php
// シンプルなCookieの設定
setcookie("user", "taro", time() + 3600); //有効期限は1時間
?>

この場合、CookieはHTTPでもHTTPSでも送信されてしまいます。
PHPでCookieを安全に操作するためには、「セキュア属性」を追加する必要があります。

公式の書き方についてはPHP公式マニュアル – setcookieを参照してください。

セキュア属性を付与する場合のPHPコードについては、次のセクションを参考にしてください。

セキュア属性を付与する方法

方法1:旧来の書き方(PHP7.2以前)

PHP7.2では、次のような書き方をします。

<?php
//セキュア属性を有効にしたCookie
setcookie("user", "taro", time() + 3600, "/", "", true);
?>

最後の引数trueが「セキュア属性」を意味します。
ただし、可読性が低いため現在では推奨されません。

方法2:推奨される書き方(PHP7.3以降)

PHP7.3から、setcookie()関数では配列オプションを設定できるようになりました。

<?php
//推奨される方法(PHP7.3以降)
setcookie("user", "taro", [
"expires" => time() + 3600, //有効期限:1時間
"path" => "/", //有効パス
"secure" => true, //HTTPS通信のみ送信
"httponly" => true, //JavaScriptからのアクセス不可
"samesite" => "Lax" //CSRF対策
]);
?>

この方法ならsecure属性・httponly属性・samesite属性をまとめて指定できるので、セキュリティを強化しやすくなります。

セキュア属性を付けるときの注意点

Cookieにセキュア属性を付与する場合には、

  1. HTTPS環境が必須
    セキュア属性はHTTPSでないと効果がありません。開発中にローカル環境でテストするときは、セキュア属性を無効にして動作確認する場合もあります。
  2. セキュア属性だけでは不十分
    JavaScriptからのアクセスを防ぐにはHttpOnly、CSRF対策にはSameSiteもあわせて設定しましょう。
  3. 古いブラウザやPHPバージョンに注意
    PHP7.3未満では配列オプションが使えないため、旧来の引数方式で書く必要があります。

いずれも重要な内容ですが、特に3つ目のPHPのバージョンについては注意しましょう。
今でも古いバージョンのPHPで開発されているWebサイトはたくさん残っているので、バージョンアップを検討した方がいいです。

また、古いブラウザをお使いの方も、最新のバージョンを維持することを検討した方がいいです。

まとめ

今回は、PHPでブラウザのCookie(クッキー)を安全に操作するための方法を紹介しました。

  • Cookieは便利だが、不正利用のリスクがある
  • セキュア属性(secure属性)を付けるとHTTPS通信時のみ送信されるので安全性が高まる
  • PHP7.3以降ならsetcookie()の配列オプションで簡単に指定可能
  • secureに加えてHttpOnlySameSiteを設定するとさらに安心

Web開発においてCookieの扱いはセキュリティの基本です。ぜひ今回の方法を実践して、安全なWebサイト運営に役立ててください。

参考リンク