読者です 読者をやめる 読者になる 読者になる

江戸一番のジャスタウェイ職人のブログ

江戸一番のジャスタウェイ職人

セッション情報はサーバーサイドへ

Sinatraで`enable :sessions`するとセッションをシリアライズしてcookieに保存するという動作をしますが、

  1. 保存するデータが増えるにつれCookieヘッダーが肥大化しパフォーマンスが悪化
  2. シリアライズされて中身を見られてしまう

などの問題があり認証を伴うシステムなどで使うには向きません。

# 素の状態
enable :sessions

セッションの中身を暗号化するというアプローチもあるのですが、

# 暗号化
use Rack::Session::Cookie,
  :secret => Digest::SHA1.hexdigest(rand.to_s)

セッション情報本体をクライアントサイドに持たない構成が一般的です。

左端はオンメモリ、真ん中はMySQLRDBMS)やmemcached(KVS)にsessionを保存する一般的な構成で、Cookieにはセッション情報にアクセスする為のidだけ持ちます、idは推測されると情報漏洩する為ランダムな文字列が用いられます。

余談ですがJavaのWebアプリケーションサーバーはセッションをオンメモリで持つ構成が一般的です、これはこれでクラスタ構成を組む際にサーバーAとサーバーBでセッション情報を共有設定が必要だったり扱いに注意を必要とします。

話がそれましたが真ん中の構成、Sinatraでmemcached(KVS)にセッションを保存する構成に変えるのはとても簡単です。

require 'dalli'
require 'rack/session/dalli'
use Rack::Session::Dalli, :cache => Dalli::Client.new

`enable :sessions`をこの記述に変えるだけです。

dalliを初めて使う場合、bundleやgemからインストールが必要です。

$ gem install dalli

あと、サーバー側でmemcachedが動いていないと当然使えません。

CentOSでmemcachedを使えるようにするための手順例

# memcachedをインストールする
$ sudo yum install memcached

# 手動起動する
$ sudo /etc/init.d/memcached start

# 自動起動をonにする
$ sudo chkconfig memcached on

# 自動起動を確認する(サーバー再起動時自動的に起動)
$ sudo chkconfig memcached --list

Ubuntuの場合、apt-getあたりでmemcachedをインストールします。

chkconfigコマンドはUbuntuでもインストールされば使えます。