セッションとは
計算機科学におけるセッションとは、ネットワーク接続において、2つ以上の通信機器間、またはコンピュータとユーザー間で行われる、半永久的な双方向の情報交換のことです。これは、会話や会議とも捉えられます。セッションは、ある時点で作成(確立)され、その後、破棄されます。確立されたセッションでは、各方向に1つ以上のメッセージを送信できます。
セッションは一般的にステートフル(状態を持つ)です。つまり、通信を円滑にするために、少なくとも一方の通信側でセッション履歴情報を保存する必要があります。これは、通信がリクエストと独立したレスポンスで構成されるステートレス(状態を持たない)通信とは対照的です。
セッションの確立は、コネクション指向通信を行う上での基本要件です。また、コネクションレス型の通信モードでデータを送信する際の基本ステップでもあります。ただし、一方向通信ではセッションは定義されません。
セッションの利用例
セッションは、
OSI参照モデルの
アプリケーション層、
セッション層、
トランスポート層のプロトコルやサービスの一部として実装されることがあります。
HTTPセッション: 各訪問者の情報を関連付けます。
telnet: リモートログインセッションを確立します。
SIP: インターネット電話の発呼を行います。
TCPセッション: TCP仮想回線や確立したTCPソケットを指します。
フォーマルな
セッション層がない場合(UDPなど)、あるいは
アプリケーション層のセッション期間が非常に短い場合(HTTPなど)は、セッションは交換されるデータ内で定義された方法を用いて上位のプログラムによって維持されます。例えば、ブラウザとリモートホスト間のHTTPデータ交換では、一意のセッションID、ユーザーの設定情報、権限レベルなどを識別するために、HTTPクッキーが利用されることがあります。
HTTPセッションの進化
HTTP/1.0では、1回のWeb/HTTPセッションにつき、リクエストとレスポンスを1つずつやり取りすることが想定されていました。しかし、HTTP/1.1でCGIが完成したことで、ウェブセッションの維持が容易になり、HTTPクッキーやファイルアップロードへの対応も可能になりました。
セッションとコネクション
多くのクライアントサーバーセッションは、
トランスポート層において、1セッションにつき1コネクションで維持されます。ただし、Web/HTTPでは、各トランザクションフェーズで異なるコネクションが作成されます。セッションを継続させるためには、セッションIDが必要になります。セッションIDは、動的なWebページのリンク内に埋め込み、CGIに返信できるようにします。CGIは、そのセッションIDを使うことでトランザクションフェーズ間もセッションを維持できます。1フェーズ1コネクションの利点として、低帯域の環境でもうまく機能することが挙げられます。
ソフトウェア実装
TCPセッションは一般的に、子プロセスやマルチスレッドを用いて実装されます。コンピュータがセッションを開始すると、新しいプロセスやスレッドが作成されます。一方、HTTPセッションは、各セッションの状態情報を
データベースで管理する方式が一般的です。マルチプロセスやマルチスレッドの利点は、各スレッドが独自の履歴と変数を持ち、ソフトウェアの複雑さを緩和できる点です。欠点としては、システムリソースのオーバーヘッドが大きいことや、システム再起動時にセッションが中断される可能性がある点が挙げられます。
サーバクラスタ環境でのセッション
クライアントがサーバクラスタ内のどのサーバにも接続する可能性がある場合、セッション状態を維持するための特別な対策が必要になります。セッションを維持するには、クライアントを同じサーバにルーティングするか、セッション情報を共有ファイルシステムや
データベースを通じてサーバ間で共有する必要があります。これらの対策をしないと、クライアントが別のサーバに再接続した際に、前回のセッション状態にアクセスできず、問題が発生する可能性があります。
サーバサイドセッション
サーバサイドセッションは、扱いやすく効率的ですが、負荷分散や高可用性システムが絡むと複雑になる場合があります。また、ストレージを持たない組み込みシステムでは利用できません。負荷分散の問題は、共有ストレージの使用や、クライアントごとにクラスタ内のサーバをペアリングすることで解決できますが、システムの効率性や負荷配分が損なわれる可能性があります。
クライアントサイドセッションでは、状態維持にクッキーと暗号化技術が利用されます。サーバにはそれほど大きなデータは保存されません。サーバは、動的なWebページを提供する際に、現在の状態データをクッキー形式でクライアントに送信します。クライアントは、クッキーをメモリやディスクに保存し、以降のリクエストでサーバに送り返します。サーバは、クッキーデータを使って特定のクライアントの状態を「思い出し」、適切なレスポンスを生成します。
クライアントサイドに保存されたデータは、改ざんに対して脆弱です。機密性と整合性が求められる状況では、以下の点を保証する必要があります。
機密性: サーバ以外はセッションデータを解釈できないこと。
データの整合性: サーバ以外はセッションデータを操作できないこと。
真正性: サーバ以外は有効なセッションを開始できないこと。
これを達成するために、サーバはデータを送信する前にセッションを暗号化する必要があります。また、第三者による改ざんは暗号技術によって防止すべきです。
クライアントサイドのセッションでは、クッキーのサイズが小さければ実用的ですが、本質的に、サーバのディスク容量が帯域に置き換わります。また、ブラウザにはクッキーの保存数やサイズに制限があります。効率を改善するために、サーバ側でデータを圧縮してからクッキーを作成し、クライアントからクッキーが返されたら解凍する方法も考えられます。
HTTPセッショントークン
セッショントークンは、現在の対話セッションを識別するためにサーバが生成し、クライアントに送信する一意の識別子です。クライアントは通常、トークンをHTTPクッキーとして保存したり、GET/POSTリクエストのパラメータとして送信します。セッショントークンを使うのは、クライアント側では識別子だけを扱えば済むようにするため、あるいはセッションデータを識別子と関連付けてサーバに保存するためです。プログラミング言語によるHTTPクッキーの命名例としては、JSESSIONID (JSP)、PHPSESSID (PHP)、CGISESSID (CGI)、ASPSESSIONID (ASP)などがあります。
セッション管理
ヒューマンマシンインタラクションにおけるセッション管理とは、コンピュータシステムとの対話セッション全体でユーザーの活動を追跡するプロセスです。デスクトップ環境では、開いているアプリケーションや文書を記録し、再ログイン時に同じ状態を復元します。Webサイトでは、ユーザーが一定時間操作しない場合に再ログインを求めたり、HTTPリクエスト間でサーバに情報を保存するためにセッション管理が使用されます。
デスクトップセッション管理
デスクトップセッションマネージャーは、デスクトップセッションの保存と復元を行うプログラムです。LinuxではXセッションマネージャ、Windowsではセッションマネージャサブシステム(smss.exe)がセッション管理を提供します。
ブラウザセッション管理
ブラウザでは、開いているページや設定を保存し、後日復元できます。また、システムクラッシュからの復旧を支援します。Google Chrome、Mozilla Firefox、Internet Explorer、OmniWeb、Operaなどがセッション管理に対応したブラウザの例です。
Webサーバセッション管理
HTTPはステートレスなプロトコルであるため、WebブラウザはHTTPリクエストごとにWebサーバへのTCPコネクションを確立する必要があります。セッション管理は、Web開発者がステートレスなHTTPをセッションに対応させるために使う技術です。例えば、一度認証されたら、次のリクエストで再度認証を求められるべきではありません。このためにHTTPクッキーやセッションIDが使用されます。
複数のWebサーバがセッション状態を共有する必要がある場合、セッション情報をクラスタノード間で共有する必要があります。共有方法としては、マスタノードへのマルチキャスト、分散共有メモリの使用、共有ファイルシステムへの保存、データベースへの保存などが考えられます。
セッション情報がトランザクションの否認不可性や監査の対象でない場合は、揮発性のデータとして扱えますが、監査対象の場合は、保存、複製、クラスタリングの方法を慎重に検討する必要があります。
SMSでのセッション管理
HTTPと同様に、SMSもステートレスなプロトコルです。初期のSMSは一方向通信だったため、セッション管理は不要でした。対話型の企業アプリケーションの開発にはセッション管理が必要ですが、SMSはステートレスなプロトコルであるため、初期の実装ではエンドユーザーがコマンドとサービス識別子を手動入力することでクライアントサイドで制御されていました。
参考文献
"How to Break Web Software: Functional and Security Testing of Web Applications and Web Services" by Mike Andrews and James A. Whittaker
関連項目
HTTPS
Representational State Transfer (REST)
セッションID
セッション化
セッション固定攻撃
セッションポイズニング
外部リンク
Session tracking methods
Sessions by Doug Lea