lxyuma BLOG

開発関係のメモ

railsのsessionのあれこれからMongoDBのTTL collectionまで

session storage

railsのセッションはいつもどこに入れるか迷っていた。

それが、MongoDBのTTL collectionでどうにか解決されそうなので、そこまでのメモ。

1)クッキー

railsのセッションは、デフォルトで

クッキーにbase64エンコードされて全部入ってる。

なので、誰でも自分のは復号化すれば中身が見れる。

となると、誰でも書き換えれるのか?と思ってしまうが、

ハイフンより後ろがチェックサム

セッションの内容毎にサーバーの鍵を使って変わる。

なので、気軽にセッション内部の値(例えばuser_id)を書き換えて送信する事はできない

クッキーの問題点
  • 少なくともrailsで出来てる事はもろばれになるので言語FWの変な脆弱性つかれるかもしれないし、

  • 内部の値が丸見えで開発者がうっかり内部の見せたくないid入れてて悪用されたり、

  • 幾つかのクッキーから頑張れば解読されてuser_id変えてhijackしてきたり(そこまでは無いのかな?)

他、丸見えなので色々心配になる。

ちなみに、通信覗かれてcookie漏れは、いずれにせよcookieのsession_id見えちゃうので、

sessionをcookieにしようがしまいがどうしようもない。

幾つか見る限りなんだかんだで、クッキーのままにしてる人が多そう。

railsだし、railsに乗れ!と。余計な事で悩むなと。

ただ、他言語であんまり見ないだけに不安に...

2)RDBにしまう方法

そこで、RDBにsessionを入れる方法がある。

rails本体のconfigファイルにも、コメントで作り方まで書いてある。

これで、RDBにしまえる...が。

RDB問題
  • すぐにデータが肥大化する。

    • データでかいとバックアップも大変。
    • これだけのために水平分割したくない
    • disk逼迫も心配に...
  • ただ、セッションを消したら消したで、頻繁に大量のデータを消す事でディスク断片化が起きやすそう

    • size同じ追加なら、大丈夫...?本当に?

    • ちまちまデフラグとか面倒くさい。

3)memcached

そこで、よく、memcachedにsession入れる人達もいる。

インメモリで、早いし、断片化とか面倒臭い事がおきない

memcachedの問題

ただ、これだと途中でバタンとセッション切れる可能性が色々ある。

  • 再起動でセッション切れる

  • 全部の合計がmemcachedの確保しているサイズを超過した時に切れるとか

    • これも、oldなものから削除対象にするのか、大きいものから対象にするのか謎。どっちなのかな。

そもそも、mem「cache」d、キャッシュにセッション入れるのおかしい。

確か、開発元も、memcachedにセッション入れてないって、どっかで見たような。。。

4)nosql系

他に、redisに入れる人、mongodbに入れる人とちょこちょこ出てきてる。

しかし、なんか、イマイチ、決め手にかける。

色々調べてMongoDBのcapped collectionでサイズ指定したらいいのではと思ったが、

それよりもっといいの見つけた。

MongoDBのTTL collection

mongodb2.2から出てきた機能

TTL Collection

これでしょ。

指定の時間以上経つと自動で削除してくれる。

しかも、ちゃんとdisk断片化緩和まで考えてくれるそう。

sessionにぴったりだし公式ページにもそれに使えと書いてある。

mongoidで使うときは、事前に自分でindex作ればいけるみたい。

ちゃんと、mongodbでのsession_store作ってる人もいる。

これだろ。これだろ。

(気が向いたら)つづく...