【php】セッション管理をさらっとおさらい

 

 

 


概要

cakePHPを使っているとログインの手続きはすべてAuthコンポーネントがすべてやってくれるため、セッション管理を特に意識してプログラミングする必要はありません。

しかし、ログイン時の挙動を変更したり、Authコンポーネントのバグでログインできなくなったりしたときには、cakePHPのセッション管理の仕組みを理解する必要があります。cakePHPにかぎらずwebプログラミングではセッション管理が重要ですのでこの機会にセッション管理についておさらいしてみました。

 

 

 


環境

 

 

 

 


そもそもセッション管理って何?

 

セッションをネットで調べると以下のように説明しています。

セッションとは、活動期間、学期、会期、開催期間、集会などの意味を持つ英単語。コンピュータシステムやネットワーク通信において、接続/ログインしてから、切断/ログオフするまでの、一連の操作や通信のこと。IT用語辞典 e-Words

 

HTTP通信でWEBアクセスでしても、HTTP通信自体にセッション(つながり)という概念はないため、たとえ直前に同じ人(端末)からアクセスがあっても、サーバー側ではそのつながりがわかりません。

そこで、過去にアクセスがあった時の内容を呼び戻して参照できる仕組みをセッション管理といいます。

 

セッション管理について具体的で細かな説明は、こちらのサイトを参考にさせていただきました。このサイトではセッション管理の仕組みを順を追って実例を交えながら、ときには説明がまどろっこしいと思いえるくらい丁寧に書かれています。

 

セッション管理、クッキー(cookie)入門(システム奮闘記:その62)

http://www.geocities.jp/sugachan1973/doc/funto62.html

 

 

 


サーバーどうやってデータのやり取りを行うの?

サーバーとのやり取りのつながり以前に、どうやってサーバーとやり取りする方法があるか知らないと始まりません。サーバーとやり取りを行う基本的な方法を説明します。

 

 

GETメソッド

URIのデータを取得するメソッドです。

 

下記のサイトでわかりやすく説明されています。

Web初心者のためのHTTP入門

 

おそらく最も使用頻度の高いメソッドで、HTML、画像、動画のデータなど、様々なデータを取得する時に使用されるメソッドです。またデータを取得する際に、クライアント側から、サーバ側にパラメータを送信することができます。

それは、GETメソッドでURIを指定した時に、URIの後ろに付ける文字列です。これをクエリストリングといいます。一般的には、URIのはてなマーク(?)以降であり、アンドマーク(&)でパラメータを区切ります。Web初心者のためのHTTP入門

 

PHPでGETデータを受け取る場合は、filter_input関数を使うようにします。

<?php
//GET値を取得
$cd = filter_input(INPUT_GET, "cd");
$name = filter_input(INPUT_GET, "name");

//値表示
print "コード:".$cd;
print "<br>";
print "名前:".$name;

$_GETでも取得できますが、公式PHPマニュアルでは$_GETは非推奨となっています。

 

 

POSTメソッド

 

URIにリソースを追加するメソッドです。

 

こちらも下記のサイトでわかりやすく説明されています。

Web初心者のためのHTTP入門

 

先ほどのGETがクライアントにとって、メインのデータ受信方法である一方、POSTはクライアントからサーバ宛へのメインのデータ送信方法になります。 先ほどのGETとは異なり、クライアント側からのデータが、HTTPリクエストのボディ部に格納されるため、大量のデータを送信したりすることが可能です。また、重要性の高いデータを暗号化してボディ部に格納して送信したりすることができます。(URIにデータを入れるGETと異なり、データはプロキシなどには保存されません。) 加えて、細かいGETとPOSTの挙動の違いですが、ブラウザで戻るボタンを押す時、POSTメソッドが呼ばれていた場合は、警告が出ますが、GETメソッドの場合は出ません。 Tech Tips: GETとPOSTの違いWeb初心者のためのHTTP入門

$_POST$_GET同様にPHP公式マニュアルでは非推奨となっています。PHPでGETデータを受け取る場合は、filter_input関数を使うようにします。

下記のサイトでは$_GETも$_POSTでデータを受け取ることがよくない理由が説明されています。filter_inputを使うべきなのですね。フレームワークを使用しているとこのような情報には疎くなりますが・・

