クッキーとセッション2
session[:user_id] = user.id
sessionはセッションオブジェクトを返すメソッド。 sessionオブジェクトはどこからでも参照でき、sessionオブジェクトに値がセットされていることがログインしていることの証明になる。
<body> <header> <h1>title-title</h1> <% if login? %> <%= link_to 'ログアウト', sessions_destroy_path, method: :delete %> <% else %> <%= link_to '新規登録', new_user_path %> <%= link_to 'ログイン', sessions_new_path %> <% end %> </header>
module SessionsHelper def login(user) if user session[:user_id] = user.id else redirect_to root_path end end def login? session[:user_id] end def logout session[:user_id] = nil end end
サーバー内にセッション情報を管理した領域を持つ(どこにあるのかわからないがセッションを持っている領域がある)。 セッションはハッシュのような構造をしているそうで、キーをセッションIDと呼び、値はさっき書いたuser.idになる。
Set-Cookieで、キーをブラウザに渡す。 ブラウザからCookieで送られてくるセッションID(キー)からセッション情報を検索し、一連のリクエストで共有するデータを取得する。
railsのセッションは複数のリクエストにまたいで維持される、ハッシュのような構造です。 セッションは生のcookieと違って、任意のオブジェクトを保持でききる。 サーバーにデータを格納する方法は、まず32桁の16進数のキーを作成する。このキーをセッションIDとよんでいる。 RailsはこのセッションIDをユーザーのブラウザにcookieとして保存する。以降アプリはリクエストを受け取った時、 このセッションIDを復元する。次にRailsは、セッションデータをセッションIDをインデックスとしてサーバー上に永続的に保存する。 Railsはリクエストを受けと取ると、セッションIDをっ使って、データストアを探し結果をコントローラのセッション属性に格納する。
セッションとクッキーは別物。 session[:user_id] と cookies[:remember_token] は別物。 ログインの実装だけなら、cookies[~]は不要で、session[:user_id]を使って実現できる。 次回ログインする時に、名前とパスワードの入力をパスしてログインさせたい時にcookies[:remember_token]を使って実現する。 ログインを実装するときに必ずcookies[~]を使うのだろうと思っていたが、違った。
https://teratail.com/questions/33522