[PHP] sessionのタイムアウトをサーバー設定ではなく、プログラム設定で変更する方法

2015年8月25日

PHP Tips テクノロジー プログラミング

PHPを使っていてログインするサービスを構築する場合、多くはsession機能を利用する事になると思う。 その際に、PHPのデフォルトcookieの保持時間は24分になっています。 php.iniの記述を変更してcookie時間をコントロールすると確実に制御できるのですが、もしサーバー設定を変更する権限が無い場合など、PHPのプログラム内でコントロールしたい場合は多々あると思います。 そんな時の対処方法をメモしておきます。

sessionの仕組みを簡単に説明

sessionをセットするという行為は、サーバーに任意文字列をセットし、ローカル環境であるブラウザに、その任意文字列をvalue値として、cookie情報を書き込んでおく。 サーバー側のセッションタイムが切れた段階でcookieも有効期限となり、セッション切れとなる。 多くのWEBサービスのログインの仕組みでこの方法が採用されているのですが、session関数を使うメリットとしては、連想配列的に、cookieやlocalstorageに格納しておきたいデータをサーバ側に設置することができ、有効期限も持たせられることから、セキュアにデータを扱うことができるという点がもっともメリットがある。 単にログイン情報のみを保持するのであれば、cookie情報を自分で書き込んだほうが、柔軟性は高くなることは間違いない。 ただ、デフォルト24分というsessionの保持時間は、多くの場合、短いと判断される事の方が多く、基本的には変更する必要が必ずあるという事なのですね。

php.iniの設定

php.iniの以下の行を変更します。 # Default (24min) session.gc_maxlifetime = 1440 # 1Hour session.gc_maxlifetime = 3660 # 1Year (365day) session.gc_maxlifetime = 31536000

プログラムでの扱い方

PHPプログラム

下記プログラムを実行するだけで、サーバーセッションを開始する事ができます。 session_name("session_name"); session_start(); この時点では、サーバーで設定をした時間を上限としたセッション期間になりますが、 JavaScriptでcookie操作をすると、ライフタイムを短くすることが可能になります。 サイトポリシーに沿ってJS側で操作する方が柔軟性が高いでしょう。 ※脆弱性対応などを強いられる場合はサーバーのライフタイムで厳密にコントロールしましょう。

JSプログラム

# PHPで書かれたcookieのsession値を取得 var session = function(){ var cooks = document.cookie.split("; "); for(var i=0;i<cooks .length;i++){ var cook_data = cooks[i].split("="); if(cook_data[0]!="session_name"){continue} var cook_value = cook_data[1].split(";"); return cook_value[0]; } }; # 期限の設定 var expire = new Date(); # 24時間(1日)有効 expire.setTime(expire.getTime() + 24*60*60*1000 * 1); # cookie操作 document.cookie = "session_name="+session+"; expires="+expire.toGMTString()+"; "; 今回は、session_nameが1つの時だけの書き方だったのだが、 実際には、ADを入れてたりすると、各サービス事の管理値が入ったりもするので、消さないように気をつけなければいけない。