Railsにおけるセッション管理とCookieについて


セッション管理とCookieの働きについてあやふやだったのでまとめてみました

HTTP通信

  • クライアントとサーバ間はHTTPというルールでやり取りをする
  • クライアントからサーバに対して「リクエスト」が送られる
    • リクエスト = 「要求」(このURLの情報ちょうだい、とか)
    • レスポンス = 「返答」(情報はこれだよ、とか)

HTTPはステートレス

  • ステートレス=記憶力がない
  • たとえばyahooにアクセスするときには、クライアントからサーバへ「yahooの情報ちょうだい」とリクエストを送るが、その直後には送ったことすら覚えていない
  • yahooの情報がレスポンスで送られてきて画面表示をしたとしても、送られてきたこと自体を覚えていない
  • 要求しっぱなし。もらいっぱなし。

ステートレスだと、Webアプリでログインする時にどんな問題が発生するか

  • ログインできても、ログインしたことすら覚えていない
  • そのため、次にアクセスした時には、またログインしなければならない
  • ショッピングサイトの場合、カートに入れた商品情報が保持されない

そこでCookieの登場

  • CookieStoreを前提に書きます
  • ログインできた時点で、サーバでユーザーのidをCookieに入れてクライアントへ送り返す

コード例:

session[:user_id] = user.id

こうすることで、暗号化されたuser_idがHTTPレスポンスヘッダのSet-Cookieフィールドに格納され、レスポンスとしてクライアントへ送り返される

  • クライアントはCookieを受け取り、ブラウザに保存する

  • 次にリクエストを送る時には、保存しているCookieをリクエストに含めて送る

  • リクエストで送られてきたCookieをサーバが受け取る

  • そのCookieから暗号化されたuser_idを復元・抽出し、そのidと合致するユーザをログイン状態として処理をする
    コード例:

@current_user ||= User.find_by(id: session[:user_id])
  • ログイン中は、user_idをCookieの中に含めたままクライアント〜サーバ間をグルグルと回っている状況
  • ログアウト時には、サーバにてCookieからuser_idを消去する

コード例:

session.delete(:user_id)

とか

session[:user_id] = nil

など。

  • user_idが除かれたCookieが、サーバからクライアントに渡る(user_idが存在しない=ログアウト状態)
  • ログアウト中は、user_idが除かれたCookieがクライアント〜サーバ間をグルグルと回ることになる