PHPでログイン機能やWebアプリケーションを開発する際、ユーザーの状態を維持するために不可欠なのが「セッション」です。
しかし、デフォルト設定のままでは、ユーザーがブラウザを閉じるとセッション情報が消えてしまいます。
「ログイン状態を1週間維持したい」「一定時間操作がなければ自動的にログアウトさせたい」といったことを実現するには、セッションの有効期限を正しく設定する必要があります。
しかし、PHPのセッション有効期限には、実は2つの異なる概念が存在し、両方を適切に設定しないと意図した通りに動作しません。
そこでこの記事では、PHPにおけるセッション有効期限の仕組みから、具体的な設定方法、そしてセキュリティを高めるためのベストプラクティスまで、初心者にもわかりやすく解説していきます。
【本記事の信頼性】
- 執筆者は元エンジニア
- 大手プログラミングスクールのWebディレクター兼ライターを経験
- 自らも地元密着型のプログラミングスクールを運営
受講生から評判の良いプログラミングスクール
スクール |
特徴 |
受講料金 |
大手比較サイトで4年連続人気NO.1!受講生からの評判も非常に高く、Web系のエンジニアを目指すならRUNTEQ一択。 | 550,000円 (最大44万円の給付金が適用される) |
|
月単価80万円以上の現役エンジニア講師による指導!一度入会すればサポートは半永久的。 | 498,000円 |
|
格安で質の高いWeb制作スキルを習得したい人におすすめ!業界最安級の料金でありながら、コミュニティやサポートが充実。 | 129,800円~ |
|
完全無料でプログラミングが学べる貴重なスクール!最短1ヶ月で卒業可能。ゼロスク運営会社への就職もできる。 | 完全無料 |
|
長期間に渡って学習し、希少人材を目指す人に最適なスクール!受講料は高いものの、高収入を得られる人材を目指せる。 | 96~132万円 |
なぜセッションの有効期限が重要なのか?
PHPのセッションは、デフォルトではブラウザを閉じるまでの間だけ有効です。
これは、セッションIDを保持している「セッションクッキー」の有効期限が0
(ブラウザの終了時まで)に設定されているためです。
この挙動は一時的な情報を扱うには便利ですが、以下のような要件には対応できません。
- ログイン維持機能:ユーザーが一度ログインしたら、ブラウザを閉じても数日間はログイン状態を維持したい。
- セキュリティ向上:公共のPCなどで利用された場合、長時間セッションが残り続けると、第三者による「なりすまし」のリスクが高まるため、一定時間で確実にセッションを無効化したい。
これらの機能を実現するためには、セッションの有効期限を意図的にコントロールする必要があるのです。
セッションの有効期限は2種類ある
PHPのセッション有効期限を理解する上で最も重要なポイントは、「サーバー側」と「ブラウザ側」の2つの有効期限が存在し、両方が関連し合っているという点です。
サーバー側の有効期限 (session.gc_maxlifetime)
これは、サーバー上に保存されているセッションデータファイルそのものの有効期限です。
PHPには「ガベージコレクション(GC)」という仕組みがあり、最後にアクセスされてから一定時間(デフォルトでは1440秒 = 24分)が経過したセッションファイルを、一定の確率で自動で削除します。
この時間を制御するのがsession.gc_maxlifetime
という設定です。
例えば、この値を3600
(1時間)に設定すると、1時間以上アクセスのないセッションファイルがサーバーから削除される対象となります。
ただし、いくらブラウザがセッションIDを保持していても、サーバー側に対応するセッションファイルがなければ、そのセッションは無効になります。
ブラウザ側の有効期限 (session.cookie_lifetime)
こちらは、ユーザーのブラウザに保存される「セッションIDを記録したクッキー」の有効期限です。
この時間を制御するのがsession.cookie_lifetime
です。
デフォルトでは0
に設定されており、これは「ブラウザを閉じるまで」を意味します。
もしこの値を86400
(1日)に設定すれば、ユーザーはブラウザを閉じても、1日間は同じセッションIDをサーバーに送り続けるため、セッション(例:ログイン状態)が維持されます。
しかし、いくらこちらの有効期限を長くしても、サーバー側でセッションファイルがGCによって削除されてしまえば、やはりセッションは無効となります。
したがって、ログイン維持のような機能を作るには、この両方の有効期限を適切に設定する必要があるのです。
PHPスクリプトでセッションの有効期限を設定する
セッションの有効期限は、サーバー全体の設定ファイルであるphp.ini
でも変更できますが、アプリケーションごとに有効期限を変えたい場合がほとんどでしょう。
その場合は、PHPスクリプト内で動的に設定するのが一般的です。
ここで最も重要なルールは、必ずsession_start()
を呼び出す前に、すべての設定を完了させることです。
以下は、セッション有効期限を1週間に設定するサンプルコードです。
<?php
// --- セッションの有効期限設定 ---
// 1. ブラウザ側のクッキーの有効期限を1週間に設定
// (60秒 * 60分 * 24時間 * 7日)
$cookie_lifetime = 60 * 60 * 24 * 7;
// 2. サーバー側のセッションファイルの有効期限を1週間に設定
// (php.iniのsession.gc_maxlifetimeを上書き)
ini_set('session.gc_maxlifetime', $cookie_lifetime);
// 3. セッションクッキーのパラメータを設定
// session_set_cookie_params(有効期限, パス, ドメイン, セキュア, HTTPのみ)
session_set_cookie_params($cookie_lifetime);
// --- セッションの開始 ---
// 必ず設定の後にsession_start()を呼び出す
session_start();
// これ以降、このセッションは1週間有効になる
$_SESSION['user_id'] = 123;
echo 'セッションを開始し、有効期限を1週間に設定しました。';
?>
上記のコードについて、以下の項目で解説していきます。
session_set_cookie_params() でクッキーの有効期限を設定
この関数は、セッションクッキーに関する様々なパラメータをまとめて設定します。
第一引数に有効期限の秒数を渡すことで、ブラウザ側の有効期限をコントロールできます。
セキュリティを高めるために、path
, domain
, secure
, httponly
といった他のパラメータも適切に設定することが推奨されます。
ini_set() でGCの有効期限を設定
ini_set()
は、PHPの設定(php.ini
の内容)をスクリプト実行中に動的に変更するための関数です。
ini_set('session.gc_maxlifetime', 秒数)
と記述することで、サーバー側のセッションファイルの有効期限を、クッキーの有効期限と合わせて延長します。
必ずsession_start()の前に設定する
session_start()
は、HTTPリクエストに含まれるクッキー情報などを基にセッションを開始・復元する関数です。
セッションが一度開始されてしまうと、そのセッションに関する設定(クッキーの有効期限など)を変更することはできません。
そのため、有効期限に関する設定は、必ずsession_start()
が呼び出される前に行う必要があります。
ログイン維持(自動ログイン)機能の実装例
これまでの知識を応用して、一般的な「ログイン状態を維持する」機能の実装例を見てみましょう。
ログインフォームに「次回から自動でログインする」といったチェックボックスを用意し、その状態に応じてセッションの有効期限を切り替えます。
<?php
// ログインフォームからPOST送信があったと仮定
$is_login_successful = true; // 実際にはDBでの認証処理
$remember_me = isset($_POST['remember_me']); // チェックボックスの状態
if ($is_login_successful) {
// ログイン維持にチェックがある場合のみ、有効期限を延長する
if ($remember_me) {
// 有効期限を30日に設定
$lifetime = 60 * 60 * 24 * 30;
ini_set('session.gc_maxlifetime', $lifetime);
session_set_cookie_params($lifetime);
}
// セッションを開始
session_start();
// ログイン成功時にセッションIDを再発行(セキュリティ対策)
session_regenerate_id(true);
$_SESSION['user_id'] = 1; // ログイン情報を保存
// マイページへリダイレクト
header('Location: mypage.php');
exit;
}
?>
このように、条件に応じてsession_start()
の前の設定を変えることで、柔軟なセッション管理が実現できます。
セキュリティ向上のための追加設定
セッションの有効期限を長く設定する場合、セキュリティへの配慮がより一層重要になります。
セッションIDを再発行する session_regenerate_id()
ユーザーがログインに成功した直後など、権限レベルが変化する重要なタイミングでsession_regenerate_id(true)
を呼び出すことを強く推奨します。
これは、セッションIDを新しく発行し直すことで、「セッション固定化(Session Fixation)」と呼ばれる、第三者がセッションIDを推測したり盗んだりして「なりすまし」を行う攻撃を防ぐための非常に重要なセキュリティ対策です。
php.iniでの設定(参考)
アプリケーション全体でセッションの有効期限を統一したい場合は、サーバーの設定ファイルであるphp.ini
を直接編集することもできます。
php.ini
; サーバー側の有効期限を1時間に設定
session.gc_maxlifetime = 3600
; ブラウザ側のクッキーの有効期限を1時間に設定
session.cookie_lifetime = 3600
この方法は、サーバー全体に影響を与えるため、変更にはサーバー管理者の権限が必要です。
通常は、前述の通りPHPスクリプト内でアプリケーションごとに設定する方が柔軟性が高く、一般的です。
まとめ
今回は、PHPのセッション有効期限について、その仕組みと具体的な設定方法を解説しました。
なお、PHPを体系的に学んだり、PHPのスキルを高めたりするためには、プログラミングスクールを利用するのも有効です。
細かな疑問がすぐに解決するだけでなく、現役エンジニアが「質の高いポートフォリオ」を作成するための手助けをしてくれたり、エンジニア就職・転職のコツを教えてくれたりするなど、様々なメリットがありますので、独学に疲れた方は検討してみてはいかがでしょうか。