セッション管理

PHP4.0 から標準でサポートされているセッション管理機能の目的は、多数のユーザがアクセスする Webアプリケーションで、1人1人のユーザを区別することにあります。
クッキーを利用する方法もありますが、セッション管理を使うほうが、はるかに楽な開発が可能になります。
セッション管理の仕組みは、各ユーザの固有の IDをクッキーや URI への埋め込みで保存し、セッションIDを各ページで共有することによって、ユーザを判別することができるようになっています。この節では、セッション管理の仕組みについて解説します。
セッション管理の必要性
Webデータのやり取りは、クライアント側のユーザエージェントと HTTPプロトコルが使われます。HTTPは、1回のリクエスト(要求)とレスポンス(応答)の間に、「接続→通信→切断」という一連の処理が行われます。
HTTPプロトコルによって接続・通信・切断を行っている図
つまり、ページを移動するたびに同じ処理が繰り返し行われています。リクエストによってページのデータがレスポンスされ、受信が終わったら通信を切断します。決してクライアントが Webサーバにつなぎっぱなしになることではありません。
例えば、「認証」という手続きが必要なページにアクセスしたとします。パスワードを照合し認証が成功したらページのコンテンツをレスポンスとして送出します。
データがダウンロードされれば通信を切断します。そのとき、クライアントが次のページに移ったとき、サーバ側は切断後の同じクライアントであっても、認証を受けたユーザなのか分からないという問題が発生します。
一度認証されれば、その後認証の必要ないページに移動するのなら問題ないのですが、そうした場合には、誰でも認証なしにそのページを閲覧できてしまう危険が伴います。検索エンジンがそのページにヒットすれば世界中に公開されることになります。
クライアントがページを移動するたびに認証を求められてしまったら、決して快適とはいえません。そこで「セッション管理」を利用することになります。
セッション管理では、認証が成功したクライアントに対して、1つの 「セッションID」 を発行します。そのセッションIDをクライアントのクッキー、あるいは URLを書き換えることによって同一ユーザとみなし、セッション中の管理が容易く行えることになります。
セッション変数
セッション機能を使うと、「セッション変数」 というセッション中に固有の情報を格納することができます。
例えば、認証が成功するとセッションを維持する方法として、セッションIDがそれぞれのページごとにクライアントの Webブラウザに送られ、Webブラウザが次のページをリクエストすると、Webブラウザから Webサーバに IDを送り返します。
ログインしているクライアントの IDをセッション中に登録しておくことで、Webサーバはそのクライアントのセッションが継続していると判断できます。セッションIDを格納する変数さえ登録できれば、どのページでもいつまでも IDを参照できるということになります。
セッション変数に値を格納するのは、$_SESSIONを用います。
  $_SESSION[セッション変数名] = 値;
セッション変数は、セッションIDと関連付けられ Webサーバ上に保管されます。初期値として特定のディレクトリに、名前の一部にセッションIDが含まれるようなファイルとして保管されます。当然、セッションの数だけファイルが生成されます。
セッション管理のセキュリティ
セッション管理機能を利用したとき、第三者にセッションIDを知られると、簡単に「なりすまし」というセキュリティ上の危険にさらされます。
クッキーや URLに他人のセッションIDをセットしてリクエストを行うだけで、認証を通さず他人に成りすますことができてしまうので、セッションIDを第三者が見ることができないよう最新の注意を払う必要があります。
クッキー内にデータを格納するのは危険が伴います。クッキー情報は極めて脆弱で信頼性にかける欠点があります。セッションのためにクッキーを使うときには、クッキー内に納められるクライアントの IPアドレスを暗号化したり、セッション情報の中の IPアドレスを保存して、違う IPアドレスからリクエストを遮断するといった方法があります。
セッションIDの漏洩は、以下のような要因で発生する場合があります。
重要な情報を扱う場合、SSLの利用や、クライアントユーザへの呼びかけを行うことで、セッションIDの漏洩に対して細心の注意を払うようにしたり、また、セッション中部分的にパスワードを要求することも選択肢の1つでしょう。


This Page is HTML4.01 Valid! 最新更新日 2004年2月8日   最新更新日 2004年4月1日
Copyright(C) 2002〜2004 banban@scollabo.com