下図のようにロードバランサ(負荷分散装置)のあるWebシステムで、ユーザーのログインによりプロフィール情報が表示されると仮定します。(ログイン認証アクションをアクションA、プロフィール情報取得表示アクションをアクションBとします。参考までに「アクションAをPOSTメソッドで実行し、成功すればユーザーに操作させることなくリダイレクトにより、アクションBをGETメソッドで自動実行する」処理方式をPRGパターンと呼びます。)
- アクションAで取得されたユーザーIDをアクションBでも使用するため、APサーバにユーザーIDを保存することがあります。「ユーザーIDを保存する特殊な変数」のことをセッション変数と呼びます。
- セッション変数は通常、APサーバのファイルに保存されますが、変数のシリアライズ・アンシリアライズ等も含め、ファイルへのアクセスはPHP本体が行ってくれるので、プログラマはファイルであることを意識せずに使用できます。
- APサーバのセッション変数とブラウザを紐付ける情報として、セッションIDと呼ばれる情報がAPサーバで採番されます。セッションIDは、通常はCookieとして、APサーバからブラウザに送信されます。(セッションID用のCookieは一時CookieやセッションCookieと呼ばれます。)Cookieが使用できない携帯では、URLにセッションIDが付与されます。
上図のように、ロードバランサが
アクションAを3号機に振り分けた場合、アクションBも必ず3号機に振り分ける機能のことをセッション・アフィニティ機能と呼びます。ロードバランサにセッション・アフィニティ機能が無ければ、セッション変数は基本的に使用できません。(セッション・アフィニティ機能があれば、上図のPCからアクションCやアクションD等が発生したとしても、必ず3号機に振り分けられます。)
- セッション変数を使用せずに「アクションAで取得されたユーザーID」を「アクションBで使用する」には、ユーザーIDをブラウザに送信します。PRGパターンであればCookie、PRGではなくユーザーが明示的にアクションを送信するのであれば、Cookie以外に「HTMLの隠しタグ(inputタグのtype="hidden")、AjaxであればJavascriptの変数、Flash・Silverlight・HTML5のローカルストレージ等」が、セッション変数の役割を代替します。
- ブラウザに送信する重要な情報は、改ざん・盗聴される可能性があるので、復号可能な暗号化が望まれます。
- セッション・アフィニティ機能が無くても、SPF(Scratch Pad File。セッション変数を保存するファイル)を「APサーバ群で共有するファイルサーバ上に作成」または「SPFをAPサーバ群でレプリケーション」すれば、セッション変数は使用可能になります。もっともこの場合、SPFの物理ファイル名を「APサーバ群全体でユニークにする工夫」が求められます。