概要
勉強会でRailsガイドのセキュリティについて読み合わせをしました。
その中でセッションについての理解が曖昧だったので実際に確かめて記事を書いてみようと思い執筆しました。
簡単なアプリを作成し、セッションとは何者なのか?というのを確認していきたいと思います!
セッションとは?
- webブラウザとサーバーは、HTTPという決まりごとでやり取りをしています。HTTPには「ステートレス」という特徴があり、サーバーはリクエストを1つずつ独立したものとして扱います。前のリクエストのことは覚えていません。
- そのため、同じ人が続けてアクセスをしても、サーバーには「さっきの人」かどうかわかりません。
- しかし、この状態だとログインの状態を保ったりカートの中身を覚えておくことができないので画面遷移やリロードをするたびにログインやカートに入れ直さなくてはいけなくなります。
- そこで、サーバーはレスポンスと一緒にcookie(ブラウザに保存しておき、次のアクセスで自分を示すための小さなデータ)を渡し、ブラウザはそれを保存します。そして次に同じサーバーへリクエストを送る時に、ブラウザはそのcookieを自動で一緒に送ります。サーバーはcookieを見て、「さっきの人だ」と判断できます。
- このように、ステートレスなHTTPの上で、複数のリクエストをまたいで同じユーザーの状態を引き継ぐ仕組みをセッションと呼びます。
- Railsでは、コントローラーから
sessionというハッシュのようなオブジェクトを使うだけで、この仕組みを利用することができます。次のセクションで実際にアプリで動きを確認してみます!
実験:訪問回数を数えるアクションを作る
準備
- rails newで簡単なアプリを作ります
- 画面にアクセスするたびに「n回目です」と増えるシンプルなアプリです。
- コードとしては以下のようになっていて画面にアクセスするたびセッションが+1されるようにしています。
-
sessionはRailsが用意しているハッシュのようなオブジェクトでここに入れた値はRailsによって暗号化され、cookieとしてブラウザに保存がされます。def show session[:visit_count] = (session[:visit_count] || 0) + 1 @count = session[:visit_count] end - controllerで定義した
@countをview側で表示します<%= @count + "の訪問です"%>
確認1:リロードで回数が増える
確認2:cookieが暗号化されている
- 以下がcookieの値となります(開発者ツール => Applicationタブ => Cookies => の順序で見ることができます)。
- visit_countや2(訪問回数)という意味のある値はなく
--で区切られた意味の読めない文字列となっています
- こちらはアクセスするたびに値が変わるのでもう一度リロードするとまた値が変わります。
- みづらいかもですが、先ほどは先頭が
9ncという値から始まっていましたが、今回はF1Cから始まり異なる値になっていることが確認できます。
確認3:cookieを削除すると1回目に戻る。
- 訪問回数はサーバーではなく、ブラウザのcookieの中に保存されています。そのため、cookieを削除すると回数の情報もなくなります。
- 一度cookieを削除して
- もう一度リロードすると、1回目の訪問に戻りました。またcookieも付与されていることが確認できます。
まとめ
- 書籍とかで読んでなんとなく理解していたcookieだったりセッションですが、アプリを通して実際に体感してみることによってどのように生成されているのか・どのように使われているのかが理解することができました。
- Railsのデフォルト(CookieStore)では、セッションのデータは暗号化されてブラウザのcookieに保存されており、サーバー側は何も覚えていないことが分かりました。
- 今後はcookieを使った改ざんであったり攻撃の部分のRailsガイドが見れていないのでそちらを見ながら実際に実践して、攻撃手法も理解してセキュリティ対策に活かしていきたいと思いました!
- もっと他の記事も読んでみたい方
- 当社に興味がある方はこちら👀
- 当社のサービスに興味がある方はこちら👀
