ステートフルを実現する方法のひとつとして前回はクッキーの利用について見てきましたが、今回からはセッションを利用した方法について見ていきます。
クッキーの問題点
クッキーを利用すれば、Webページを遷移しても状態を引き継ぐような仕組み(ユーザーを特定できる仕組み)を実現できますが、ある問題が残ります。
クッキーはWebブラウザを通してクライアントのローカルディスクにファイルとして保存することになります。ローカルディスク上に保存される、そのファイルは簡単に探し出すことができ、実体はただのテキストファイルであるため、開けば中身を普通に参照できます。それはつまり、ユーザー名やパスワードも平文のまま保存されてしまうということです。
自分専用のPCであればまだしも、公共施設やカフェなど、不特定多数のユーザーが使用するPCは至る所に存在するので、クッキーを利用するということは、セキュリティ上、非常に危険な要素を含んでいるのです。
セッション管理
Webアプリケーションは、決まった順番で実行させなければならないものがほとんどです。(そのように決められた一連の処理のことをトランザクション処理と言います。)
ステートレスなプロトコルであるHTTPを使用する以上、トランザクション処理を行うためには、ユーザーを識別するための仕組みを作る必要があります。その仕組みはJavaでコーディングすれば作成可能ですが、ソースコードが長くなってしまいます。また、そのようなものは大抵のWebアプリケーションで共通して必要なものであり、毎回同じコードを書かなくてはいけません。
そこで考えだされたのが、そのような仕組みは、Webコンテナの機能として組み込んでしまおうという発想です。
セッションとは特定のクライアントとの通信接続状態を管理する情報のことです。Webコンテナはリクエストを送信してきたWebブラウザに対し、複数のユーザーを識別するためのネットワーク上で重複しないユニークな番号を割り振り、それをWebブラウザに渡します。(そのユニークな番号のことを「セッションID」と言います。)
セッションIDはクッキーを利用してユーザーのPC上に保存されます。以降、Webブラウザから送信されるHTTPリクエストにはクッキーによりセッションIDが埋め込まれ、そのHTTPリクエストを受信したWebコンテナは、セッションIDをキーにして、そのユーザーは前回と同一のユーザーであると判断します。
また、Webコンテナは各ユーザー(Webブラウザ)に対して専用のメモリー領域を用意します、そのメモリ領域のことを「セッションオブジェクト」と言います。セッションオブジェクトには、ユーザーとのやり取りで使用する任意のデータを保存してくおくことができます。
Webコンテナはサーブレットを呼び出すとき、サーブレットにそのユーザーのセッションオブジェクトを自動的に教えます。
このような仕組みにより、Webコンテナは、不特定多数のユーザーを見分けることができるのです。それをセッション管理と言います。
クッキーとの違い
クッキーとの決定的な違いは、クッキーはクライアントのPC上にデータを保存しておくのに対し、上記のWebコンテナによるセッション管理では、セッションID以外のデータはサーバー上に保存されるということです。