前回の「基礎のキソ、エブリバディ・セッション管理!」に続き、セッション管理の基本を解説します。宿題の解答編もありますので、クイズを解く感覚でぜひ皆さんも挑戦してみてください(編集部)
勉強会を終えたクウたち3人は、喫茶店で話をしていた。
ナツ 「そうそう、そんなこともあったねー」
ジュン 「うんうん。なつかしい〜」
クウ 「そうなんですかー」
ナツ 「私もジュンも結構そのアキって子にほとんど教わってたんだよね」
ジュン 「そうだねー。あの子、何でも知ってたよね。いいかげんなふりしつつ、かなり勉強家だったよね」
ナツ 「セッション変数の話のときもかなり教えてもらったよねー」
数年前……
アキ 「んー、もう。だから違うってー」
ジュン 「えー。だって、サーバ側で管理してるんだから安全じゃん」
アキ 「じゃあ、もう1回最初から説明するよ?」
ナツ 「うん。お願いしますっ」
アキ 「セッション変数っていうのはね……」
セッション管理を行っている場合、サーバ側でセッションIDに対して、何らかの状態を対応付けて管理することとなる。セッションID自体はランダムに発行された文字列でしかないため、その文字列が何を意味するのかを関連付ける必要が出てくる。セッション管理では、セッションにさまざまなパラメータを関連付けることができ、この関連付けを格納する領域を一般的に「セッション変数」と呼ぶ。
例えば、セッション管理で認証状態を管理する場合、認証が成功した時点でセッションIDとログイン中のユーザーを関連付けるために、セッション変数にログインIDを格納する、というような形となる。
セッション変数利用の概念は図1のようになるが、実際に格納される領域はセッション管理のメカニズムにより異なる。サーバ側に格納される形態としては、「ファイルに格納」「データベースに格納」「メモリ上に格納」などさまざまな方法がある(情報が漏えいしにくいよう揮発性のある格納形態が望ましいが、実装上困難となる場合も多い)。
具体的に実際のセッション変数の例を示そう。以下は、PerlのCGI::Sessionを利用した場合の例である。CGI::Sessionでは、セッションIDとして発行された文字列を用いたファイルを生成し、その中に各セッション変数を格納している。
ファイル名:cgisess_5b095834e5134f862555f0adcd209c34 $D = {_SESSION_ID => '5b095834e5134f862555f0adcd209c34',_SESSION_ETIME => 300,_SESSION_ATIME => 1229242041,page => 'change_confirm',login_id => 'demo',_SESSION_EXPIRE_LIST => {},_SESSION_REMOTE_ADDR => '127.0.0.1',_SESSION_CTIME => 1229242034};
ジュン 「うん。サーバ側で管理されてるから安心だね♪」
アキ 「……まじめに聞かないと説明やめるよー?」
ナツ 「あー。ごめんごめん。続けてー!」
アキ 「まあ、サーバ側で管理しているのはそうなんだけど、そもそもセッション変数に入る値はどこから来ているかってことだよね」
ジュン 「どこから来てるんだろうねー。神秘だね!」
アキ 「まだいうか……。これが重要なのは、『もともとはユーザーの入力』だってことがほとんどってとこだね」
ナツ 「ふむ……」
Copyright © ITmedia, Inc. All Rights Reserved.