[初心者向け]ウェブサービスでほぼ必須のセッション管理について説明してみる

今回ウェブサービスを作る上では必須である、セッション管理についてまとめてみたいと思います。

はじめに

まずはじめに「セッション」とは、ウェブサイトにアクセス(ログイン)してからの一連の操作を指します。
なぜウェブサービスにセッション管理が必要かというと、
“通信を行うためのプロトコルであるhttpがステートレスなプロトコル”であるためです。
ステートレスとは、その名の通り”状態”が”ない”ことです。
例えばあるhttp通信で何をしたかを他のhttp通信(たとえそれが同一ユーザからのものであっても)が知るよしがないということである。
つまり、ある特定のユーザのウェブサイトでの一連の操作がステートレスなプロトコルでは追えないということです。

なぜそれが問題なのか

ある特定のユーザのウェブサイトでの一連の操作がわからないと何が問題なのでしょうか。
例えば、ショッピングサイトを考えて見れば一目瞭然です。
ショッピングサイトでは「商品を選択する」→「商品の総額をお金を支払う」という流れがあると思いますが、この流れはあくまで特定のユーザによるものです。
ユーザAが選んだ商品はユーザAが支払う必要があるのでショッピングサイトはユーザを識別する必要がありますが、http通信はそれぞれが単独な通信であるがために、一連の操作を記憶する術がないために、セッションという仕組み(httpとは全く別のレイヤー)を用意し、あたかもステートフルのように振舞いをさせる必要がある、ということです。

どのような仕組みでセッションを管理するのか

セッションの管理がどう実現されているかというと、最もポピュラーは方法は、ユーザを識別するためのセッションIDをウェブサーバ側で発行し、発行したセッションIDをユーザのブラウザのクッキーに保存するという方法です。
クッキーとはWebサーバ側が唯一クライアント側にデータを保存したり、削除したりできる領域。この領域にユーザ固有の情報を保存し、そのクッキーに保存された情報を参照することで、Webサーバ側はユーザを識別することができます。

Railsだとsessionメソッド

セッションの概要、仕組みを抑えたところで、続いてRailsのsessionメソッドを見てみます。
railsでセッション管理を行うはsessionメソッドを用います。
railsのデフォルトの設定(設定ファイルをいじることで他のやり方に変更することができる)ではsessionメソッドを使用することで”ブラウザのクッキー”に値を設定することができます。
ただし、クッキーに保存するデータは、上の説明したセッションIDではなくデータそのものを保存します。

一般的にこの方式は「セッション管理をクッキーを利用して実現する」方法として知られていますが、混乱を招きやすい表現であります。
なぜなら、最もポピュラーな方法である「セッションIDを発行してセッション管理する方法」も、セッションIDをクッキーに保存しているからです。
この二つの本質的な違いは、「維持したいデータそのものをクライアントのクッキーに保存」するか「セッションIDを発行してIDをクライアントのクッキーに保存し、本当に維持したいデータをサーバ側にIDと紐付ける形で保存」しておくかにあります。
この違いはかなり混乱しやすいので、しっかり押さえておきましょう。

この違いを抑えたところで、もう一度railsのセッション管理に話を戻します。
railsではデフォルトでは前者の方法によってセッションを管理します。
例えば以下のようなコード
session[:user_id] = user.id
が実行されると、セッション(クッキー)にuser.idの値を保存できます。これがウェブサービスでいうログイン処理です。
ただし、セッション(クッキー)にuser.idを保存するときには暗号化をしているためクッキーを覗いても、その値はわからないようになっています。

しかし、この方法には大きな問題があります。
それは、クライアントにデータを保存する性質上、サーバ側の好きなタイミングでセッションを破棄できなくなることです。
例えば、ログイン処理でセッション(クッキー)にユーザ情報を保存するので
ログアウト処理ではそのセッション(クッキー)を削除する必要があります。
実際のログアウト処理では
session[:user_id] = nil
を実行することで、セッション(クッキー)を破棄し、以降ログイン状態が続かないようにしますが、
クライアント側の領域であるクッキーはユーザが自由に読み書き可能です。
よって、ログインして保存されたクッキーをコピーしておいて、ログアウト後(クッキー削除された後)に再度クッキーに設置された場合、サーバ側ではこれを判別することはできません。よってログイン状態が続いてしまいます。
よって、実際にセッション管理する時はデフォルトのこの設定を変えて、他の方法を用いるが多いです。

※「セッション(クッキー)」と書いたのは訳があって何度も言いますがセッションと言いつつデータはすべてクッキーに保存(railsデフォルト)しているから。

デフォルトの設定を変えるには

railsではセッション管理の方法としてクッキーを用いる方法を強く推奨しているため、その他の方法でセッション管理をしようと思えば、標準のパッケージではできなくて、gemを導入する必要があります。(外部gem化しているので使いたい場合別途導入して使ってくださいっていうのがrails側のスタンス)
具体的は手順は割愛しますが、
・セッションIDとデータをsessionsテーブルに保存する
・セッションIDとデータをrailsのメモリに保存する
などの方法があり、作るウェブサービスに応じて選択すると良いでしょう。

まとめ

一番伝えたかったのはセッションを管理する方法の一つにブラウザのクッキーを使う方法があり、その他にもサーバ側やメモリに保存する方法がありますが、いずれの方法も実はブラウザのクッキーは使っているということです。重要な違いはデータそのものもクッキーに保存されているのかサーバ側に保存しているのかという点です。
これさえ理解すれば、他の記事やドキュメントがすんなり理解できるようになるでしょう。

スポンサーリンク
スポンサーリンク
スポンサーリンク

シェアする

  • このエントリーをはてなブックマークに追加

フォローする

スポンサーリンク
スポンサーリンク