複数回のリクエスト/レスポンスを束ねる

 Webブラウザ上の操作をリクエストとしてHTTPDに届け,レスポンスの内容をWebブラウザで表示する。こうした仕組みはシンプルで理解しやすいが,実際のシステムでは問題が生じることがある。

 例えば電子商取引サイトで商品を購入する場合を考えよう。商品画面でモノを選んで[購入]ボタンを押すと,バスケットの内容を一覧表示する確認画面が現れ,[購入]ボタンを押すと発送先や支払方法などを指定する決済画面が表示される。この場合,商品画面で選んだモノの情報を確認画面に,確認画面で承認したことを決済画面に,それぞれ引き継いでいく必要がある。こうした処理を実現するには,特定のWebブラウザから送られてきた一連のリクエスト/レスポンスをまとめて扱うことが必要だ。この一連のリクエスト/レスポンス群を「セッション」と呼ぶ。

 Webシステムでは,セッションをどのように管理するかが重要である。特に,(1)セッションを見分けるための識別子(セッション識別子)をどう作るか,(2)セッション識別子をWebブラウザとHTTPDとの間でどう送受信するか,(3)セッションで使う情報をどう保持するか――の3点を吟味する必要がある。なぜならこの3点は,セキュリティ,性能,耐障害性などに大きく影響するからである。

 例えば(1)を安易に考えると,悪意あるユーザーがセッション識別子を推測し,別のユーザーになりすましてリクエストを送信できてしまう。こうした事態を防ぐために,セッション識別子には,推定しづらい長さの文字列を利用することが望ましい。一般的には,アプリケーションの開発・運用環境(APコンテナ)が提供するセッション識別子を利用する。

 (2)のサーバー側で生成したセッション識別子は,Webブラウザに送信する。Webブラウザからリクエストするたびに,同じセッション識別子を付与することで,アプリケーションは同じセッションのリクエストだと識別できるからだ。セッション識別子を送受信する方法には,クッキー(HTTPの「Set-Cookie」ヘッダーや「Cookie」ヘッダー)に格納する方法,URLに付加する方法,隠し属性(Hidden)タグに格納する方法などが考えられる。一般的には,クッキーを利用することが多い(図1)。Webブラウザの制約などでクッキーを利用できない場合に限り,他の方法を検討するとよいだろう(他の方法を選ぶ場合はセキュリティ上の課題を解決しておく必要がある)。

図1●クッキーを使って同一ユーザーからのリクエストを識別
図1●クッキーを使って同一ユーザーからのリクエストを識別
複数画面を遷移するようなアプリケーションで,同一ユーザーからのリクエストを識別するには,セッション情報を利用する。一連のセッションを捕捉するためにセッション識別子を発行し,図中のようにクッキーなどに格納して,クライアントとサーバーとの間でやり取りする
[画像のクリックで拡大表示]

 セッションを使うと,複数の画面で情報を受け渡したり,情報を共有したりできる。先の電子商取引サイトの例であれば,バスケットに格納した商品情報などを,次々に画面間で引き継げる。セッションを通じて利用するこうした情報を「セッション情報」と呼ぶ。

 (3)のセッション情報は,一般的にセキュリティを考慮してサーバー側に格納する。格納場所としては,APコンテナが備える専用領域(セッション・オブジェクトと呼ぶ),データベース,ファイルなどがある。どこに格納するかで,性能や耐障害性に影響が出てくるため,注意が必要である(この点については,次回以降で説明する)。一般的には,開発の容易さからセッション・オブジェクトが多用される。

ファイルをダウンロード/アップロードする

 HTTPは,HTMLファイル以外に,画像ファイルやPDF(Portable Document Format)ファイルなど多様なデータのダウンロードに活用されている。このとき重要な役割を果たすのが,“Content-Type”というレスポンス・ヘッダーである。“Content-Type: text/html; charset=UTF-8”とある場合は,“UTF-8”という文字表現形式のHTMLデータをダウンロードするという意味になる。

 “text/html”という部分は,ダウンロードするコンテンツの種類を表す。これを「MIME(Multipurpose Internet Mail Extension)タイプ」と呼ぶ。GIF形式の画像であればMIMEタイプは“image/gif”である。

 HTTPDは,リクエストされたファイルの拡張子が“.html”ならば“text/html”を,“.gif”ならば“image/gif”を,それぞれ自動的にContent-Typeヘッダーにセットしている。どの拡張子にどのMIMEタイプをセットするかは,HTTPDに設定する(図2)。例えば拡張子“.pdf”にMIMEタイプ“application/pdf”をセットする場合,Apacheでは設定ファイル“httpd.conf”に「AddType application/pdf .pdf」と記述する(mime.typesファイルに設定する方法もある)。

図2●Content-Typeヘッダーでファイルの種別を見分ける
図2●Content-Typeヘッダーでファイルの種別を見分ける
Webサーバーはファイルの種別を識別するための情報をContent-Typeヘッダーに指定する。Webブラウザは,Content-Typeヘッダーの値に応じて,ファイルを画面に表示したり,プラグイン・ソフトに引き渡したりする

 Webブラウザは,受け取ったMIMEタイプをサポートしていればそのまま表示するし,サポートしなければダイアログ・ボックスを表示してファイルをダウンロードする。WebブラウザにMIMEタイプとアプリケーションの関係を設定しておけば,受信したファイルをアプリケーションで開くことも可能だ。

 アップロードする場合は,Webフォームの送信に使うPOSTメソッドの出番である。ここでは詳しく説明しないが,「MIMEマルチパート」と呼ぶ形式でフォームにファイルを添付してサーバーに送り込む。ファイルのアップロード機能を持つWebシステムを探し,実際の通信内容をプロキシで確認してほしい。

高安 厚思(たかやす あつし) オープンストリーム テクニカルコンピテンシーユニット 主管システムズアーキテクト
銀行系シンクタンクでオブジェクト指向技術の研究に携わった後,大手SI業者でアーキテクチャ構築やプロセス研究を担当。現職ではSOA(Service Oriented Architecture)を中心とする研究開発とアーキテクチャ構築に従事している