5
6

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

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

Last updated at Posted at 2020-03-14

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

HTTP通信

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

HTTPはステートレス

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

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

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

そこでCookieの登場

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

コード例:

session[:user_id] = user.id

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

スクリーンショット 2020-03-18 15.31.22.png

  • クライアントはCookieを受け取り、ブラウザに保存する
    スクリーンショット 2020-03-18 15.31.58.png

  • 次にリクエストを送る時には、保存しているCookieをリクエストに含めて送る
    スクリーンショット 2020-03-18 15.33.07.png

  • リクエストで送られてきたCookieをサーバが受け取る
    スクリーンショット 2020-03-18 15.34.34.png

  • その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がクライアント〜サーバ間をグルグルと回ることになる
5
6
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
5
6

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?