PHP

【PHP】セッションを利用する方法

こんにちは、ともです。

PHPでセッションを利用する方法についてまとめたいと思います。

認証や確認画面などでフォームから入力された情報をセッションに持たせるなどすることがあると思います。

この記事では、PHPでセッションの開始(session_start)から保存、破棄(session_destroy)についてまとめます。

セッションとは

サーバに保存されるデータです。

セッションには開始と終了までの期間があり、期間を越えると消えます。ログインをずっとしなかったら、また認証を求められたりするのはセッションで管理されているからです。

ブラウザ側にはクッキーにセッションIDが保存されており、セッションIDからサーバ側に格納されているユーザのセッション情報を特定します。

そのセッション情報がユーザAのものなのか、ユーザBのものなのかはセッションIDによって特定されている訳です。

セッションIDが盗まれるとセキュリティ上問題があることから、定期的にセッションIDを更新したりもするそうです。

セッションの開始

<?php
   session_start();
?>

これによりセッションが開始されます。ブラウザ側のクッキーにセッションIDが格納されていると説明しました。このメソッドを起動してからクッキーの情報を確認してみます。

<?php
 echo $_COOKIE['PHPSESSID'];
 // Out:83erk4bqc3hscp0k8g38dbdvp0
?>

スーパーグローバル変数の$_COOKIEを確認することでクッキー情報は確認できます。サーバの設定によりますが、PHPの場合はPHPSESSIDというキー名で確認することができると思います。(後述します)

『83erk4bqc3hscp0k8g38dbdvp0』このような文字列が出力されたら、それがセッションIDとなります。

このセッションIDがブラウザ側に保存されており、セッション情報を特定することができる訳です。

セッションの保存

保存方法

session_startメソッド後にセッション情報を保存することができるようになります。

<?php
$_SESSION['key'] = value;
?>

このようにスーパーグローバル変数の_SESSIONに格納します。セッションの情報はセッションファイルに書き出されています。

では、セッションの情報はどこに格納されているのでしょうか。

phpinfoの確認

phpinfoを確認してみますと次のように書いています。

session.gc_maxlifetime セッションの持続時間
session.name セッションIDか格納されているクッキーのキー
session.save_path セッション情報が格納されているフォルダ

上記の3つに注目したいと思います。

セッション情報の保存場所

セッション情報はファイルとして書き出されており、phpinfoのsession.save_pathにその格納場所が設定されています。

session.save_pathの欄にセッション情報が書き出されるフォルダへのパスが書かれています。サーバのそのディレクトリを確認してみます。

『sess_83erk4bqc3hscp0k8g38dbdvp0』というファイルが確認できました。このことから『sess_セッションID』というファイル名で管理していることがわかります。

次のように保存しこのセッションファイルを確認してみます。

<?php
   session_start();
   $_SESSION['first'] = "初めての保存";
?>
first|s:33:"初めてのセッション格納";

このようにファイルに書き出されていることがわかります。

phpinfoのsession.nameに『PHPSESSID』と書かれています。

セッション情報の保存期間

セッションはいつか切れるものです。ログイン状態がいつの間にかログアウト状態になっていたりします。

それはセッションが切れたからであり、その上限はphpinfoで確認した『session.gc_maxlifetime』の項目にあります。

デフォルトが1440[s]であり、デフォルトの場合ですと最大で24分で削除されることになります。

セッションの情報ではなく、セッションファイルの保護期間となりますので、sess_83erk4bqc3hscp0k8g38dbdvp0のファイルが最大24で削除される訳です。

クッキーのセッションID

クッキーにセッションIDが保存されると前述しました。

<?php
   echo $_COOKIE['PHPSESSID'];
?>

で確認しましたが、そのキー名『PHPSESSID』はphp.iniのsession.nameに書かれています。

セッションの破棄

全削除(セッションファイルを削除)

<?php
   session_destroy();
?>

session_destroyメソッドにより現在のセッションに 関連づけられたすべてのデータを破棄します。

つまり、session.save_pathに設定したフォルダのセッションファイル(sess_83erk4bqc3hscp0k8g38dbdvp0)が削除されます。

全削除(セッションファイルの中身を空にする)

セッションファイルを削除はしたくないが、セッションに保存された情報を全て削除したい場合は次のコードが利用できます。

<?php
   $_SESSION = array();
?>

php.iniのsession.save_pathに保存されたセッション情報を確認してみてください。session_destroy()の場合とは異なり、ファイルが空になっていることが確認できます。

特定の情報を削除

特定の情報を削除するにはunsetメソッドが利用できます。

<?php
  unset($_SESSION['key'])
?>

これにより特定の情報を削除することができます。

調べたところunset($_SESSION)とすると、セッションに保存等が以降できなくなるのでやってはいけないです。

セッションIDの再生成

セッションIDを別のIDに置き換えたい場合はsession_regenerate_id()が利用できます。

このメソッドはセッションIDを再生成し、セッションデータを引き継ぎます。

つまり、php.iniのsession.save_pathに保存してありセッション情報が格納されてあるファイルを確認します。

-rw-------. 1 apache apache 47 Dec 29 20:20 sess_1trenkq2nutuoe6c4mk9qkkjf7//regenerateにより生成
-rw-------. 1 apache apache 47 Dec 29 20:11 sess_83erk4bqc3hscp0k8g38dbdvp0//元ファイル

セッション情報が再生成されていることがわかります。

デフォルトで古いファイルが残ってしまうので、古いファイルを削除したい場合はsession_regenerate_id(true);をしてください。そうすれば古いファイルは破棄されます。

まとめ

セッションの生成から削除までを確認しました。

  • session_startでセッションの開始
  • session_destroyでセッションの破棄
  • session_regenerate_idでセッションIDの再生成

セキュリティ的にもセッションをしっかりことは大切ですので、もう少し理解を進めたいです。