Rails でのセッション

昨日発見したOpenIDの実装を見ていたところ、OpenIDで認証したあとには @session[:user_id] に認証した順番が数字(番号)として保存されており、その user_id から MySQL の users テーブルにuser_id に対する OpenID のURLが保存されていて、OpenID の URL を知りたいときには毎回 MySQLサーバに問い合わせる形になる。 んで、@sessionで出てくるセッションってなんぞやとか思って、また Rails のなかをひっくり返してみていたと。 セッションは Rubyの cgi ライブラリに装備されている CGI::Session をつかっており、ブラウザごとにユニークなIDを振って、そのIDごとに key=value なデータができるようになっている。 ブラウザへのユニークなIDの保存の部分までコードを追いきれなかったので推測になりますが、たぶんCookie使っているのでしょう。 セッションの中身 (key=value の部分) については、ローカルのファイルシステムに保存するようになっていた。 つまり、Webサーバを複数台置いて負荷分散するときには、あるWebサーバが受けたリクエストのときに設定したセッションに対する値が、別のWebサーバがリクエスト受けたときには、なんらかの共有などを行わない限り参照できない。 セッションの中身を共有するには、ディスク共有とかわけわからんことせなアカンと。 共有なディスクなんか置いてしまった日には、大量のユーザが利用したときややページビューを受けたときにはそこがボトルネックになってしまうことがあるので、何らかの形でデータの分散保存ができなければならないのです。 分散保存できるシステムって、がんばればできるのですが、そんなに頑張りたくないのが本音。


方向性としては、OpenIDで認証受けた内容を、WebブラウザのCookieに焼いちゃえばいいのでは、と。 んでクッキー焼くときに署名的なものを入れてデータの改竄を検出できるようにしておくと。 そうすれば認証したユーザ名を入れても安心だろうなぁ。


ただ今回は、この認証部分とか、これのスケーラビリティーの話をつめたいわけじゃないので、この課題は気が向いたら対応します。

コメント

このブログの人気の投稿

パスワードを覚えるのも無理があるから、パスワードマネージャ使いましょう。

大型特殊自動車免許を取った時の話。

車両系建設機械運転者(整地) の講習