前回の記事でHTTPSサーバを構築したことにより、通信経路を暗号化することができるようになりました。
これを前提に、今回からGoによるセッション管理機構を実装していきたいと思います。
セッション管理機構の実装は、これまでの記事で扱ってきた内容と比べるとかなり複雑な内容になってきます。
今回は、セッション管理に必要な前提知識を簡単に共有し、どのように実装するかの設計を考えていきましょう。
Contents
セッション管理の目的
まずもっとも基本的な前提として、セッション管理がなぜ必要であるか、何を目的として行われるかを抑えておきましょう。
セッションの語義は、Webサイトにアクセスして行う一連の操作や行動であるとされています。
セッション管理がなぜ必要になるかと言えば、WEB通信に使用されるHTTPがステートレス(状態を保持しない)なプロトコルであるためです。
すなわち、本来であれば同じクライアントから同じリクエストが送信された場合、必ず同じレスポンスが返されることになります。
つまり、セッション=WEBサイトにおける一連の操作をサーバサイドで認識することは、HTTPというプロトコルの機能だけでは実現できない、ということになります。
もっとも簡単な例として、会員制のサイトなどではクライアントのログイン状態を識別するする必要があります。
同じページに対するリクエストでも、未ログインのクライアントとログイン済みのクライアントであれば、異なる内容を表示しなければなりません。
つまり、「ログイン済みの状態であるか」という状態は、セッションごとに管理される必要があります。
Cookie等の機能を用いてクライアントを識別し、WEBサイト上におけるクライアントの状態にかかわる情報をリクエスト間で保持することが、セッション管理の根本的な目的と言えます。
セッションの作成過程
セッションの基本原理は、各セッションごとの情報をサーバサイドで保持することにあります。
クライアントとサーバはグローバルかつユニークなIDによって紐づけられ、このIDをクライアントがリクエストすることで、サーバに保存されたセッション情報へのアクセスを可能にします。
したがって、サーバサイドにおけるセッション生成の過程を簡潔に表せば、以下の3ステップに分割することができます。
- グローバルかつユニークなセッションIDを生成する
- セッション情報を保存する領域を確保する
- セッションIDをクライアントに送信する
セッション管理機構の設計
セッション管理をどのように実現するかを考えるにあたり、まずはセッション管理機構に必要な機能を洗い出す必要があります。
個別のセッションと、複数のセッションを並行して管理するためのセッションマネージャに分けて考えてみましょう。
個別のセッションに必要な実装
個別のセッションに要求される機能はシンプルなものです。
セッション間の管理はセッションマネージャに任せることができるので、独立したセッションに必要な機能のみを考えれば良いことになります。
具体的には、以下の機能が備わっていれば必要充分と言えるでしょう。
- セッションの構造定義
- セッションのインスタンス化
- セッション変数の取り扱い
セッションマネージャに必要な実装
続いてセッションマネージャには、以下のような機能が要求されます。
- セッションマネージャの構造定義
- ユニークなセッションIDの発行
- クライアント情報とセッション情報の関連付け
- セッションの生成・保存・破棄
まず、各クライアントの識別に用いられるセッションIDは、完全にグローバルでユニークである必要があり、重複は許されません。
従って、IDの発行は個別のセッションではなくセッションマネージャに委ねられるべき機能です。
IDが完全にユニークであることを、セッションマネージャが保証しなければなりません。
また、セッションがクライアント毎のデータ保持という目的を果たすためには、クライアントから送信されるリクエストからセッションIDを抽出し、サーバに保存されたセッション情報と紐づける必要があります。
このID管理もまた、セッションマネージャにおいて適切に行われなければなりません。
更に、サーバサイドに保存されたセッション情報の管理もセッションマネージャの役割です。
セッションに紐づく情報は、必要な期間だけ保存されていなければなりません。
同時に、保存期間を超えたり、明示的に破棄を要求されたセッション情報は、確実に破棄されなければなりません。
これらの管理機能を、セッションマネージャに実装していくことになります。
セッション管理パッケージの構成
セッション管理機構は、独立したパッケージで実装することが望ましいでしょう。
よって、もっとも単純化された形として以下のようなファイル構成が考えられます。
|― sessions/
|― manager.go
|― session.go
session.goファイルには、個別のセッションの構造とセッション操作に必要な機能を記述します。
manager.goファイルには、セッションマネージャとして必要な機能を記述することになります。
終わりに
今回は、Goでセッション管理機構を実装するにあたっての基本的な知識、およびセッション管理パッケージの設計を解説しました。
コード実装もなく退屈な内容だったかもしれませんが、次回以降のコードはやや複雑なものになりますので、内容をしっかり理解していただければと思います。
次回の記事では、manager.goファイルにセッションマネージャを実装していきます。