こんにちは、
冷凍食品にはまっているサトウです。
さて、本題に入りたいと思います。
phpの学習を始めると、「セッション」というワードを目にする機会も増えてくるのではないでしょうか。「セッション」という言葉は聞いたことがあっても、使い方や活用方法については理解できない方も少なくないのでは、、、。と思い、今回は「セッション」について分かりやすく説明していきます。
phpを学び始めた方や、「セッション」について分からない方は、是非読んでみてくださいね。
目次
セッションとは?
セッションの基本
セッションとはコンピュータのサーバー側に一時的にデータを保存する仕組みのことです。
Web上でのログイン情報や最終アクセスなど、ユーザーに直接紐づくような大切なデータをセッションに格納して使います。
ECサイトやネットショッピングでは「氏名」「住所」「パスワード」「商品購入情報」等が該当します。
セッションとクッキーの違い
セッションはデータを保存する仕組みのため、クッキーと混同されることがあります。セッションとクッキーは仕組みが非常に似ていますが、以下の点で異なります。
「データの保存場所」
クッキーはブラウザ側、セッションはサーバー側にそれぞれデータが保存されます。
「セキュリティ面」
Cookieはブラウザ側に保存されるという性質上、ユーザーがデータを改ざんすることもできてしまうため、セッションのほうがよりセキュリティ的に安全だと言われています。webブラウザに保存されているデータはユーザー側で内容を書き換えることも可能なため、その情報を信頼してやり取りをするのは好ましくありません。ログインすると個人情報が見えるような場合、そのログイン情報はセキュリティ面で優れているセッションで扱うことになります。
$_SESSIONを使ってみよう
セッションの考え方が理解できたところでセッションを使ってみましょう。
phpではセッションを利用するためにスーパーグローバル変数である$_SESSIONを使います。
<参考>
スーパーグローバル変数は定義済変数とも言われ、既にphp言語で用意されている変数です。
$_SESSIONの他に以下の変数があります。
参考:phpのスーパーグローバル変数一覧
$_GLOBALS
$_SERVER
$_POST
$_GET
$_COOKIE
$_FILES
$_REQUEST
$_ENV
セッション管理の開始
セッション管理を開始するには、session_start関数を使用します。session_start()と書くことで、新しいセッションを開始します。既に開始されている場合は、そのセッションを再開します。
コードサンプル
1 2 3 4 |
<?php // session_start()と書くとセッションの開始 session_start(); |
セッションIDの生成・確認
これでセッションが開始しました。セッションを開始するとセッションIDが生成されます。
セッションIDはsession_id()で確認することができます。
コードサンプル
1 2 3 4 5 6 7 |
<?php // session_start()でセッションの開始 session_start(); // セッションIDを確認する echo 'セッションID:'.session_id().'<br>'; |
実行結果
このランダムに生成された文字列がセッションIDになります。
セッション情報の保存・取得
次にセッションの中に情報を格納したり取り出したりする処理を解説していきます。
セッション情報は$_SESSIONに連想配列として保存され、$_SESSION[‘キー名’] = 値 と書いてセッション情報を保存することができます。また、セッション情報を変数 = $_SESSION[‘キー名’]と書くとセッション情報を取得できます。
コードサンプル
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
<?php // session_start()でセッションの開始 session_start(); // セッションIDを確認する echo 'セッションID:'.session_id().'<br/>'; echo '<br/>'; // セッション情報の保存 // $_SESSION['キー名'] = 値 $_SESSION['username'] = 'tanaka'; $_SESSION['email'] = 'tanaka@test.com'; // セッション情報の取得 // 変数に$_SESSION['キー名']を入れる $username = $_SESSION['username']; $email = $_SESSION['email']; // セッション情報の画面出力 echo '$_SESSION[username]の中身:'.$username.'<br>'; echo '$_SESSION[email]の中身:'.$email.'<br>'; |
実行結果
$_SESSIONに書き込んだ情報が確認できましたね。
実際にシステム開発ではバリデーション(入力したユーザ情報の文字数チェック)等を実施してセッション に情報を入れるケースが多いのですが、ここでは$_SESSIONに情報を格納して取り出せて使えるということがイメージできれば問題ありません。
セッション変数の削除
セッション変数を削除する時はsession_destroy()を使います。また、session_destroy()でセッションを削除しても、セッションに変数が入っている値までは削除できません。そのため先に$_SESSION = array()でセッション変数を初期化する必要があります。
1.セッションの値を初期化する
$_SESSION = array()
2.セッションを破棄する
session_destroy()
コードサンプル
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 |
<?php // session_start()でセッションの開始 session_start(); // セッションIDを確認する echo 'セッションID:'.session_id().'<br/>'; echo '<br/>'; // セッション情報の保存 // $_SESSION['キー名'] = 値 $_SESSION['username'] = 'tanaka'; $_SESSION['email'] = 'tanaka@test.com'; // セッション情報の取得 // 変数に$_SESSION['キー名']を入れる $username = $_SESSION['username']; $email = $_SESSION['email']; // セッション情報の画面出力 echo '$_SESSION[username]の中身:'.$username.'<br>'; echo '$_SESSION[email]の中身:'.$email.'<br>'; echo '<br/>'; // セッションの値を初期化する $_SESSION = array(); // セッションを破棄する session_destroy(); // セッションが空でなければその中身を表示 if(!empty($_SESSION)){ echo $_SESSION; }else{ echo 'セッションが空です'; } |
実行結果
セッションの中身がないので、「セッションが空です」という文字列が表示されていますね。
session_destroy()はシステムからログアウトする時等によく使用します。
セッションIDの再発行
セッションはサーバー側に保存される情報と紐づくため、セキュリティ上扱いに注意しなければなりません。何らかの方法でセッションが漏洩し、乗っ取らてしまうと(これをセッションハイジャックと言います)、ユーザの権限を使われて不正な操作をされたり、ユーザの個人情報・重要情報が盗まれる場合があります。つまり、「なりすまし」による不正アクセスが可能になってしまいます。
そのようなことを防止するため、セッションIDそのものを変えることができます。
セッションIDの再発行にはsession_regenerate_id()を使います。
コードサンプル
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
<?php // (1)セッション開始 session_start(); // (2)セッションIDの出力 echo 'セッションID:<br>'; echo session_id().'<br>'; echo '<br>'; // (3)セッションIDの再発行 session_regenerate_id(); echo 'ここでsession_regenerate_id()を使いました!<br>'; echo '<br>'; // (4)再発行したセッションID echo '再発行したセッションID:<br>'; echo session_id().'<br>'; echo '<br>'; ?> |
実行結果
セッションIDが変更になっているのが確認できましたね。
まとめ
いかがでしたか?今回は、セッションについて解説しました。
プログラミングを学び始めた頃は、「セッション」の概念や使い方についてややこしく感じることあると思います。ですが実際にwebサービスを開発したり、ログイン認証が必要な機能を何度も作っていくと体系的に理解できる日が来ると思うので、焦らずにゆっくりと理解を深めていってくださいね。
この記事が、phpの学習に役立つと嬉しいです。