まさ@ブログ書き込み中

自由に生きるための英語、プログラミング、考えごとについて色々書いています。

Railsセキュリティガイドの2.5(2章の第5節)「セッションストレージ」についてハマった

f:id:masaincebu:20180512214420j:plain

 

皆さんお久しぶりです、まさです。

今回から、ブログの更新頻度をどうにか増やしていこうと思っていますのでよろしくお願いします。

 

また、ブログの内容について僕に何か質問などがあればmasa.engine1959@gmail.comにメールを送ってください。出来る限り早く見ますー。

 

さて、僕は今年の4月に株式会社みんなのウェディングに新卒エンジニアとして入社しました。

www.wantedly.com

 

そこの研修の一環でRailsセキュリティガイドを読むことがあったのですが、その中で僕が「???」となってパニクった件について今回は書いていきたいと思っています。

 

それがセッションストレージです。

 

 

セッションストレージとは

文字通り、セッション情報を格納する場所のこと。正確には、セッションハッシュ(セッション情報をハッシュ化させたもの)を格納する場所のことです。

 

セッションとは何かについては以下の記事に過去の僕が書いています。

masa-world.hateblo.jp

 

さて、Railsセキュリティガイドによるとセッション情報はデフォルトではRailsのCookieStoreというストレージに入っているという風に説明されていました。そしてそれはクライアントのcookiesに入っているらしい。

 

Rails 2でCookieStoreという新しいデフォルトセッションストレージが導入されました。CookieStoreはセッションハッシュを直接クライアント側のcookieに保存します。

 

しかし、僕が研修時に渡されたサンプルアプリケーション、バイト時代のシステムではDeveloper toolで確認する限りセッションIDしかありませんでした。

 

f:id:masaincebu:20180512212122p:plain

 

そこで僕は「???」となったわけです。先に引用した部分に加えて、Railsセキュリティガイドでは以下のように説明しています。

 

Rails 2でCookieStoreという新しいデフォルトセッションストレージが導入されました。CookieStoreはセッションハッシュを直接クライアント側のcookieに保存します。サーバーはそのcookieからセッションハッシュを読み出すことで、セッションidを使用せずに済みます。

 

ここで僕は思いました。「いやいや、サンプルアプリケーションではめちゃめちゃセッションidを使ってますやん」と。

 

 

CookieStoreじゃなくて、ActiveRecordStore使ってたよ

まあそうこうして、色んなサイトを「Rails セッションストレージ」とかで調べると、やはりデフォルトのCookieStorage前提の、Developer toolでセッションIDではなくセッションハッシュが出てくるようなQiitaの記事とかがバンバンヒットするわけで。

 

Railsセキュリティガイドでは”Rails2”とか言ってたから今は違うんか?」とか「Developer toolではセッションハッシュは見えないようになっているんか?」とか色々迷子になっていたわけですが、我が社のエンジニアのトップの方に質問が出来る機会があったので聞いたところ

 

それ、セッションをCookieStoreに保管していないね」とのこと。

 

ファッ!?ってなってPCを渡し、いじっている様子を見ると・・・。

 

Rails.application.config.session_store :active_record_store, httponly: false 

 

という記述がconig/initializers/session_sotre.rbに!

この記述から予想できる通り、DB内にセッションIDをkeyにセッション情報がDBに保存されていたのでした・・・。

 

でも、session[:user_id]とアプリケーション側で書くだけで該当ユーザーのIDがわかるのって何でだろう?と考えると

  1. ブラウザから渡されるセッションIDからDBにアクセスしてセッション情報(ここで言うとユーザーID)を取り出している
  2. ブラウザから渡されるセッション情報の中にユーザーIDが入っていて、アプリケーション側でデコードしている

 しかないよな、と後から納得いったまさでした。

 

 

ちなみに

上の引用コードの中にある「httponly」ですが、これはRailsセキュリティガイドのXSSの説明の中にあるJavaScriptによる「Cookie窃盗」を防ぐためのものと考えられます。

 

こちらにある通り、Http Onlyであれば、JSからはCookieにはアクセス出来なくなっています。

httpOnlyなCookieとは? - それマグで!

 

Railsって凄いですなあ。色々考えられている。OSSの力を再確認しました。

 

また、Railsを勉強している皆さんはご存知の「Railsチュートリアル」のSample Applicationは、やっぱりCookieStoreを活用していました。皆さんもチュートリアルの中でセッションの保管の仕方について特段設定した記憶は無いかと思います。

 

f:id:masaincebu:20180512213832p:plain

 

ちなみに、セッションIDやセッションハッシュを晒しているのは、アプリケーションサーバーをローカルで起動する、自分用のものだからです。この記事を読んでいる皆さんはわかると思いますが、真似しないようにしてください。

 

 

最後に

僕はまだまだRailsエンジニアとして未熟ですが、新卒を終える頃には頼もしいRailsエンジニアになれるようにこれからのエンジニア研修も頑張っていきたいと思っています。

 

ブログの更新頻度も増やしていきたいと思っていますので、よかったら見てくださるよう、お願いします。ではまた。