セッション情報

セッション情報とは

  • サーバー側にデータを保存する仕組みです
  • クライアントを区別するためにランダムなIDを割り当て、そのIDに対応する保存域をサーバー側に作成します
  • セッション情報は、プログラムの実行環境やライブラリによって提供されます
  • Cookieは、クライアントに送信されるため、ユーザーに見せたくない内部情報などを保存するのに適しません
  • たとえば、Webでゲームを作っている場合、そのゲームで所持しているアイテムやお金などをCookieに保存するのは適切ではありません
  • これらの情報は、サーバー側に保存するのが適切です。そのような場面に使うのが、セッション機能です

サーバー側にデータを保存するセッション情報

  • プログラミング言語やライブラリによって提供されているセッション機能を使うと、サーバー上にユーザーに関するデータを保持できます
セッションIDで保存域を区別する
  • セッション機能は、プログラミング言語やライブラリによって提供される、「ユーザーごとに用意されるサーバー上のデータ保存領域」です
  • セッション機能に対応するプログラミング言語やライブラリでは、アクセスしてきたクライアントごとに、「セッションID」と呼ばれる
  • ランダムな文字列を渡して、クライアントごとに「セッションID」と呼ばれる
  • そしてセッションIDごとに、データの保存領域を当てます
  • つまり、クライアントの数だけサーバーに保存域を作り、そこにWebプログラムから自由に値を保存できるようにしたものがセッション情報です
  • セッション情報に保存する内容は、クライアントから見えないので偽装の心配がありません
CookieでセッションIDをやり取りする
  • 初回の接続では、Cookieをまだ持っていません
  • サーバー上に新しい保存領域が作られ、ランダムなセッションIDと結びつけられます
  • セッションIDは、クライアントにCookieとして送信します
  • 2回目以降のアクセスでは、クライアントは「セッションID」をCookieとして提示してきます
  • この時には、新しいセッション保存領域を作らずに、先に作成した保存領域を使うように構成します

セッションを使った実例

  • PHPでセッションを使うには、最初に「session_start関数」を呼び出す必要があります
<?php
  // セッションを開始する
  session_start();
  • 値を格納するには「$_SESSION」変数に代入します
<?php
    $ordervalue = $_POST[ 'order' ];
    $_SESSION[ 'order' ] = $ordervalue;
  • 値を削除した時には、「unset関数」を呼び出します
<?php
    // 選択されていないとき。削除する
    unset($_SESSION[ 'order' ]);


《order.php

<?php
  // セッションを開始する
  session_start();
  if (!isset($_POST[ 'order' ])) {
    // 選択されていないとき。削除する
    unset($_SESSION[ 'order' ]);
  } else {
    // 選択されているとき
    $ordervalue = $_POST[ 'order' ];
    $_SESSION[ 'order' ] = $ordervalue;
  }
?>
<!DOCTYPE html>
<html lang="ja">
<head>
<meta charset="UTF-8">
<title>セッション情報を使った例</title>
</head>
<body>
<p>商品を設定しました。</p>
<p><a href="settle.php">決済ページへ</a></p>
</body>
</html>
セッションから値を参照する
  • 読み取る場合も、最初に「session_start関数」を呼び出す必要があります


《settle.php

<?php
  // セッションを開始する
  session_start();
  if ((!isset($_SESSION[ 'order' ])) || ($_SESSION[ 'order' ] == '')) {
    echo '商品が選択されていません';
  } else {
    $ordervalue = $_SESSION[ 'order' ];
    echo $ordervalue . 'の購入手続きを進めます';
  }
?>
<!DOCTYPE html>
<html lang="ja">
<head>
<meta charset="UTF-8">
<title>セッション情報を使った例:決済ページ</title>
</head>
<body>
<p>決済ページ</p>
<p><a href="item.php">商品を選択し直す</a></p>
</body>
</html>

セッションIDを見る

  • session_start関数」を呼び出すと、セッションIDが生成され、この値はCookieによって送受信されます
  • 開発車ツールを使ってCookieを確認すると、アクセスした時には、「Set-Cookieヘッダ」が送信されてくることがわかります
  • PHPでは、「PHPSESSID」という名称でセッションIDを渡します(本来は見せてはいけないデータです)
セッションのタイムアウト
  • ブラウザが閉じられたタイミングでサーバー上のセッション情報も開放したいところですが、それはできません
  • なぜならWebサーバー側では、クライアントがWebブラウザを閉じたことを知る手段がないからです
  • そこで「一定時間利用しなかった保存領域は開放する」というタイムアウトをとります
  • PHPの場合は、タイムアウト時間は「3600秒(1時間)」に設定されています
セッションを使う場合の注意点
  • セッションハイジャック(第三者がセッションIDを盗むことで、なりすまし攻撃をすること)
  • セッションIDは盗まれるものだと諦め、重要な情報の前にはもう一度「ユーザー名」と「パスワード」を再入力させるようにする

セッションを終了させる

  • session_destroy関数を実行する
<?php
  session_destroy();
  $_SESSION = null;  // セッション変数を初期化
  setcookie( session_name(), null, 0, '/' );// セッション・クッキーを削除