#セッションについて
Railsのsecret_tokenの意味がよく分かってなかったので少し調べたことのメモ。まず「セッション」という概念について。
セッションとHTTPというステートレスなプロトコル上において、一連の通信、およびそれを実現するのに必要な「状態」を記憶しておく仕組みのことだ。もうちょっと噛み砕いてみる。
よくあるたとえだけど、以下のような流れを考える。
あるショッピングサイトにアクセスする。
↓
ログインする
↓
Aを買い物かごに入れる
↓
Bを買い物かごに入れる
当然私たちの脳内文脈では、「ログインした後」に「商品をかごに入れてる」んだから何もおかしなことはないわけだけど、最初の方に書いた文章を思い出してもらうと、
HTTPというステートレスなプロトコル
とある。つまり、素のままだとログイン後に送る通信の上に「私は今ログインしていますよ」、という状態情報を乗せることはできないのだ。不便。
しかし実際のwebアプリケーションではちゃんとログアウトするまで「今ログイン中」という文脈、状態を保持してページ遷移してくれる。これを実現する仕組みをセッションという。
#セッションの仕組み
webアプリケーションはセッションIDという仕組みでこれを実現した。全然難しいことは無くて、状態はサーバ側で管理して、その一つの一連のアクセスとの対応のためのIDを割り振ってしまうという方式だ。
そうすると、さっきの流れも、
あるショッピングサイトにアクセスする。
↓
ログインする(セッション開始、IDが割り振られる)
↓
Aを買い物かごに入れる(IDからこのセッションは「ログイン済み」であるという文脈が保たれている)
↓
Bを買い物かごに入れる(以下同上)
となるわけだ。めでたい。
このセッションIDの受け渡し方法には幾つかパターンがある。
- Cookieに乗せて渡す
- URLに乗せて渡す
- フォームデータに埋め込む
の三つだ。大体そのままなのでここは細い説明説明ははぶく。
#セッションに関してのセキュリティ
##攻撃
###セッションハイジャック
分かりやすい名前の通り、セッションの乗っ取りのことを指す。さっき上げた例のように、セッションによって「ログインしている」という状態を管理する。よってセッションIDがばれたらパスワードとか関係なく、「ログイン状態」が盗まれる。こわい。
###セッション・フィクゼーション
これはちょっとだけややこしい。まず、対象のwebアプリケーションから発行されうるセッションIDを取得する。次にそのセッションIDを適当な人間のクッキーとかにセットする(適当なページを踏ませるとかする)。そして、その人にwebアプリケーションにログインしてもらう。そうすることによってそのセッションIDがログイン状態と紐づけられる。よってログインされる。一言で言うとユーザーに自分のセッションIDでログインしてもらう、ということだ。
###CSRF
これはセッションが張られているユーザーにスクリプトを読み込んでもらって、色々変なことをする。
##サーバー側の対策
###セッションIDをわかりにくくする
当然だが、割れたら終わりなので、まずこういう対策がある。基本的に乱数になるらしい。
これがsecret_token.rbと関係してくる。
###その他の対策
本題からはちょっとだけ外れるので、
http://itpro.nikkeibp.co.jp/article/COLUMN/20081010/316688/?ST=selfup&P=1
を参照されたし。
#ようやく本題
このセッションIDを暗号化するのに使用されるのが、
config/initializers/secret_token.rb
である。ここに書かれてる乱数を種にしてセッションIDが生成されるので、ばれないように.gitignoreしておきましょうね、という話であった。本題短すぎる……
#おわり
セッション関連の知識がついてよかった。なお、
http://itpro.nikkeibp.co.jp/article/COLUMN/20081010/316684/
の記事をだいぶ参考にさせていただきました。ありがたや。
間違いがあったら指摘お願いします。