$_GET, $_POST などスーパーグローバル変数に直接アクセスしない方がいい理由
https://teratail.com/questions/63786

 

 


どんな方法でセッション管理をするのか?

 

サーバーとのデータのやり取りはできても、どうやってその情報をサーバーに保存しているのか、どうやって同じ人からのアクセスと認識できるのか、phpでの実現方法をまとめてみました。

 

セッション管理は、最初にサーバーをアクセスした時に発行されるセッションIDを、クライアントが次回のサーバーにアクセスするときに、そのセッションIDを渡すことで前回のつづきであることを認識させることで実現します。そのために、phpではセッション管理を行うセッション関数とセッション情報を保存するセッション変数が用意されています。またクライアントは最初のアクセスで発行されたセッションID(セッション情報の識別番号)を保持する方法として、Cookieという仕組みを利用しています。

セッション関数はsesson_ではじまる関数でいくつかありますが、セッション管理にかならず必要とされる関数はsession_start関数です。基本的なセッション管理はこのsession_start関数だけで実現できます。

 

はじめてのアクセス(セッションIDの発行)

はじめてサーバーにアクセスされるとサーバー側のプログラムは次の処理を行います。

  •  セッションIDがなければ、セッションIDを発行し、セッションIDをCookieに保存するようにレスポンスメッセージを送信 する 
  •  セッションIDを発行するときに、サーバー側では、セッションIDごとにセッションファイルを作成する 

この処理を行うのが、セッション関数のsession_start()です。またセッション情報に次回のアクセスまでデータを保存しておきたい場合は、セッション変数($_SESSION)にデータを設定します。

 

二回目以降のアクセス(セッションIDからセッション情報の読込)

二回目以降サーバーにアクセスする場合は、クライアントのCookieに記憶されたセッションIDがPOSTデータとして自動的に送信されます。(ただし、Cookieが使用できない端末の場合、GETメソッドのパラメータにセッションIDを入れるか、HTMLのINPUTタグのTYPEパラメータをHIDDENにセッションIDを入れておくか、いずれかの方法でセッションIDをサーバーに送る必要があります。下記参照)

サーバー側のプログラムは以下の処理を行います。

  •  セッションIDがあれば、該当するセッションファイルにある情報を読み込む 

この処理を行うのも、はじめてのアクセスと同じセッション関数のsession_start()です。クライアントから送られてきたセッションIDで対象のセッション情報を読み込みますので、以降前回までのアクセスで保存したデータを参照することが可能です。

 

※Cookieが使用できない端末の場合、次のような方法でセッションIDを渡します。
① URLのパラメータとしてGETメソッドでセッションIDを渡す。

  1. session.use_trans_sid(php.ini)が1の場合
    ハイパーリンクの相対URLに、URL Rewriting機能により自動的にセッションIDが追加され、次のファイルに引き渡されます。
  2. session.use_trans_sid(php.ini)が0の場合
    ハイパーリンクのURLに、定数SIDを記述し、セッションIDを次のファイルに引き渡します。たとえば、以下のように記述します。
<a href="next.php?<?=SID?>">次ページ</a>
※定数SIDには、セッションIDが代入されます

②HTMLフォームのhiddenコントロールとしてセッションIDを引き渡す。
たとえば、以下のように記述します。

<input type="hidden" name="<?=session_name()?>" value="<?=session_id()?>">

 

※こちらのサイトを参考にさせていだたきました

 

 

 


参考

  1. phpのsession_start()について
    http://woshidan.hatenablog.com/entry/2013/12/08/183148
  2. 目の前のバグに気が付かず、セッションを学び直し、CakePHPをソースリーディングした話
    http://www.aipacommander.com/entry/2015/05/09/142822
  3. セッション管理、クッキー(cookie)入門
    http://www.geocities.jp/sugachan1973/doc/funto62.html
  4. (第8章 セッション管理)Apache+PHPによる+PostgreSQLによるWebアプリケーション
    http://www.yc.tcu.ac.jp/~yamada/doc/php/0802.html
  5. phpのデータの受け渡し方法
    http://d.hatena.ne.jp/osamuchan05/20131102
  6. PHP:“5分で実装”PHPでsession(セッション)中のページごとの設定方法、データの受渡し
    http://blog.tachibanacraftworks.com/344/

Leave a Reply

Your email address will not be published.