sessionとは
Railsアプリケーションは、
ユーザーごとにセッションを設定
します。前のリクエストの情報を次のリクエストでも利用するためにセッションに少量のデータが保存
されます。セッションはコントローラとビューでのみ利用
できます。
アプリケーションはセッションを用いて、多くのユーザーがアプリケーションとやりとりできるようにしつつ、
各ユーザー固有のステートを維持
します。たとえばセッションを用いることで、ユーザーが認証されれば以後のリクエストでサインインしたまま
にできます。多くのアプリケーションでは、アプリケーションを操作するユーザーの
ステート(状態)を追跡
する必要があります。ショッピングサイトの買い物カゴや、現在ログインしているユーザーのidなどがこれに該当します。このようなユーザー固有のステートはセッションに保存できます。Railsは、アプリケーションにアクセスする
ユーザーごとにセッションオブジェクトを1つ提供
します。ユーザーが既にアプリケーションを利用中であれば、Railsは既存のセッションを読み込み、そうでない場合は新しいセッションを作成します。
自動的にcookieを使えるようにしているのか。
どのようにsessionが管理されているのか?
どこに保存されているのか?
sessionはコントローラとビューでどう使われていたか?
セッションにはIDで管理されている
あらゆるセッションは、cookieを利用してセッション固有のIDを保存
します(cookieは必ず使うこと: セッションIDをURLで渡すとセキュリティが低下するため、この方法はRailsで許可されません)。ほとんどのセッションストアでは、サーバー上の
セッションデータ(データベーステーブルなど)を検索するときにこのID
を使います。
セッション一つ一つにIDが自動で振り分けられているのか。
sessionの保存場所
CookieStoreは、
Railsで推奨されているデフォルトのセッションストア
であり、例外的にすべてのセッションデータをcookie自身に保存します(必要に応じてセッションIDも利用可能です)。CookieStoreには非常に軽量
であるというメリットがあり、新規Webアプリケーションでセッションを利用するための準備も不要
です。このcookieデータは改ざん防止のために暗号署名が追加されており、cookie自身も暗号化
されているので、他人が読むことはできません(改ざんされたcookieはRailsに拒否されます)。
知らない間にCookieを使っていたことに気が付かなかった。
試しにリクエストを見てみるとCookieヘッダーがあり、値も暗号化されていた。
セッションストアの種類
ActionDispatch::Session::CookieStore
すべてをクライアント側に保存する- ActionDispatch::Session::CacheStore: データをRailsのキャッシュに保存する
- ActionDispatch::Session::MemCacheStore データをmemcachedクラスタに保存する(この実装は古いのでCacheStoreをご検討ください)
- ActionDispatch::Session::ActiveRecordStore: Active Recordデータベースに保存する(activerecord-session_store gemが必要)
- 独自のストアや、サードパーティgemが提供するストア