PHP の Cookie の有効期限を設定する方法(expires, max-age)
新人
「PHP の Cookie の有効期限を設定する方法を知りたいのですが、どう設定すればいいですか?」
先輩
「Cookie の有効期限を設定すると、一定時間後に自動的に削除されたり、ブラウザを閉じても保持されたりするんだ。用途に応じて設定方法が変わるよ。」
新人
「具体的にはどんな設定方法があるんですか?」
先輩
「主に expires と max-age の2つの方法があるよ。まずは Cookie の有効期限について基本から説明するね!」
1. Cookieの有効期限とは?(基本的な説明)
まずは、そもそも「Cookie の有効期限」とは何かを押さえておきましょう。PHP の Cookie の有効期限とは、その Cookie がブラウザの中にどれくらいのあいだ残り続けるか、という寿命のようなものです。
Cookie には、大きく分けて次の 2 種類があります。
- セッション Cookie:ブラウザを閉じると削除される、一時的な Cookie
- 持続的 Cookie:あらかじめ決めた有効期限まで残り続ける Cookie
セッション Cookie は、ログイン中だけ使う「仮のメモ」のようなイメージです。ブラウザを閉じたタイミングで自動的に消えるので、長く残しておく必要がない情報に向いています。
一方で、持続的 Cookie は「何日間か覚えておきたい情報」を保存するときに使われます。例えば「ログイン状態を一週間覚えておく」や「サイトの表示テーマ(ライト/ダーク)を次回アクセス時まで保持する」といったケースです。設定した有効期限を過ぎると、その Cookie はブラウザから削除されます。
PHP では、特別なことをしない場合、次のようなコードで作成される Cookie はセッション Cookie になります。
setcookie("sample", "value");
このように有効期限を指定していない Cookie は、ブラウザを閉じると自動的に消える一時的な Cookie として扱われます。
逆に、ブラウザを閉じても一定期間は Cookie を残しておきたい場合は、「いつまで残すか」という有効期限を指定して持続的 Cookie にします。PHP では setcookie() 関数を使って、有効期限を表す値を渡すことでこの寿命をコントロールできます。
具体的な指定方法としては、後のセクションで解説する expires や max-age を使って、有効期限を日付や秒数で細かく設定していきます。この章ではまず、「Cookie には期限があり、セッション Cookie と持続的 Cookie の 2 種類がある」という基本を押さえておけば十分です。
2. Cookieの有効期限を設定する理由
なぜ Cookie に有効期限を設定する必要があるのでしょうか?主な理由は以下の通りです。
- ユーザーの利便性向上: ログイン情報や設定を保持し、次回のアクセス時に自動入力を可能にする。
- セキュリティ強化: 一定時間経過後に自動的に削除し、不正利用を防ぐ。
- サーバー負荷の軽減: 不要な Cookie を削除し、不要なデータを管理しないようにする。
例えば、ログイン情報を 1 週間保持したい場合は、expires を使って 7 日間の有効期限を設定します。逆に、セキュリティを考慮して短時間で削除する場合は 1 時間や 30 分などの短い有効期限を設定することもあります。
次のセクションでは、具体的に Cookie の有効期限を設定する方法について解説します。
3. Cookieの有効期限を設定する方法(expiresの使い方)
Cookie の有効期限を設定する方法のひとつに expires があります。これは、Cookie の有効期限を「特定の日時」に設定するものです。
PHP で expires を設定するには、setcookie() 関数の第3引数に、期限を示すタイムスタンプ(Unix タイム)を指定します。
setcookie("username", "Taro", time() + 86400, "/");
上記のコードでは、「username」という Cookie を 1 日(86400秒)後に期限切れに設定しています。
また、特定の日付まで有効な Cookie を作成したい場合は、strtotime() を使うこともできます。
setcookie("session_id", "abc123", strtotime("+7 days"), "/");
このコードは、「session_id」という Cookie を 7 日後まで有効にします。
4. Cookieの有効期限を設定する方法(max-ageの使い方)
Cookie の有効期限を設定するもうひとつの方法に max-age があります。これは、「現在の時刻からの秒数」で Cookie の寿命を指定します。
max-age を指定する場合は、setcookie() のオプションを利用して設定できます。
setcookie("user_theme", "dark", [
"expires" => time() + 86400, // 1日後
"path" => "/",
"secure" => true,
"httponly" => true,
"samesite" => "Strict"
]);
PHP では max-age を直接指定する方法はなく、主に expires を利用する形になりますが、HTTP ヘッダーで max-age を設定することは可能です。
header("Set-Cookie: test_cookie=value; Max-Age=3600; Path=/; Secure; HttpOnly");
この設定では、「test_cookie」を 1 時間(3600 秒)保持するよう指定しています。
5. expires と max-age の違い
expires と max-age は、どちらも Cookie の有効期限を設定するための方法ですが、それぞれ以下の違いがあります。
| 設定方法 | 指定する値 | 対応ブラウザ |
|---|---|---|
expires |
特定の日時(例: 2025年12月31日 23:59:59) | すべてのブラウザでサポート |
max-age |
現在時刻からの秒数(例: 3600 秒) | HTTP/1.1 以降でサポート(古いブラウザでは未対応) |
一般的には、expires を使用する方が広くサポートされていますが、HTTP ヘッダーを操作する場合は max-age を使うこともあります。
6. Cookieの有効期限を変更・削除する方法
一度設定した Cookie の有効期限を変更したり、削除したりすることができます。変更する場合は、新しい有効期限を指定して setcookie() を再度実行します。
6.1 Cookieの有効期限を変更する
例えば、Cookie の有効期限を 1 週間から 30 日に延長する場合、以下のように記述します。
setcookie("user_token", "abc123", time() + (30 * 86400), "/");
このコードを実行すると、元々 1 週間の有効期限だった Cookie は 30 日に延長されます。
6.2 Cookieを削除する
Cookie を削除するには、有効期限を過去の時間に設定します。例えば、以下のように記述すると、すぐに Cookie が削除されます。
setcookie("user_token", "", time() - 3600, "/");
このコードでは、有効期限を 1 時間前に設定することで、ブラウザが Cookie を削除します。
7. Cookieの有効期限を設定する際の注意点
Cookie の有効期限を設定する際には、以下の点に注意が必要です。
7.1 ユーザーのプライバシーに配慮する
Cookie には個人情報を保存しないようにしましょう。特に、パスワードやクレジットカード情報を直接保存するのは危険です。
7.2 短すぎる有効期限はユーザーの不便につながる
有効期限が短すぎると、ユーザーがログインするたびに情報がリセットされるため、不便に感じることがあります。用途に応じて適切な期間を設定しましょう。
7.3 長すぎる有効期限はセキュリティリスクになる
逆に、有効期限が長すぎると、不正に Cookie を利用されるリスクが高まります。ログイン情報などの重要な Cookie には適切な期限を設定しましょう。
8. Cookieの有効期限を活用した実践的な例(ログイン情報の保存など)
実際に Cookie の有効期限を活用する例として、ログイン情報の保存を考えてみましょう。
8.1 ログイン情報を一定期間保持する
ログインフォームで「次回もログインを維持する」オプションを選択した場合、Cookie にユーザー情報を保存し、一定期間ログイン状態を保持することができます。
if ($_POST["remember_me"] === "on") {
setcookie("user_email", $_POST["email"], time() + (30 * 86400), "/");
}
このコードでは、「remember_me」がチェックされている場合、ユーザーのメールアドレスを 30 日間 Cookie に保存します。
8.2 次回アクセス時に自動ログインする
保存した Cookie を利用して、ユーザーがサイトを再訪問した際に自動ログインさせることができます。
if (isset($_COOKIE["user_email"])) {
echo "ようこそ、" . htmlspecialchars($_COOKIE["user_email"], ENT_QUOTES, 'UTF-8') . " さん!";
} else {
echo "ログインしてください。";
}
このコードを実行すると、Cookie に保存されているメールアドレスがあれば、自動的にログインメッセージを表示します。
8.3 セキュアなログイン Cookie の設定
ログイン Cookie をより安全に扱うために、secure や httponly を設定することを推奨します。
setcookie("auth_token", "xyz456", [
"expires" => time() + 86400,
"path" => "/",
"secure" => true,
"httponly" => true,
"samesite" => "Strict"
]);
この設定を行うことで、Cookie は HTTPS 通信時のみ送信され、JavaScript からのアクセスも禁止されます。
まとめ
PHP の Cookie の有効期限を設定する仕組みは、初心者が最初につまずきやすい箇所ではありますが、仕組みそのものはとてもシンプルで実用的な考え方に基づいています。特に、expires と max-age を使い分けながら、ユーザーの利便性やセキュリティを両立するという視点は、実際の Web アプリケーション開発において欠かせない考え方です。Cookie はユーザーの体験に直接関わる要素であり、正しく設定することで「再ログインの手間が省ける」「安全にデータを扱える」といった大きなメリットを生み出します。
expires を使う場合は「特定の日時」まで Cookie を保持でき、max-age を使う場合は「今から何秒後」まで保存するかを明確に指定できます。実際の現場では、ブラウザ対応の幅広さから expires が多く使われますが、HTTP ヘッダーを直接制御するシーンでは max-age のほうが自然な場面もあります。また、ログイン情報やテーマ設定のように、ユーザーが次回のアクセスでも同じ状態を維持してほしいケースでは、適切な有効期限設定がユーザー体験を大きく左右します。
その一方で、有効期限を短くしすぎるとログイン情報がすぐ失われてしまいユーザーに不満が生まれる可能性もありますし、逆に長すぎる有効期限はセキュリティリスクが高くなります。この記事で学んだ内容を踏まえて、用途に応じてバランスよく Cookie の期限を設定できるようになっておくと安心です。特に、secure・httponly・samesite といった属性を組み合わせることで、Cookie 周りの安全性をさらに高められるため、実務においては期限設定と併せて必ず意識したいポイントです。
最後に、実践的な例として紹介した「自動ログイン」の仕組みは、Cookie の有効期限設定が日常的に触れる場面のひとつです。次回訪問時にスムーズにログインできる仕組みは、ユーザーにとって大きなメリットでありながら、開発者に求められる責任も大きい部分です。正しい期限設定と安全なオプションの組み合わせによって、便利さと安全性を両立した Cookie 設計が実現できます。
サンプルコード(期限付きログイン Cookie の実装例)
if (isset($_POST["email"]) && isset($_POST["remember"])) {
setcookie("login_user", $_POST["email"], [
"expires" => time() + (14 * 86400),
"path" => "/",
"secure" => true,
"httponly" => true,
"samesite" => "Lax"
]);
}
このコードは、ログイン時に「ログイン状態を保持する」にチェックをつけた場合、二週間ユーザーのメールアドレスを Cookie に保存する例です。secure と httponly の設定により、安全性を確保しながらログイン体験を向上させる実用的な書き方になっています。
生徒
「Cookie の有効期限って、単に保存期間を決めるだけだと思っていましたけど、ユーザーの便利さと安全性の両方に関わるんですね。」
先生
「その通りだよ。特にログイン情報みたいな重要なデータに使うときは、期限設定がとても大切なんだ。期限が長すぎると不正アクセスのリスクも上がるからね。」
生徒
「expires と max-age の違いもよく分かりました。状況によって使い分ければいいんですね。」
先生
「その理解で合っているよ。ブラウザの互換性を重視するなら expires、安全な API 設計のときは max-age を使うなど、開発目的に応じて選べるようにしておくと実務でもスムーズだね。」
生徒
「secure や httponly を合わせて設定することで、安全性も高められるというのは大事なポイントですね。これからは意識して書いてみます!」
先生
「素晴らしいね。Cookie はシンプルだけれど Web 開発では欠かせない仕組みだから、今日学んだことをしっかり活かしていこう。」