2015年2月4日水曜日

fuelphpでsessionの保存先をDBに変更する的なお話

  • このエントリーをはてなブックマークに追加

fuelphpでSession::set("hoge","hogehoge")みたいな形でセッションを保存出来る。
これは中々に便利でSession::set_flash("hoge","hogehoge")みたいな形でやると、
次のページでしかそのセッション値を取得出来ないといったことが出来る。

というのはまぁ置いといてこのSessionクラスだけど初期の保存先はCookieになってしまっている。
Cookieだとブラウザに保存されるからセキュアではないとかっていう形になってしまう。
ということで今日はSessionの保存先をDBにしてセキュアにしてみる的なみたいな。

CREATE TABLE IF NOT EXISTS `sessions` (
  `session_id` varchar(40) NOT NULL,
  `previous_id` varchar(40) NOT NULL,
  `user_agent` text NOT NULL,
  `ip_hash` char(32) NOT NULL DEFAULT '',
  `created` int(10) unsigned NOT NULL DEFAULT '0',
  `updated` int(10) unsigned NOT NULL DEFAULT '0',
  `payload` longtext NOT NULL,
  PRIMARY KEY (`session_id`),
  UNIQUE KEY `PREVIOUS` (`previous_id`)
) ENGINE=INNODB DEFAULT CHARSET=utf8;
まずはこちらでDB内にテーブルを作成。
APPPATH."/config/session.php"

return array(
  'driver' => 'db',
  'db' => array(
    'cookie_name'  =>  'fueldid',
    'database'  =>  null,
    'table'  =>  'sessions',
    'gc_probability'  =>  5
  )
)
ってな感じでconfig/session.phpを変更してあげればいい。
これだけで特にソースを変更することなく、DB内にsession情報が格納されていく。
ちなみにDBの接続情報はconfig/db.phpでの現在の環境のものが読み込まれるので、特に気にする必要なし。
ちなみにsessionをDBにするのはセキュアにするためっていうのもあるし、
冗長化構成をした際にちゃんとセッションを維持するためでもある。

普通のよくある$_SESSIONはサーバー内のローカルにファイルを作成し、そこから取ってくる形になっている。
なのでELB使って冗長化構成されている場合だと、サーバAでセッション処理をしても、サーバBに振られたらセッション処理をしていないってことになってしまう。
となると色々と不便だったり、特にログイン処理とか出来なくなってしまったり。
もちろんCookieで行うのであれば実はそこらへんは大丈夫なんだけど、
さっきも述べた通りセキュリティ的にあれなのでっていう。

ほんとはがんばってdynamoDBで出来ないかとか考えたんだけど無理だった。
あとelasticacheを使うっていう手もあるんだけど、これはこれでお金も余計にかかってしまうし。
けどDBを活用することでなんとかなるなぁと思って今回のような感じになった的な。

とりあえず普通のWebアプリって大体MySQLでDB組むわけだし、
そう考えるとfuelphpのセッション情報をDB内に入れるっていうのは節約出来る感じでいいんじゃないかと。

Adsense