Posted at

今さら聞けないセッションとCookie、ログイン・ログアウト(Rails編)

More than 3 years have passed since last update.

知識の補完を目的としてRails tutorialをちまちまやっている。

第8章 ログイン、ログアウトに差しかかったので、セッションとCookie、並びにログイン・ログアウト機能について自分用のまとめ。


セッション


HTTPはステートレスなプロトコルです。文字通り「ステート (state)」が「ない (less)」ので、HTTPのリクエストひとつひとつは、それより前のリクエストの情報をまったく利用できない、独立したトランザクションとして扱われます。HTTPは言ってみれば、リクエストが終わると何もかも忘れて次回最初からやり直す健忘症的なプロトコルであり、過去を捨てた旅から旅の流れ者的なプロトコルです (しかし、だからこそこのプロトコルは非常に頑丈なのです)。この本質的な特性のため、ブラウザのあるページから別のページに移動したときに、ユーザーのIDを保持しておく手段がHTTPプロトコル内「には」まったくありません。ユーザーログインの必要なWebアプリケーションでは、セッションと呼ばれる半永続的な接続をコンピュータ間 (ユーザーのパソコンのWebブラウザとRailsサーバーなど) に別途設定します。


セッションについてはまぁこれが全てで、要するにHTTPでは状態を記憶できないので、別レイヤーでそれを行いますよという話。

これをユーザーのログイン・ログアウトで考えると、一度ユーザーがログインやログアウトをしたはいいけど、ユーザーのログイン状態をHTTPでは記憶できないので、セッションでその情報を保持しましょうということ。

Railsでは基本的にsessionメソッドを使ってこの機能を実現する。sessionメソッドで作成されたセッションは自動で暗号化されるが、ブラウザを閉じると破棄される。


Cookie

そもそもCookieは、Webアプリがブラウザを通してクライアントにデータを保持させる機能のことで、要するにユーザー側に持たせている情報と思えばいい。クライアントが情報を持っているので、ブラウザを閉じても破棄されないし、暗号化しないと簡単に読み取られる。

これまたユーザーのログイン・ログアウトで考えると、ログイン情報をセッションのみで取り扱うと、ブラウザを閉じる度にログインしないといけなくなる。それはちょっとめんどくさいよねということで、Cookieにもログイン情報を持たせてしまい、ブラウザを閉じても状態が維持されるようにしよう。という使い方になる。「ログイン状態を保存する」みたいなチェックボックスがあるWebサービスでやってるアレだ。実際にはDBにもハッシュ化した情報を保存し、次回訪問時にCookieの内容と突き合わせてログイン状態を参照するという方法を取っている。

Railsではcookiesメソッドを使ってこの機能を実現する。


ログインとログアウトとログイン状態の記憶

以上の内容を踏まえると、ログインとは、セッションにuser_idを保存する処理のことであり、ログアウトとはセッションに保存されているuser_idを破棄する処理であるといえる。

また、ログイン状態の記憶とはCookieとDBにログイン情報を保存する処理のことであり、ログイン状態の破棄(つまりログアウト)とはCookieとDBに保存されているログイン情報を破棄する処理であるといえる。

login_logout.png


RailsにおけるセッションとCookieの関係

ここまでで終われば話は簡単なんだけど、Railsについての話をしようとすると、時たま話がこんがらがったりする。というのも、Railsはsessionメソッドでセッションを実現するとき、デフォルトではCookieを使用するからだ(他の言語もそうだと思うけど不勉強につき割愛)。つまり、「ブラウザを閉じると破棄されるようなCookie」という形で、暗号化されたセッション情報をクライアント側に保存する。この辺りの話はRailsのセッション管理方法についてがわかりやすかったのでそこを読んでもらえるといいと思う。セッションを扱うための他の方法についても書いてある。


雑感

概ね理解していた内容でも、こういった形でまとめるとなると難しいし、勉強になるなぁという感じ。

間違いの指摘等ありましたら是非ともよろしくお願いします。


参考文献

第8章 ログイン、ログアウト | Rails チュートリアル

Railsのセッション管理方法について - Programming log - Shindo200