railsのsessionのあれこれからMongoDBのTTL collectionまで
session storage
railsのセッションはいつもどこに入れるか迷っていた。
それが、MongoDBのTTL collectionでどうにか解決されそうなので、そこまでのメモ。
1)クッキー
railsのセッションは、デフォルトで
なので、誰でも自分のは復号化すれば中身が見れる。
となると、誰でも書き換えれるのか?と思ってしまうが、
ハイフンより後ろがチェックサムで
セッションの内容毎にサーバーの鍵を使って変わる。
なので、気軽にセッション内部の値(例えばuser_id)を書き換えて送信する事はできない
クッキーの問題点
少なくともrailsで出来てる事はもろばれになるので言語FWの変な脆弱性つかれるかもしれないし、
内部の値が丸見えで開発者がうっかり内部の見せたくないid入れてて悪用されたり、
幾つかのクッキーから頑張れば解読されてuser_id変えてhijackしてきたり(そこまでは無いのかな?)
他、丸見えなので色々心配になる。
ちなみに、通信覗かれてcookie漏れは、いずれにせよcookieのsession_id見えちゃうので、
sessionをcookieにしようがしまいがどうしようもない。
幾つか見る限りなんだかんだで、クッキーのままにしてる人が多そう。
ただ、他言語であんまり見ないだけに不安に...
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に入れる人とちょこちょこ出てきてる。
redis
mongo
しかし、なんか、イマイチ、決め手にかける。
色々調べてMongoDBのcapped collectionでサイズ指定したらいいのではと思ったが、
それよりもっといいの見つけた。
MongoDBのTTL collection
mongodb2.2から出てきた機能
これでしょ。
指定の時間以上経つと自動で削除してくれる。
しかも、ちゃんとdisk断片化緩和まで考えてくれるそう。
sessionにぴったりだし公式ページにもそれに使えと書いてある。
mongoidで使うときは、事前に自分でindex作ればいけるみたい。
ちゃんと、mongodbでのsession_store作ってる人もいる。
これだろ。これだろ。
(気が向いたら)つづく...