セッション管理とCookieの働きについてあやふやだったのでまとめてみました
HTTP通信
- クライアントとサーバ間はHTTPというルールでやり取りをする
- クライアントからサーバに対して「リクエスト」が送られる
HTTPはステートレス
- ステートレス=記憶力がない
- たとえばyahooにアクセスするときには、クライアントからサーバへ「yahooの情報ちょうだい」とリクエストを送るが、その直後には送ったことすら覚えていない
- yahooの情報がレスポンスで送られてきて画面表示をしたとしても、送られてきたこと自体を覚えていない
- 要求しっぱなし。もらいっぱなし。
ステートレスだと、Webアプリでログインする時にどんな問題が発生するか
- ログインできても、ログインしたことすら覚えていない
- そのため、次にアクセスした時には、またログインしなければならない
- ショッピングサイトの場合、カートに入れた商品情報が保持されない
そこでCookieの登場
- CookieStoreを前提に書きます
- ログインできた時点で、サーバでユーザーのidをCookieに入れてクライアントへ送り返す
コード例:
session[:user_id] = user.id
こうすることで、暗号化されたuser_idがHTTPレスポンスヘッダのSet-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がクライアント〜サーバ間をグルグルと回ることになる