LoginSignup
19
19

More than 5 years have passed since last update.

secret_token.rb/セッションという概念

Posted at

セッションについて

Railsのsecret_tokenの意味がよく分かってなかったので少し調べたことのメモ。まず「セッション」という概念について。

セッションとHTTPというステートレスなプロトコル上において、一連の通信、およびそれを実現するのに必要な「状態」を記憶しておく仕組みのことだ。もうちょっと噛み砕いてみる。

よくあるたとえだけど、以下のような流れを考える。

あるショッピングサイトにアクセスする。

ログインする

Aを買い物かごに入れる

Bを買い物かごに入れる

当然私たちの脳内文脈では、「ログインした後」に「商品をかごに入れてる」んだから何もおかしなことはないわけだけど、最初の方に書いた文章を思い出してもらうと、
HTTPというステートレスなプロトコル
とある。つまり、素のままだとログイン後に送る通信の上に「私は今ログインしていますよ」、という状態情報を乗せることはできないのだ。不便。
しかし実際のwebアプリケーションではちゃんとログアウトするまで「今ログイン中」という文脈、状態を保持してページ遷移してくれる。これを実現する仕組みをセッションという。

セッションの仕組み

webアプリケーションはセッションIDという仕組みでこれを実現した。全然難しいことは無くて、状態はサーバ側で管理して、その一つの一連のアクセスとの対応のためのIDを割り振ってしまうという方式だ。
そうすると、さっきの流れも、
あるショッピングサイトにアクセスする。

ログインする(セッション開始、IDが割り振られる)

Aを買い物かごに入れる(IDからこのセッションは「ログイン済み」であるという文脈が保たれている)

Bを買い物かごに入れる(以下同上)

となるわけだ。めでたい。
このセッションIDの受け渡し方法には幾つかパターンがある。
1. Cookieに乗せて渡す
2. URLに乗せて渡す
3. フォームデータに埋め込む
の三つだ。大体そのままなのでここは細い説明説明ははぶく。

セッションに関してのセキュリティ

攻撃

セッションハイジャック

分かりやすい名前の通り、セッションの乗っ取りのことを指す。さっき上げた例のように、セッションによって「ログインしている」という状態を管理する。よってセッション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/
の記事をだいぶ参考にさせていただきました。ありがたや。
間違いがあったら指摘お願いします。

19
19
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
19
19