【rails】sessionでログイン情報を管理したい
railsでログイン/ログアウトの機能を作ろうとしたところ素朴な疑問にぶつかりました。
- ログイン/ログアウトの情報ってどこに保存するの?
ログイン情報っていちいちサーバー上に保存/削除して管理するほどのものでもないよなーと不思議に思いまして。
そこでいろいろ調べていたところ、やたらと「セッション(session)」という単語を見かけたので簡単にまとめてみました。
(だいたい引用です。)
セッションとは
そもそもセッションってなんやねん、ということでこちらを。
HTTPはステートレスなプロトコルです。文字通り「ステート (state)」が「ない (less)」ので、HTTPのリクエストひとつひとつは、それより前のリクエストの情報をまったく利用できない、独立したトランザクションとして扱われます。HTTPは言ってみれば、リクエストが終わると何もかも忘れて次回最初からやり直す健忘症的なプロトコルであり、過去を捨てた旅から旅の流れ者的なプロトコルです (しかし、だからこそこのプロトコルは非常に頑丈なのです)。この本質的な特性のため、ブラウザのあるページから別のページに移動したときに、ユーザーのIDを保持しておく手段がHTTPプロトコル内「には」まったくありません。ユーザーログインの必要なWebアプリケーションでは、セッションと呼ばれる半永続的な接続をコンピュータ間 (ユーザーのパソコンのWebブラウザとRailsサーバーなど) に別途設定します。
セッションについてはまぁこれが全てで、要するにHTTPでは状態を記憶できないので、別レイヤーでそれを行いますよという話。 これをユーザーのログイン・ログアウトで考えると、一度ユーザーがログインやログアウトをしたはいいけど、ユーザーのログイン状態をHTTPでは記憶できないので、セッションでその情報を保持しましょうということ。 Railsでは基本的にsessionメソッドを使ってこの機能を実現する。sessionメソッドで作成されたセッションは自動で暗号化されるが、ブラウザを閉じると破棄される。
なるほど。どうやら状態(ステータス)を保持できないHTTPさんの代わりにセッションさんがステータスを記憶しておいてくれる、ということらしいです。
具体的な動き
セッションという言葉について大まかに理解できたところで次に湧いてくるのは具体的なプログラム上での疑問。
- どこにどういう形で記憶されるの?
- 記憶されたステータスにはどうやってアクセスするの?
ひとつずつ見ていきます。
1. どこにどういう形で記憶されるの?
結論としてはWebブラウザ上のcookieに保存されるようです。1
cookieについてはこちら。
クッキーとはサーバーから送られてくる会員証のようなもので、次にそのページにアクセスするときにサーバーに「私はこの会員IDですよ」と見せる。それにより、一人ひとりに違う内容のページを表示させたり、前訪れたときの続きとして訪問者に対応したりできる。
要はサーバー側ではなく、WebページにアクセスしているPC側のブラウザにcookieとして情報を保存するんですね。
2. 記憶されたステータスにはどうやってアクセスするの?
続いてrailsにおけるセッションへのアクセス方法。
railsではsession
というハッシュが用意されているので、そこに任意のキーに対して値を格納するだけでOKなようです。
session[キー] = 値
実際にログイン/ログアウトを管理する場面を想定した具体的な使い方は以下のようになります。
class LoginsController < ApplicationController def create session[:login_id] = user.id end def destroy session.delete(:login_id) end end
ここではLoginsController
のcreate
アクションでログインを、destroy
アクションでログアウトを管理しています。session
の:login_id
キーでuser.id
をそれぞれ保存・削除しています。
コントローラー名は任意なので管理しやすい名前のコントローラーを作成しましょう。
(※上記はセッションでステータスを管理することを簡潔に示した例なので、実際のシステムに組み込む場合にはバリデーションなどを必要とする場合が多くなることに気をつけてください。)
まとめ
ざっとこんな感じです。
今回書いたのは本当に簡潔なさわりの部分だけでセッションもまだまだ奥が深いようですので、気になる方は色々と調べてみてください。
注意事項
ページ最下段の注釈にも書いていますがセッションをcookieで管理するのはセッション管理方法の一つにすぎないみたいです。railsのセッションが必ずしもcookieで管理されているとは限らないので注意してください。
どんな管理方法が最適なのかは様々な議論があるようなので、調べてみると面白いかもしれませんね。
下記の記事なども参考にしてみてください。