こんにちは。最近傘を新調したので、実は雨の日が楽しみなひろです。
皆さんは、PHPで「セッション」や「Cookie」というものを聞いたことはありますか?
セッションとCookieは、ウェブ開発を行う上で絶対に欠かすことのできない基礎知識の一つになります。また、よく聞かれる「セッションとCookieの違い」も解説しますので、ぜひこの記事を読んで、使い方をマスターしましょう!
セッションとはサーバーに一時的なデータを保存する手法
それでは、まずはセッションについて解説します。セッションは、一時的なデータをサーバーに保存する事ができる仕組みです。ブラウザにはセッションIDという鍵をブラウザに保存しておくことで、ページを訪れた際にIDを照合することでデータを取得することができます。
使うにはsession_start関数を使う
使用するにはsession_start()という関数を使用すればすぐに使用することができます。
1 2 |
//セッションを使う session_start(); |
使用するページには必ず記述するようにしましょう。また、理由は後述しますが、セッションを使用する際にはsession_regenerate_id()という関数も一緒に使用するようにしましょう。
$_SESSIONというあらかじめ用意された変数を使用できる
セッションを使うと、$_SESSIONという関数を使用することができます。これはログイン状態の保持などに使うことができ、非常に使い勝手の良い変数です。
1 2 3 4 5 6 7 |
//セッションを使う session_start(); //$_SESSIONという変数を使うことができる $_SESSION = array(); $_SESSION['user'] = 'guest'; $_SESSION['login_flg'] = true; |
$_SESSIONはページをまたいで使うことができる変数
$_SESSIONはページをまたいで使うことができるので、例えばショッピングサイトでカートに入れた商品などを、別のページに行っても保持する事ができます。
ウェブ開発を行う上で、セッションの使い方は必ずマスターしたい理由の一つが、「使われているウェブサービスが非常に多い」という理由になります。
Cookieとはブラウザに一時的にデータを保存する方法
それでは、セッションと似て非なるCookieについて解説します。
一時的なデータを保存するCookieとセッションの最大の違いは、「サーバーではなくブラウザが保存している」という点です。
ホームページなどの訪問した履歴やデータを一時的に保存する
どのようなホームページに行ったかなど、履歴を一時的に保存することができます。ショッピングサイトなどで、「このページは2020/1/1に訪れました」などの情報が表示されることがありますが、基本的にはこのCookieを使うことで実装することができるのです。
セッションIDもCookieの中に保存されている
セッションIDという鍵がブラウザに保管されている、と冒頭で解説しましたが、このセッションIDはCookieに保存されています。なので、Cookieを削除すると使用していたセッションも取得することができなくなります。
ブラウザに保存されている情報なので、ユーザーも見ることができる
ブラウザに保存されている情報になるので、ユーザーもCookieの中身を見ることができます。chromeの場合であれば、chromeデベロッパーツールを開き、「Application」というタブを開くと、Cookieを確認できます。
セッションを使う際によく使う関数
より具体的に、セッションの使い方を解説します。ここでは、セッションを使用する際よく併用される関数を紹介します。
セッションの保管場所を変更するsession_save_path関数
セッションの保管場所を変更するsession_save_pathという関数があります。以下のように使用します。
1 2 3 |
// セッションの保管場所を変更する session_save_path('/var/tmp/'); // /var/tmpに置くと30日は削除されなくなる |
引数で保管場所を渡すことで、保管場所を変更できます。引数に「/var/tmp/」を指定することで、セッションを30日間は削除されなくするよう設定することができます。
セッションの有効期限の設定はini_set関数で設定可能
セッションの有効期限を任意に設定するには、ini_set関数を使用します。
1 2 |
// ガベージコレクションが削除するセッションの有効期限を設定 ini_set('session.gc_maxlifetime', 60 * 60 * 24 * 30); |
ガベージコレクションというのは、プログラムが不要になった情報を削除することで動作を快適にさせる機能のこと。
このガベージコレクションによってセッションは削除されるのですが、第一引数に「session.gc_maxlifetime」を、第二引数に数値を入力することで、その秒数は削除されなくなります。
クッキーの有効期限の延長もini_set関数で設定可能
こちらもini_set関数を使用します。
1 2 |
// クッキーの有効期限を延長する ini_set('session.cookie_lifetime', 60 * 60 * 24 * 30); |
先ほど紹介したCookie自体が削除されてしまうと、セッションIDもなくなってしまいます。
セッションの有効期限を伸ばす場合は、こちらの設定の併用も必要です。第一引数に「session.cookie_lifetime」を、第二引数に数値を入力することで、クッキーの有効期限を任意に設定することができます。
セッションIDを都度置き換えるsession_regenerate_id関数
セッションIDを都度置き換えることで、セッションハイジャックと呼ばれる攻撃の対策を取ることができます。
1 2 |
// セッションIDを都度置き換える session_regenerate_id(); |
基本的にはセッションを利用する際には、このsession_regenerate_id関数を使用するようにしましょう。
セッションを削除することができるsession_destroy関数
セッションを削除します。ログアウトなどに使用される関数です。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
<?PHP // セッションの初期化 session_start(); // セッション変数の中身を空にする $_SESSION = array(); // セッションを切断するにはセッションクッキーも削除する。 if (ini_get("session.use_cookies")) { $params = session_get_cookie_params(); setcookie(session_name(), '', time() - 42000, $params["path"], $params["domain"], $params["secure"], $params["httponly"] ); } // 最終的に、セッションを破壊する session_destroy(); ?> |
$_SESSIONの中身をすべて消すために、まず$_SESSIONの中身を空にします。その後、セッションを切断するためにセッションクッキーも削除し、最後にsession_destroy()でセッションを破壊しましょう。
使用上の注意
セッションハイジャックという攻撃方法がある
セッションハイジャックというのは、セッションIDが何らかの理由で外部に漏れることにより、不正なログインが行われたり、個人情報が盗まれてしまう攻撃のことです。完全に防ぐのは難しいですが、session_regenerate_id関数を使用したり、ログアウトなどの際にきちんとセッションを削除してあげることが対策として用いられています。
まとめ
いかがでしたか?今回は、
について解説しました。紹介した関数を適材適所使い分け、ぜひ取り入れてみてくださいね。