For Want Of A Better Word

[php]ログインセッションの維持・有効期間について (session,cookie)

   

cookieとsessionファイルと、登場人物が複数いるので、どこに何を設定すればよいか、よくこんがらがるので整理。

 

まず、セッションの仕組み

①session_start()で、サーバー上にセッションファイルが生成される。

デフォルトは/var/lib/php/session以下に保存。dbに保存とか保存先の変更もできる。

②session_idをクライアントのブラウザにcookieとして保存する。

session_idを保存するcookie名はphpデフォルトでは、PHPSESSID。
php.iniの設定や、session_name()で動的に変更も可能。

 

セッションが切れるとは

動作的には、①のセッションファイル、②のcookieいずれかが破棄されると、セッションが維持できなくなる。

ユーザーから見ると、これがセッションの有効期間ということになる。

なので、設定する側は二つの要素の有効期間に配慮しないといけない。

ここら辺でこんがらがる。

 

①セッションファイルの有効期限

セッションファイルが削除されるのは、

  • (1)セッションの最終更新日時から”session.gc_maxlifetime”(単位秒:デフォルト24分)以上経過しており、
  • (2)その後、session_start()時にガーベジコレクションが動いたタイミング。

となる。

しかし、ガーベジコレクションは必ず動くわけではなく、“session.gc_probability / session.gc_divisor”の値(デフォルト1/100)の確率で動く。

なので、極端にアクセスが少ないと、なかなかファイルが消えず、同じセッションIDが使えたりする。

 

なので、

sesssionファイルの有効期限は「session.gc_maxlifetime」(秒)で設定し、

確実にセッションデータを削除したい(時間経過で終わりだよとしたい)なら、「 session.gc_divisor」の値を小さくするとよい。※後述のcookieの削除の方が挙動としては確実かも..

 

session有効期限の設定方法

複数の方法がある。

方法1. php.iniファイルを変更する。

シンプルだが、レンタルサーバーなどで、php.iniをいじれない場合は困る。。

方法2. プログラム中で動的に設定する。

php_set_ini()を使って、毎回明示的に設定する。

ただし、session_start()の場面で、設定がもれて他の値が設定されると、小さいほうにアジャストされるので、ちょっと怖い。

 

方法3. .htaccessに記述する

php.iniが編集できなくても、.htaccessが使えるならこれが一番いいかも。

こんな感じ。604800は60*60*24*7 で1週間。

 

 

②cookieの有効期限

 

sessionの期間に合わせてcookieの有効期間も設定しないと。

短くするならどっちかが消えればいいけど、長くしたいなら両方長くないといけない。

 

cookieの有効期限のは、cookie作成時に有効期間(破棄日付)を設定するだけ。

設定する場所によってそれぞれやり方が異なるが、考え方は同じ。

 

PHPの場合

setcookie()の3番目の引数。

参考:http://php.net/manual/ja/function.setcookie.php

 

jsの場合

こんな感じ。たいていセット用の関数でcookieをセットすると思うので、その関数の仕様を確認したほうがよいかも。

 

参考:https://developer.mozilla.org/ja/docs/Web/API/Document/cookie

 

補足:フレームワーク CakePHPでのsession、cookieの設定

CakePHPのようなフレームワークの場合、その中でそれぞれ設定できる。

サービスがフレームワーク内で全てであれば、そこの設定でよい。

Cakeの場合はcore.phpに下記のような設定をしてこまごま記述できる。

注意が必要なのは、

‘timeout’はcake内でのsession有効期間の話で、上述したphp.iniのgc_maxlifetimeとは別。
なので、gc_maxlifetimeも設定する。単位が違うことも注意が必要。

参考:https://inoccu.com/blog/2012/11/21/223145.html

 - php

  関連記事

MongoDBとPHP_リンクと個人的ポイントまとめ

=============================== リンク集 === …

WordPressで作ったページと同じデザインで、好きなコンテンツを好きな場所に作りたい

下記のわがままをかなえるため、調査 そもそも、wordpressでブログを作った …

【PHP】【Slim】DBの利用は自力で頑張る!

公式の説明とか、サイトを眺めましたが特別O/Rマッパーのような機能は無く。 自分 …

自然順と辞書順のソートの違い

  本ページの内容は下記リンクに集約しました。 http://www. …

CentOSをインストールしたときにいつも最初にやること(apache mysql phpのインストール)

SElinuxの無効化 iptableの無効化 apacheのインストール・自動 …