セッション / クッキー

認証機能とは?

認証機能とは、ユーザの情報を検証して、システムへのログインやユーザの有効性確認を行うための機能です。

そしてこの認証機能の中でも、特に使用頻度が高いのが、ログイン機能でしょう。 では、ユーザーがログインしている / していないを、システム的にはどのように判定しているのでしょうか。 これには、セッションと呼ばれる仕組みを利用しています。

セッションとは?

セッションとは、Webサイトにアクセスして行う一連の行動のことを指し、ページを跨いで情報を保持したい場合に利用される機能です。

webページ閲覧時に用いられるプロトコルHTTPプロトコルと呼ぶのですが、このHTTPプロトコルは、以前の通信を記憶しておく術を持ち合わせていません。(これを、ステートレスプロトコル と呼んだりします。) つまり、ログイン後、次のページを見たいという通信を行う際には、このHTTPプロトコルは、ユーザーがログインしていることを忘れてしまっているのです。

そこで、セッションの出番です。 セッションは、ページを遷移しても変わらず情報を保持することができるため、このセッションにログイン中のユーザーの情報を格納しておくことによって、ページを遷移しても、変わらずログイン状態を維持し続けることができるのです。

プロトコルとは、コンピューター同士が通信をする際の手順や規約などの約束事のことを指します。

webアプリケーションでは、アプリケーションサーバー側にセッションという仕組みを用意しており、1つのブラウザから連続して送られる一連のリクエスト間で状態を共有できます。セッションの情報はRails標準では、ブラウザ側のクッキーに保存されます。また、sessionは明示的に削除する(又は有効期限切れになる)まで消えません。

Railsアプリケーションにはユーザーごとにセッションが設定されます。前のリクエストの情報を次のリクエストでも利用するためにセッションに少量のデータが保存されます。あらゆるセッションは、暗号化されたセッション固有のID(セッションID)をcookieに保存します。Railsでセキュリティ上の理由からセッションIDをURLで渡すことは許可されていません。そのため、セッションIDは必ずcookieで渡すようにしているのです。

Action Controller の概要 - Railsガイド

cookieとは?

ブラウザとwebサーバー間でやりとりされる時に使われる仕組みです。cookieでは、webサーバーからブラウザへHTTPレスポンスを返す際に、何らかのcookie情報を含めて送ります。cookie情報はキーと値(value)のペアの集合です。ブラウザはこのcookieの情報をサーバーのドメインなどの情報に紐付けて保存し、次回以降、同じドメインのサーバーへのHTTPリクエスト時に、ブラウザで保管しておいたcookie情報をリクエストに添えて送ります。 そうすることにより、webサーバーはどのブラウザからのリクエストかを識別することが出来るのです。つまり、cookieは複数のリクエストの間で共有したい状態をブラウザ側に保存する仕組みです。

  • クッキーは平文

  • セッションIDは暗号化されたもの

f:id:Trial_and_error:20211016124525p:plain

基礎知識 Cookieの仕組み

Railsの場合、config/initializer/session_store.rbにて、セッション情報をどこに保存するのかが指定されています。デフォルトでは、

# セッション情報をどこに保存するのかを設定
# _○○_sessionというkeyで、cookieを用いてセッション情報を管理する
Rails.application.config.session_store :cookie_store, key: '_○○_session'

という設定がなされています。

cookieとは、webブラウザが保持する情報のことです。webでは毎回ページを読み込む度にブラウザとサーバーとの間で通信がなされており、このcookieもリクエスト、レスポンスの度に毎回やりとりがなされます。

つまり、セッション情報の保存先をcookieにするということは、

  1. ログイン時に、ユニークなセッション情報を発行
  2. それをサーバ : ブラウザ間の通信の度に、cookie内でやりとり
  3. cookieを受け取ったサーバは、cookie内のセッション情報を元に今リクエストを送ってきているユーザがログイン中か否かを判定

という流れを経ているのです。 但し、cookieに全てのセッション情報が載ってしまうということは、比較的簡単にセッション情報を確認できてしまうことも意味します。

Railsのセッション管理方法について

Rails セキュリティガイド - Railsガイド

Rails4系からはcookieに載るセッション情報が暗号化されたとは言え、秘密鍵を知っていれば誰でもログイン情報を復元できてしまう恐れがあるのです。ですので、よりセキュリティを強固にしたい場合、このセッションの管理先をredisなどのKVSデータベースに指定したりなどの方法を取る場合もあります。

今回はsorceryは上記で説明した、ログインに必要なことをほぼ自動的にやってくれます。

↓sessionの保存先をcookieからKVSに変更する理由

セッションを保存するとき、なぜ、Cookieではなくmemcachedやredisを使用するのでしょうか?

※KVSとは、キーバリューストア(Kye-Value Store)の略で、保存項目がkeyとvalueのみのDBのことを指します。

参照

Action Controller の概要 - Railsガイド

基礎知識 Cookieの仕組み

Rails セキュリティガイド - Railsガイド

セッションを保存するとき、なぜ、Cookieではなくmemcachedやredisを使用するのでしょうか?