(57)【特許請求の範囲】
【請求項１】
サーバからブラウザに対するレスポンスを中継した場合に、該リクエストの資源識別子を置換する資源識別子置換部と、
前記サーバから前記ブラウザに対するクッキー書き込み指示情報を受信した場合に、該クッキー書き込み指示情報をスクリプトの呼び出し情報に置換するクッキー置換部と、
前記クッキー置換部によって置換されたスクリプトの呼び出し情報に対して、前記ブラウザのリクエスト先ドメインの祖先ドメインに対応するフレームを作成させるとともに祖先ドメインに対応するクッキーの書き込み指示をクロスドメイン通信で前記フレームへ送信させるスクリプトを追加する書込スクリプト追加部と、
を有することを特徴とする中継サーバ装置。
【請求項２】
前記書込スクリプト追加部は、前記祖先ドメインのフレームのパスのディレクトリを前記ブラウザからのレスポンスの受信先フレームのパスのディレクトリと同じにさせるスクリプトをさらに追加することを特徴とする請求項１に記載の中継サーバ装置。
【請求項３】
前記祖先ドメインに対応するフレームを作成させるとともに該フレームに祖先ドメインのクッキーを読み取らせて該クッキーを前記レスポンスの受信先フレームにクロスドメイン通信で送信させるスクリプトを追加する読取スクリプト追加部をさらに有することを特徴とする請求項１または２に記載の中継サーバ装置。
【請求項４】
前記読取スクリプト追加部は、前記祖先ドメインに対応するフレームに祖先ドメインのクッキーを取得させて該クッキーを前記レスポンスの受信先フレームにクロスドメイン通信で送信させる処理を一定時間ごとに行わせるスクリプトを追加することを特徴とする請求項３に記載の中継サーバ装置。
【請求項５】
前記サーバから前記ブラウザに対するレスポンスに含まれるレスポンスボディが画像情報であってクッキー書き込み指示情報が含まれている場合に、該クッキー書き込み指示情報に含まれるクッキーおよびレスポンスボディを記憶部に格納するクッキー格納部と、
前記クッキー書き込み指示情報に含まれるクッキーを書き込んだ格納先情報をリダイレクト先として前記ブラウザに送信するリダイレクト先送信部と、
前記ブラウザから前記リダイレクト先に対するリクエストがあった場合には、前記クッキーをブラウザに送信するとともに、前記リダイレクト先に再度リクエストさせるレスポンスを作成するレスポンス作成部と、
前記ブラウザから前記リダイレクト先に対するリクエストが再度あった場合には、前記記憶部に格納されたレスポンスボディを前記ブラウザに返信するレスポンスボディ返信部と、
をさらに有することを特徴とする請求項１〜４のいずれか一つに記載の中継サーバ装置。
【請求項６】
ブラウザからサーバに対するリクエストを受信した場合に、該リクエストの資源識別子を置換するＵＲＩ置換ステップと、
前記サーバから前記ブラウザに対するクッキー書き込み指示情報を受信した場合に、該クッキー書き込み指示情報をスクリプトの呼び出し情報に置換するクッキー置換ステップと、
前記クッキー置換ステップによって置換されたスクリプトの呼び出し情報に対して、前記ブラウザのリクエスト先ドメインの祖先ドメインに対応するフレームを作成させるとともに該フレームに祖先ドメインに対応するクッキーの書き込み指示をクロスドメイン通信で送信するスクリプトを追加する書込スクリプト追加ステップと、
を含んだことを特徴とするクッキー制御方法。
【請求項７】
ブラウザからサーバに対するリクエストを受信した場合に、該リクエストの資源識別子を置換するＵＲＩ置換手順と、
前記サーバから前記ブラウザに対するクッキー書き込み指示情報を受信した場合に、該クッキー書き込み指示情報をスクリプトの呼び出し情報に置換するクッキー置換手順と、
前記クッキー置換手順によって置換されたスクリプトの呼び出し情報に対して、前記ブラウザのリクエスト先ドメインの祖先ドメインに対応するフレームを作成させるとともに該フレームに祖先ドメインに対応するクッキーの書き込み指示をクロスドメイン通信で送信するスクリプトを追加する書込スクリプト追加手順と、
をコンピュータに実行させることを特徴とするクッキー制御プログラム。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、中継サーバ装置、クッキー制御方法およびクッキー制御プログラムに関する。
【背景技術】
【０００２】
近年、Ｗｅｂサーバがブラウザを通じてクライアントのコンピュータに一時的にクッキー情報を書き込んで保存させるクッキー（cookie）に関する技術が知られている。このように保存されたクッキー情報について、ブラウザがアクセスした複数のドメインの祖先ドメインが共通する場合には、クッキー情報を共有して利用することが知られている。例えば、ドメイン「sso.example.com」とドメイン「ap1.example.com」とは、祖先ドメイン「example.com」が共通しており、「sso.example.com」にアクセスしたブラウザと「ap1.example.com」にアクセスしたブラウザとでクッキー情報を共有して利用する。
【０００３】
ここで、図１４の例を用いて、祖先ドメインが共通する場合に、クッキーを共有して利用する処理について説明する。図１４は、祖先ドメインが共通する場合に、クッキーを共有する処理について説明する図である。例えば、図１４に示すように、ユーザがクライアント装置のブラウザＡ上から「sso.example.com」のＷｅｂアプリケーションでログイン処理を行うと、祖先ドメイン「example.com」の指定があるクッキーセット指示がＷｅｂサーバからブラウザＡへ送信される。図１４の例では、クッキーセット指示として、「Set-Cookie:sid=1234;domain=.example.com」というSet-Cookieヘッダを含んだＨＴＴＰ（Hypertext  Transfer  Protocol）レスポンスがＷｅｂサーバからブラウザＡに送信される。
【０００４】
そして、ブラウザＡは、クッキーセット指示「Set-Cookie:sid=1234;domain=.example.com」を受信すると、祖先ドメイン「example.com」を特定し、祖先ドメイン「example.com」に対応付けてクッキー情報「sid=1234」を書き込む。
【０００５】
このように書き込まれたクッキーは、祖先ドメイン「.example.com」に対応付けて記憶されているため、「sso.example.com」だけでなく「ap1.example.com」にアクセスする場合にも、クッキーを送信する。例えば、「sso.example.com」へのログイン処理後に、ユーザがブラウザＢから「ap1.example.com」にアクセスすると、「sso.example.com」へのログイン処理で送られてきたクッキー「Cookie:sid=1234」をＨＴＴＰリクエストのヘッダとしてＷｅｂサーバに送信する。
【０００６】
また、Ｗｅｂサーバとクライアント装置との間に、ＵＲＩ（Uniform  Resource  Identifier）を置換する中継サーバが設けられている場合がある。具体的には、中継サーバは、ＵＲＩのドメイン部分のドット「.」をハイフン「-」に置換するとともに中継サーバのホスト名を付加して、ＵＲＩを置換する。例えば、図１４の例を用いて説明すると、中継サーバは、中継サーバのホスト名が「r.test」である場合には、「sso.example.com」を「http-sso-example-com.r.test」に置換し、「ap1.example.com」を「http-ap1-example-com.r.test」に置換する。
【先行技術文献】
【特許文献】
【０００７】
【特許文献１】特開２００９−２７１６７６号公報
【発明の概要】
【発明が解決しようとする課題】
【０００８】
しかしながら、上述した中継サーバがＵＲＩを置換する技術では、ＵＲＩのドメイン部分が置換されるので、ドメインの親子関係が消滅してしまい、クッキー共有ができなくなり、クッキー情報の書き込み処理を適切に実行することができないという問題があった。
【０００９】
例えば、図１４の例では、「sso.example.com」が「http-sso-example-com.r.test」に置換され、「ap1.example.com」が「http-ap1-example-com.r.test」に置換され、祖先ドメインである「example.com」が「http-example-com.r.test」に置換されることとなる。ここで、ブラウザ側では、ドットがハイフンになっているので、「http-sso-example-com.r.test」および「http-ap1-example-com.r.test」の祖先ドメインが「http-example-com.r.test」であることを特定できない。このため、ドメインの親子関係が消滅してしまい、祖先ドメインのクッキー情報の書き込み処理を適切に実行することができない。
【００１０】
一つの側面では、中継サーバを経由してブラウザからＷｅｂアプリケーションにアクセスする場合であっても、クッキー情報の書き込み処理を適切に実行することを目的とする。
【課題を解決するための手段】
【００１１】
第一の案では、サーバからブラウザに対するクッキー書き込み指示情報を受信した場合に、該クッキー書き込み指示情報をスクリプトの呼び出し情報に置換する。そして、スクリプトの呼び出し情報に対して、ブラウザのリクエスト先ドメインの祖先ドメインに対応するフレームを作成させるとともに該フレームに祖先ドメインに対応するクッキーの書き込み指示をクロスドメイン通信で送信するスクリプトを追加する。
【発明の効果】
【００１２】
中継サーバを経由してブラウザからＷｅｂアプリケーションにアクセスする場合であっても、クッキー情報の書き込み処理を適切に実行することができる。
【図面の簡単な説明】
【００１３】
【図１】図１は、実施例１に係る中継サーバ装置の構成を示すブロック図である。
【図２】図２は、クッキーの書き込み処理を説明する図である。
【図３】図３は、クッキーの読み取り処理を説明する図である。
【図４】図４は、実施例１に係る中継サーバ装置によるクッキー書き込み処理の流れを示すシーケンス図である。
【図５】図５は、実施例１に係る中継サーバ装置によるクッキー読み取り処理の流れを示すシーケンス図である。
【図６】図６は、実施例２に係る中継サーバ装置の構成を示すブロック図である。
【図７】図７は、中継サーバが受信する画像データのリクエストの一例を説明する図である。
【図８】図８は、祖先ドメイン氏名のあるクッキーがヘッダに付与された画像データの一例を説明する図である。
【図９】図９は、一時保管部のデータベータに記憶されるデータ例を示す図である。
【図１０】図１０は、実施例２に係る中継サーバ装置による画像クッキー処理の流れを示すシーケンス図である。
【図１１】図１１は、実施例２に係る中継サーバ装置による処理の流れを示すフローチャートである。
【図１２】図１２は、実施例２に係る中継サーバ装置による処理の流れを示すフローチャートである。
【図１３】図１３は、クッキー書込読取プログラムを実行するコンピュータを示す図である。
【図１４】図１４は、祖先ドメインが共通する場合に、クッキーを共有する処理について説明する図である。
【発明を実施するための形態】
【００１４】
以下に添付図面を参照して、この発明に係る中継サーバ装置、クッキー制御方法およびクッキー制御プログラムの実施例を詳細に説明する。
【実施例１】
【００１５】
以下の実施例では、実施例１に係る中継サーバの構成および処理の流れを順に説明し、最後に実施例１による効果を説明する。
【００１６】
［中継サーバの構成］
まず最初に、図１を用いて、中継サーバ１０の構成を説明する。図１は、実施例１に係る中継サーバ１０の構成を示すブロック図である。図１に示すように、この中継サーバ１０は、リクエスト判別部１１、中継部１２、クッキー操作ページ返却部１３を有し、Ｗｅｂサーバ２０および利用者端末のブラウザ３０と接続される。以下にこれらの各部の処理を説明する。
【００１７】
Ｗｅｂサーバ２０は、中継サーバ１０を経由して利用者端末のブラウザ３０からアクセスがあると、アクセスをしてきた利用者端末のブラウザ３０に対してＨＴＭＬ（HyperText  Markup  Language）文書や画像などの情報をレスポンスとして中継サーバ１０経由で送信する。ブラウザ３０は、中継サーバ１０を経由してＷｅｂサーバ２０にリクエストを送信し、リクエストに対するレスポンスを中継サーバ１０経由でＷｅｂサーバ２０から受信する。
【００１８】
リクエスト判別部１１は、リクエストのパスが特定のファイル名（例えば、「CookieHandler.html」）であるか判定し、リクエストのパスが特定のファイル名である場合に、クッキー操作ページへのリクエストであると判別する。具体的には、リクエスト判別部１１は、ブラウザからリクエストを受信し、リクエストのパス部分を検出し、パスのファイル名と特定のファイル名（例えば、「CookieHandler.html」）とが一致しているか判定する。
【００１９】
この結果、リクエスト判別部１１は、リクエストのパス部分を検出し、パスのファイル名と特定のファイル名とが一致すると判定した場合には、後述するクッキー操作ページ返却部１３へリクエストを通知する。また、リクエスト判別部１１は、リクエストのパス部分を検出し、パスのファイル名と特定のファイル名とが一致しないと判定した場合には、後述する中継部１２へＵＲＩを通知する。
【００２０】
例えば、リクエスト判別部１１は、リクエストのパスが「/CookieHandler.html」や「/dir1/dir2/CookieHandler.html」となっているリクエストについては、クッキー操作ページ返却部１３にリクエストを通知する。
【００２１】
また、リクエスト判別部１１は、リクエストのパスが「/」や「/CookieHandler.html/dir/」なっているリクエストについては、中継部１２へリクエストを通知する。なお、「CookieHandler.html」などの指定のファイル名は、中継サーバが自由に設定できるものであり、別のファイル名でもよく、他のＷｅｂサーバで使われていないファイル名で設定するのがよい。
【００２２】
中継部１２は、Ｗｅｂサーバ２０と利用者端末のブラウザ３０との間の通信を中継し、リクエスト代行部１２ａ、ＵＲＩ置換部１２ｂ、クッキー置換部１２ｃ、スクリプト追加部１２ｄを有する。
【００２３】
ＵＲＩ置換部１２ｂは、Ｗｅｂサーバ２０からブラウザ３０に対するレスポンスを受信した場合に、ブラウザ３０のＵＲＩを置換する。具体的には、ＵＲＩ置換部１２ｂは、Ｗｅｂサーバ２０から受信したＵＲＩのドメイン部分のドット「.」をハイフン「-」に置換するとともに、中継サーバのホスト名「r.test」を付加する。
【００２４】
例えば、ＵＲＩ置換部１２ｂは、Ｗｅｂサーバ２０から「http://sso.example.com」を受信すると、「http://http-sso-example-com.r.test」に置換する。また、ＵＲＩ置換１２ｂは、ブラウザ３０から「http://http-sso-example-com.r.test/login/login」を受信すると、「http://sso.example.com/login/login」に復元し、リクエスト代後部１２ａに通知する。
【００２５】
リクエスト代行部１２ａは、利用者端末のブラウザ３０から受信したリクエストを受信すると、リクエスト中のドメインを解釈してＷｅｂサーバにリクエストを送信する。具体的には、リクエスト代行部１２ａは、ＵＲＩ置換部１２ｂからＵＲＩを受信し、受信されたＵＲＩを用いて、Ｗｅｂサーバ２０にリクエストを送信する。
【００２６】
クッキー置換部１２ｃは、Ｗｅｂサーバ２０からブラウザ３０に対するクッキー書き込み指示情報を受信した場合に、クッキー書き込み指示情報をスクリプトの呼び出し情報に置換する。具体的には、クッキー置換部１２ｃは、Ｗｅｂサーバ２０からのレスポンスにSet-CookieヘッダやＪａｖａ（登録商標）Ｓｃｒｉｐｔ中のdocument.cookieへの代入が含まれているか判定する。この結果、Ｗｅｂサーバ２０からのレスポンスにSet-Cookieヘッダやスクリプト中のdocument.cookieへの代入が含まれていると判定した場合には、Set-Cookieヘッダやスクリプト中のdocument.cookieをsetCookieFunc関数の呼び出しへと置換する。
【００２７】
スクリプト追加部１２ｄは、スクリプトの呼び出し情報に対して、ブラウザ２０のドメインの祖先ドメインに対応するフレームを作成させるとともにフレームに祖先ドメインに対応するクッキーの書き込み指示をクロスドメイン通信で指示するスクリプトを追加する。例えば、スクリプト追加部１２ｄは、クッキー置換部１２ｃによってsetCookieFunc関数の呼び出しに置換された後に、setCookieFunc関数の定義をＨＴＭＬ文書内に追加する。
【００２８】
また、スクリプト追加部１２ｄは、祖先ドメインのフレームのパスのディレクトリをブラウザ２０からのレスポンスの受信先フレームのパスのディレクトリと同じにしたiframe要素を作成するスクリプトを追加する。
【００２９】
例えば、スクリプト追加部１２ｄは、親フレームが「http://sso.example.com/login/login」であり、「Set-Cookie:sid=1234;domain=.example.com;path=/」のクッキーが送られてきた場合には、iframeのＵＲＩが「http://http-example-com.r.test/login/CookieHandler.html」となる。つまり、祖先ドメインのフレームのパスのディレクトリと受信先フレームのパスのディレクトリとを「/login/」でそろえる。これにより、Set-CookieヘッダやＪａｖａＳｃｒｉｐｔ中のdocument.cookieへの代入でドメインやパスの指定がある場合にも、適切にクッキーを処理することができる。
【００３０】
また、スクリプト追加部１２ｄは、祖先ドメインに対応するフレームを作成させるとともに該フレームに祖先ドメインのクッキーを取得させて親フレームにクロスドメイン通信で送信させる処理を一定時間ごとに行わせるスクリプトを追加する。
【００３１】
例えば、Ｗｅｂサーバ２０からＨＴＭＬドキュメントのレスポンスを受信した場合に、ＨＴＭＬドキュメントに対して祖先ドメインからクッキーをコピーしてくるための読取スクリプトを追加する。
【００３２】
クッキー操作ページ返却部１３は、中継サーバ１０内に格納されているＨＴＭＬとスクリプトで構成されたクッキー操作ページを返信する。ここで、クッキー操作ページとは、ブラウザ３０におけるｉｆｒａｍｅ内に読み込まれることを想定されており、ドメインをまたがったクッキーの読書きを行う。なお、クッキー操作ページには、クロスドメイン通信でのセキュリティを保つためのロジックも含めるようにしてもよい。
【００３３】
ここで、クッキーの書き込み処理について図２を用いて具体的に説明する。図２に示すように、中継サーバ１０は、Ｗｅｂサーバ２０からのレスポンスヘッダのSet-Cookieやスクリプト内のdocument.cookieへの代入を受信すると、ヘッダやスクリプトをsetCookieFunc関数への呼び出しへと置換し、setCookieFunc関数をＨＴＭＬ文書内に追加する。例えば、中継サーバ１０は、Set-Cookie:sid=1234;domain=.example.com; path=/のヘッダをsetCookieFunc(“sid=1234;domain=.example.com;path=/”)のスクリプトに置換し、ブラウザ３０に送信する。
【００３４】
そして、ブラウザ３０は、setCookieFunc関数が呼ばれると、祖先ドメインの指定があるか判定する。この結果、ブラウザ３０は、祖先ドメインの指定がないと判定した場合には、document.cookieにクッキーの内容を代入することでブラウザのクッキーに登録する。また、ブラウザ３０は、祖先ドメインの指定があると判定した場合には、祖先ドメインを中継サーバへのＵＲＩ置換を行い、親フレームと同じディレクトリにCookieHandler.htmlという予約済みのファイル名を付加したＵＲＩを表示するためのiframe要素を作成し、中継サーバ１０からCookieHandler.htmlを取得する。
【００３５】
その後、ブラウザ３０は、作成したiframeにpostMessageなどのクロスドメイン通信を行って親フレームから子フレームのドメインにクッキーのセット指示を出す。指示を受けたiframe側のCookieHandler.html内のスクリプトでは、指示元が子孫ドメインであるかを確認する。この結果、指示元が子孫ドメインである場合には、iframe側でdocument.cookieにクッキーの内容を代入することで祖先ドメインへのクッキーセットを行う。
【００３６】
次に、図３を用いて、クッキーの読み取り処理について具体的に説明する。クッキーの読み取り処理を行うケースとして、ブラウザがＨＴＴＰリクエストにCookieヘッダを付与して送信する場合と、スクリプトがdocument.cookieを読み取る場合の２種類がある。図３に示すように、中継サーバ１０は、ブラウザ３０からのリクエストに対してＷｅｂサーバ２０からＨＴＭＬドキュメントを取得する。
【００３７】
そして、中継サーバ１０は、取得したＨＴＭＬドキュメントに対してクッキーの読取スクリプトを追加し、ブラウザ３０に送信する。その後、読み取りスクリプトがブラウザ３０上で実行され、元のドメインの祖先ドメインでCookieHandler.htmlを読み込むためのiframe要素を作成する。
【００３８】
例えば、ブラウザ３０が、http://http-ap1-example-com.r.test/dir1/dir2/file.htmlを表示している場合に、元のドメインがap1.example.comなので祖先ドメインがexample.comであるドメインの一つである。また、ディレクトリが/dir1/dir2/であるため、http://http-example-com.r.test/dir1/dir2/CookieHandler.htmlを読み込むためのiframeが作成されることになる。なお、ドメインによっては作成されるiframeの個数はゼロや複数もありうる。
【００３９】
そして、ブラウザ３０は、中継サーバ１０からCookieHandler.htmlを読み込んだ後に、iframeに対してクロスドメイン通信でクッキーの取得指示を送る。iframe側のCookieHandler.htmlのスクリプトがクロスドメイン通信の送信元を確認して子孫ドメインからの通信であるかを確認する。
【００４０】
この結果、子孫ドメインからの通信であることの確認が取れた場合には、スクリプトでdocument.cookieの値を読み取る。ここで読み取れるクッキーについて、CookieHandler.htmlのドメインとパスに該当するものを読取ることができる。
【００４１】
その後、クロスドメイン通信で親フレームにクッキーの内容を伝える。親フレームは、クロスドメイン通信の送信元が祖先ドメインであることを確認し、document.cookieにクッキーの内容を代入して祖先ドメインのクッキーを親フレームのドメインでも使えるようにする。その後、クッキーの一貫性を保つために、親フレームのdocument.cookieに代入するクッキーは expires を短く設定し、フレーム間でのクッキーの読み取りを一定時間おきに繰り返して実行する。これにより、祖先ドメインであって指定パスに該当するクッキーを読み取ることができる。
【００４２】
［中継サーバによる処理］
次に、図４を用いて、実施例１に係る中継サーバ１０によるクッキー書き込み処理を説明する。図４は、実施例１に係る中継サーバ装置によるクッキー書き込み処理の流れを示すシーケンス図である。以下の例では、http://sso.example.com/login/でログイン処理を行うと、Set-Cookie:sid=1234;domain=.example.com;path=/のレスポンスヘッダが返ってくるものとする。
【００４３】
図４に示すように、中継サーバ１０は、ブラウザ３０からログインリクエストを受信する（ステップＳ１０１）。例えば、初期状態ではブラウザ３０がhttp://sso.example.com/login/を中継サーバ１０経由のhttp://http-sso-example-com.r.test/login/で開いている。そして、入力フォーム内のユーザ名とパスワードが入力され、ログインボタンが押されると、ブラウザ３０がhttp://http-sso-example-com.r.test/login/loginにログインリクエストを送信する。
【００４４】
続いて、中継サーバ１０は、中継サーバのリクエスト判別部１１がパスの/login/loginが「CookieHandler.html」と異なることから中継部１２に処理を割り振る。そして、中継部１２のＵＲＩ置換部１２ｂは、ＵＲＩの復元を行いhttp://sso.example.com/login/loginというＵＲＩを得る（ステップＳ１０２）。
【００４５】
そして、中継部１２のリクエスト代行部１２ａは、Ｗｅｂサーバ２０に対してリクエストを送信する（ステップＳ１０３）。続いて、Ｗｅｂサーバ２０は、ユーザ名とパスワードのチェックを行って妥当性が確認できると、Set-Cookie:sid=1234;domain=.example.com;path=/ヘッダの付いたレスポンスを中継サーバ１０へ返信する（ステップＳ１０４）。
【００４６】
その後、中継サーバ１０は、Ｗｅｂサーバ２０から返ってきたレスポンスに対してＵＲＩ置換、クッキー置換、スクリプト追加を行う（ステップＳ１０５）。例えば、中継サーバ１０は、クッキー置換として、Set-Cookie:sid=1234; domain=.example.com;path=/のヘッダをsetCookieFunc(“sid=1234;domain=.example.com;path=/”)のスクリプトに置換する。
【００４７】
そして、中継サーバ１０は、ＵＲＩ置換、クッキー置換、スクリプト追加が行われたレスポンスをブラウザ３０に送信する（ステップＳ１０６）。そして、ブラウザ３０は、追加されたスクリプトによってiframeを作成する（ステップＳ１０７）。ここで、sso.example.comの祖先ドメインがexample.comの一つだけであり、パスが/login/loginであるため、作成されるiframeのＵＲＩがhttp://http-example-com.r.test/login/CookieHandler.htmlとなる。
【００４８】
そして、中継サーバ１０のリクエスト判別部１１は、ＵＲＩ「http://http-example-com.r.test/login/CookieHandler.html」でのリクエストをブラウザ３０のiframeから受信する（ステップＳ１０８）。そして、リクエスト判別部１１は、パスのファイル名がCookieHandler.htmlであることからクッキー操作ページ返却部１３に処理を割り振る。続いて、クッキー操作ページ返却部１３は、クッキー操作ページをクライアントに返信する（ステップＳ１０９）。
【００４９】
その後、ブラウザ３０側でsetCookieFunc関数が呼び出されると、指定されてあるドメインの.example.comに対応するiframeのhttp://http-example-com.r.test/login/CookieHandler.htmlに対してクロスドメイン通信でクッキーセット要求を送る（ステップＳ１１０）。そして、クロスドメイン通信を受けたiframeは、クロスドメインの通信元の妥当性をチェックする。図４の例では、送信元のドメインがhttp-sso-example-com.r.testであり、iframeのドメインがhttp-example-com.r.testとなっており、置換前のドメインでは親子関係であるため妥当であると判断する。妥当であると判断された場合には、iframe側では、document.cookie=“sid=1234;path=/”のスクリプトを実行しクッキーのセットを行う（ステップＳ１１１）。
【００５０】
次に、図５を用いて、実施例１に係る中継サーバ１０によるクッキー読み取り処理を説明する。図５は、実施例１に係る中継サーバ装置によるクッキー読み取り処理の流れを示すシーケンス図である。以下の例では、図４で説明したログイン処理の後でアプリケーションのapp1を利用した場合について説明する。app1では、http://app1.example.com/sso/にアクセスすると、ＳＳＯ認証が行われるものとする。
【００５１】
図５に示すように、ブラウザ３０は、中継サーバ１０経由でhttp://app1.example.com/にアクセスして、http://http-app1-example-com.r.test/にリクエストを送る（ステップＳ２０１）。そして、中継サーバ１０のリクエスト判別部１１は、パス部分の/がCookieHandler.htmlと異なるため、中継部１２へリクエスト処理を割り振る。
【００５２】
そして、中継部１２のＵＲI置換部１２ｂは、ＵＲＩをhttp://app1.example.com/に復元する（ステップＳ２０２）。続いて、リクエスト代行部１２ａは、復元されたＵＲＩに対しリクエストを送ると（ステップＳ２０３）、Ｗｅｂサーバ２０からレスポンスを受信する（ステップＳ２０４）。
【００５３】
そして、中継サーバ１０は、Ｗｅｂサーバ２０から返ってきたレスポンスに対してＵＲＩ置換、クッキー置換、スクリプト追加を行う（ステップＳ２０５）。ここでは、レスポンスにはSet-Cookieヘッダやスクリプト中のdocument.cookieへの代入が含まれていないので、クッキー置換を行わない。その後、中継サーバ１０は、レスポンスをブラウザ３０に送信する（ステップＳ２０６）。
【００５４】
そして、ブラウザ３０は、追加されたスクリプトでiframeを作成する（ステップＳ２０７）。app1.example.comの祖先ドメインは、「example.com」の一つだけであり、パスが「/」であるため、作成されるiframeのＵＲＩがhttp://http-example-com.r.test/CookieHandler.htmlとなる。そして、ブラウザ内のiframeは、このＵＲＩでのリクエストを中継サーバ１０に送信して、/CookieHandler.htmlを読み込む（ステップＳ２０８）。
【００５５】
そして、リクエスト判別部１１は、パスが/CookieHandler.htmlであるので、クッキー操作ページ返却部１３に処理を割り振る。クッキー操作ページ返却部１３は、クッキー操作ページをクライアントに返却する（ステップＳ２０９）。続いて、ブラウザの親フレームがiframeに対してクロスドメイン通信でクッキーの取得要求を出す（ステップＳ２１０）。iframe側では、クロスドメイン通信の通信元がiframeのドメインの子孫ドメインであることを確認し、document.cookieプロパティを参照してブラウザ３０がhttp-example.com.r.testドメインの/パスで保存しているクッキーを読み取る（ステップＳ２１１）。例えば、document.cookieを参照することでsid=1234のクッキーを読み取る。
【００５６】
そして、iframeは、読み取ったクッキーをクロスドメイン通信で親フレームのhttp://http-app1-example-com.r.test/に送信する（ステップＳ２１２）。親フレームでは、クロスドメイン通信の通信元が祖先ドメインであるかを確認して、document.cookieプロパティにクッキーの内容を代入する（ステップＳ２１３）。これにより、親フレームのドメインで祖先ドメインのクッキーが読めるようになる。また、クッキーの一貫性のためにタイマー等でステップＳ２１０〜Ｓ２１３を繰り返し実行する。
【００５７】
そして、ユーザがブラウザ３０上に表示されているＳＳＯのためのリンクをクリックすると（ステップＳ２１４）、ブラウザ３０は、http://http-app1-example-com.r.test/sso/にリクエストを送ろうとする（ステップＳ２１５）。ここでは、祖先ドメインのクッキーがコピーされているため、ブラウザ３０は、クッキーとしてCookie:sid=1234を付与してリクエストを送る。
【００５８】
中継サーバ１０のリクエスト判別部１１は、リクエストを受信するとき、パスが/sso/であり、/CookieHandler.htmlでないので、中継部１２にリクエスト処理を割り振る。中継部１２のＵＲＩ置換部１２ｂがＵＲＩをhttp://app1.example.com/sso/と復元し（ステップＳ２１６）、リクエスト代行部１２ａがCookie: sid=1234のヘッダがついたリクエストをhttp://app1.example.com/sso/に送信する（ステップＳ２１７）。その後、Ｗｅｂサーバ２０では、クッキーのsidの値を見てＳＳＯ認証を行うことになる。これによってドメインをまたがったＳＳＯ認証が中継サーバ１０を介しても正常に行われることになる。
【００５９】
[実施例１の効果]
上述してきたように、中継サーバ１０は、Ｗｅｂサーバ２０からブラウザ３０に対するレスポンスを中継した場合に、リクエストのＵＲＩを置換する。そして、中継サーバ１０は、Ｗｅｂサーバ２０からブラウザ１０に対するクッキー書き込み指示情報を受信した場合に、クッキー書き込み指示情報をスクリプトの呼び出し情報に置換する。その後、中継サーバ１０は、置換されたスクリプトの呼び出し情報に対して、ブラウザ３０のリクエスト先ドメインの祖先ドメインに対応するフレームを作成させるスクリプトを追加する。また、中継サーバ１０は、フレームに祖先ドメインに対応するクッキーの書き込み指示をクロスドメイン通信で送信するスクリプトを追加する。このため、中継サーバを経由してブラウザからＷｅｂアプリケーションにアクセスする場合であっても、クッキー情報の書き込む処理を適切に実行することが可能である。
【００６０】
また、実施例１によれば、中継サーバ１０は、祖先ドメインのフレームのパスのディレクトリをブラウザ３０からのレスポンスの受信先フレームのパスのディレクトリと同じにさせるスクリプトをさらに追加する。このため、Set-CookieヘッダやＪａｖａＳｃｒｉｐｔ中のdocument.cookieへの代入でドメインやパスの指定がある場合にも、iframeのパスのディレクトリを親フレームのパスのディレクトリとそろえる。この結果、祖先ドメインおよび指定パスに該当するクッキー情報の書き込む処理を適切に実行することが可能である。
【００６１】
また、実施例１によれば、中継サーバ１０は、Ｗｅｂサーバ２０からブラウザ３０に対するレスポンスを受信する。そして、中継サーバ１０は、祖先ドメインに対応するフレームを作成させるとともに該フレームに祖先ドメインのクッキーを取得させて該クッキーをレスポンスの受信先フレームにクロスドメイン通信で送信させるスクリプトを追加する。このため、クッキー情報の読み取り処理を適切に実行することが可能である。
【００６２】
また、実施例１によれば、中継サーバ１０は、祖先ドメインに対応するフレームに祖先ドメインのクッキーを取得させてクッキーをレスポンスの受信先フレームにクロスドメイン通信で送信させる処理を一定時間ごとに行わせるスクリプトを追加する。このため、祖先ドメインの一貫性を保つことが可能である。
【実施例２】
【００６３】
ところで、上記の実施例１では、ＨＴＭＬやJavaScriptにSet-Cookieヘッダが付いている場合に、スクリプトに変換してクッキーの読み書き処理を行う場合を説明したが、本実施例はこれに限定されるものではなく、画像などにSet-Cookieヘッダが付いている場合にも、クッキーの書き込み処理を行う。
【００６４】
例えば、ブラウザは、「http://www.example.com/image.jpg」を中継サーバ経由で読みこむために、図７に例示するようなＨＴＴＰのリクエストをＷｅｂサーバへ送信する。そして、Ｗｅｂサーバは、祖先ドメイン指定のあるクッキー「key=value;domain=.example.com;path=/」をヘッダに付けて、図８に例示するようなレスポンスを中継サーバ経由でブラウザに送信する。
【００６５】
まず最初に、実施例２に係る中継サーバ１０Ａの構成を説明する。図６に示すように、中継サーバ１０Ａは、図１に示した中継サーバ１０と比較して、画像クッキー処理部１４を新たに有する点が相違する。かかる中継サーバ１０Ａにおいて、画像クッキー処理部１４は、ＵＲＩ置換部１４ａ、レスポンス作成部１４ｂ、一時保管部１４ｃを有する。
【００６６】
リクエスト判別部１１は、実施例１と同様に、リクエストのパスが「/CookieHandler.html」や「/dir1/dir2/CookieHandler.html」となっているリクエストについては、クッキー操作ページ返却部１３にリクエストを通知する。また、リクエスト判別部１１は、実施例１と同様に、リクエストのパスが「/」や「/CookieHandler.html/dir/」となっているリクエストについては、中継部１２へリクエストを通知する。また、リクエスト判別部１１は、ＵＲＩのクエリパラメータにSetCookieWithRedirection=trueを含んでいるリクエストについては、画像クッキー処理部１４にリクエストを通知する。
【００６７】
ＵＲＩ置換部１４ａは、Ｗｅｂサーバ２０から受信したＵＲＩのドメイン部分を置換し、ブラウザ３０から受信したＵＲＩのドメイン部を復元する。具体的には、ＵＲＩ置換部１４ａは、Ｗｅｂサーバ２０から受信したＵＲＩのドメイン部分のドット「.」をハイフン「-」に置換するとともに、中継サーバのホスト名「r.test」を付加する。
【００６８】
レスポンス作成部１４ｂは、クッキー書き込み指示情報に含まれるクッキーを書き込んだ格納先であるＵＲＩをリダイレクト先としてブラウザ３０に送信する。具体的には、レスポンス作成部１４ｂは、データベースに格納されているcookiesの中から任意のクッキーを一つ取得し、このクッキーをセットできるＵＲＩへのリダイレクトをブラウザに送信する。
【００６９】
そして、レスポンス作成部１４ｂは、ブラウザ３０からリダイレクト先に対するリクエストがあった場合には、クッキーをブラウザ３０に送信するとともに、リダイレクト先に再度リクエストさせるレスポンスを作成する。そして、レスポンス作成部１４ｂは、ブラウザ３０からリダイレクト先に対するリクエストが再度あった場合には、一時保管部１４ｃに格納されたレスポンスボディをブラウザ３０に返信する。
【００７０】
一時保管部１４ｃは、サーバからブラウザに対するレスポンスに含まれるレスポンスボディがＨＴＭＬやＪａｖａＳｃｒｉｐｔではなく、祖先ドメイン指定のあるクッキー書き込み指示情報が含まれている場合に、クッキー書き込み指示情報に含まれるクッキーおよびレスポンスボディを記憶する。
【００７１】
具体的には、一時保管部１４ｃは、図９に示すように、一意に割り当てられた値である「ｉｄ」、乱数によって生成された値である「token」、後述する図１０のresp1rのSet-Cookieヘッダのうち祖先ドメインのドメイン指定のあるクッキーである「cookies」を対応付けて記憶する。また、一時保管部１４ｃは、図９に示すように、画像データのレスポンスボディである「respBody」、ブラウザ３０からＷｅｂサーバ２０へのリクエストのＵＲＩを復元したＵＲＩである「returnTo」を対応付けて記憶する。
【００７２】
次に、図１０〜図１２を用いて、実施例２に係る中継サーバ１０Ａによる処理を説明する。図１０は、実施例２に係る中継サーバ装置による画像クッキー処理の流れを示すシーケンス図である。図１１は、実施例２に係る中継サーバ装置による処理の流れを示すフローチャートである。図１２は、実施例２に係る中継サーバ装置による処理の流れを示すフローチャートである。
【００７３】
図１０に示すように、ブラウザ３０がhttp://www.example.com/image.jpgを中継サーバ経由で読み込むためにhttp://http-www-example-com.r.test/image.jpgにリクエストを送る（ステップＳ３０１）。そして、中継サーバ１０Ａは、リクエストを中継してhttp://www.example.com/image.jpgにリクエストを送る（ステップＳ３０２）。
【００７４】
そして、Ｗｅｂサーバ２０は，祖先ドメイン指定のあるクッキーkey=value;domain=.example.com;path=/をヘッダにつけて画像データを返す（ステップＳ３０３）。そして、中継サーバ１０Ａは、ＨＴＭＬかＪａｖａＳｃｒｉｐｔのクッキーセット指示でなくて、かつ、祖先ドメイン指定があると判定した場合には、中継部１２から画像クッキー処理部１４に処理を委譲する。そして、画像クッキー処理部１４では、一時保管部１４ｃに対して新たな行を追加して、データを書き込む（ステップＳ３０４）。
【００７５】
その後、レスポンス作成部１４ｂは、一時保管部１４ｃに格納されているcookiesの中から任意のクッキーを一つ取り出す。例えば、図９の例では、cookiesカラムにはクッキーが一つしか格納されていないため、key=value;domain=.example.com; path=/が取り出される。中継サーバ１０は、取り出されたクッキーをセットできるＵＲＩであるhttp://http-example-com.r.test/?SetCookieWithRedirection=true&id=1234&token=0306へのリダイレクトをブラウザ３０に返す（ステップＳ３０５）。なお、このＵＲＩでSetCookieWithRedirection=trueというクエリパラメータは、実施例１に登場したCookieHandler.htmlと同様に中継サーバが任意に設定できるものである。また、idとtokenのパラメータ名も中継サーバが自由に設定できる。
【００７６】
ブラウザ３０は、http://http-example-com.r.test/?SetCookieWithRedirection=true&id=1234&token=0306にリクエストを送り直す（ステップＳ３０６）。中継サーバ１０のリクエスト判別部１１は、リクエストされたＵＲＩのクエリパラメータにSetCookieWithRedirection=trueを含んでいるため画像クッキー処理部１４のレスポンス作成部１４ｂに処理を渡す。
【００７７】
レスポンス作成部１４ｂは、リクエストのidパラメータとtokenパラメータを取得し両者が一致する行を一時保管部１４ｃから取得する。ステップＳ３０６において送信されたリクエストのＵＲＩを復元した時のドメインとパスは、example.comと/であり、このドメインとパスで設定することのできるクッキーをcookiesカラムから探すとkey=value;domain=.example.com;path=/が合致する。このため、レスポンス作成部１４ｂは、このクッキーを一時保管部１４ｃから取得してから削除する（ステップＳ３０７）。
【００７８】
そして、中継サーバ１０のレスポンス作成部１４ｂは、cookiesカラムに残っているクッキーがなくなったので、returnToカラムの値をＵＲＩ置換してクエリパラメータを追加する。そして、取得したクッキーをヘッダにつけてＵＲＩへのリダイレクトをブラウザに返す（ステップＳ３０８）。その後、ブラウザ３０は、Set-Cookie:key=value;domain=.http-www-example-com.r.test;path=/のヘッダに従ってexample.comを置換したhttp-www-example-com.r.testドメインでのクッキーセットを行う。
【００７９】
そして、ブラウザ３０は、ステップＳ３０８で指示されているＵＲＩでリクエストを送り直す（ステップＳ３０９）。そして、中継サーバ１０のリクエスト判別部１１は、リクエストパラメータにSetCookieWithRedirection=trueがあるため画像クッキー処理部１４に処理を渡す。
【００８０】
レスポンス作成部１４は、リクエストのidパラメータとtokenパラメータを取得し両者が一致する行を一時保管部１４ｃから取得する。ステップＳ３０７においてcookiesカラムが空になっているため、respBodyの値を取得し、一時保管部１４ｃから当該行を削除する（ステップＳ３１０）。その後、レスポンス作成部１４は、respBodyでレスポンスを作成してブラウザ３０に返す（ステップＳ３１１）。
【００８１】
次に、図１１および図１２を用いて、実施例２に係る中継サーバによる処理の流れを説明する。図１１および図１２は、実施例２に係る中継サーバ装置による処理の流れを示すフローチャートである。図１１に示すように、中継サーバ１０Ａは、レスポンスを受信すると（ステップＳ４０１肯定）、Ｗｅｂサーバ２０からのレスポンスがＨＴＭＬまたはＪａｖａｓｃｒｉｐｔであるか判定する（ステップＳ４０２）。
【００８２】
この結果、中継サーバ装置１０Ａは、レスポンスがＨＴＭＬまたはＪａｖａｓｃｒｉｐｔであると判定した場合には（ステップＳ４０２肯定）、実施例１で説明したように、クッキーセット指示をsetCookieFunc関数の呼び出しに置換する（ステップＳ４０３）。そして、中継サーバ装置１０Ａは、レスポンスにSet-Cookieヘッダやdocument.cookieへの代入が含まれておらず（ステップＳ４０２否定）、Set-Cookieヘッダが付いている場合には、ドメイン指定があるか判定する（ステップＳ４０４）。
【００８３】
この結果、中継サーバ装置１０Ａは、祖先ドメインの指定がある場合には（ステップＳ４０４肯定）、クッキー読み取り処理と行削除処理（後に、図１２を用いて詳述）を行う（ステップＳ４０５）。また、中継サーバ装置１０Ａは、祖先ドメインの指定がない場合には（ステップＳ４０４否定）、ヘッダにもともとついていたクッキーのドメインを置換する（ステップＳ４０６）。
【００８４】
次に、図１２を用いて、中継サーバ１０Ａによるクッキー読み取り処理と行削除処理について説明する。図１２に示すように、同一ドメインのクッキーをレスポンスヘッダに追加し（ステップＳ５０１）、一時保管部１４ｃに対して新たな行を作成する（ステップＳ５０２）。
【００８５】
そして、中継サーバ１０Ａのレスポンス作成部１４ｂは、一時保管部１４ｃのcookiesカラムにクッキーがあるか判定する（ステップＳ５０３）。この結果、レスポンス作成部１４ｂは、一時保管部１４ｃのcookiesカラムにクッキーがある場合には（ステップＳ５０３肯定）、cookiesカラムからクッキーを一つ取得する（ステップＳ５０４）。そして、取得したクッキーをセットできるＵＲＩにリダイレクトをブラウザ３０に送信する（ステップＳ５０５）。
【００８６】
その後、中継サーバ１０Ａは、次のリクエストを待った後（ステップＳ５０６）、cookiesカラムにあるクッキーのうち現在のＵＲＩでセットできるクッキーをすべて取得し、当該クッキーをカラムから削除してレスポンスヘッダに追加する（ステップＳ５０７）。そして、ステップＳ５０３に戻って、一時保管部１４ｃのcookiesカラムにクッキーがなくなるまでステップＳ５０４〜Ｓ５０７の処理を繰り返す。その後、一時保管部１４ｃのcookiesカラムにクッキーがなくなると（ステップＳ５０３否定）、returnToカラムの値を取得する（ステップＳ５０８）。
【００８７】
そして、取得したクッキーをヘッダにつけてＵＲＩへのリダイレクトをブラウザに返す（ステップＳ５０９）。その後、中継サーバ１０は、リクエストを待った後（ステップＳ５１０）、リクエストのidパラメータとtokenパラメータを取得して両者が一致する行を一時保管部１４ｃから取得してrespBodyの値を読み出し、当該行を削除する（ステップＳ５１１）。
【００８８】
このように実施例２によれば、中継サーバ１０Ａは、Ｗｅｂサーバ２０からブラウザ３０に対するレスポンスに含まれるレスポンスボディがＨＴＭＬかＪａｖａＳｃｒｉｐｔではなくクッキー書き込み指示情報が含まれている場合に、クッキー書き込み指示情報に含まれるクッキーおよびレスポンスボディを一時保管部１４ｃに格納する。そして、中継サーバ１０Ａは、クッキー書き込み指示情報に含まれるクッキーを書き込んだＵＲＩをリダイレクト先としてブラウザ３０に送信する。続いて、中継サーバ１０Ａは、ブラウザ３０からリダイレクト先に対するリクエストがあった場合には、クッキーをブラウザ３０に送信するとともに、リダイレクト先に再度リクエストさせるレスポンスを作成する。その後、中継サーバ１０Ａは、ブラウザ３０からリダイレクト先に対するリクエストが再度あった場合には、一時保管部１４ｃに格納されたレスポンスボディをブラウザ３０に返信する。このため、中継サーバ１０Ａは、画像などにSet-Cookieが付いている場合であっても、ブラウザ３０にクッキーを適切に処理させることが可能となる。
【実施例３】
【００８９】
さて、これまで実施例１、２について説明したが、上述した実施例以外にも、種々の異なる形態にて実施されてよいものである。そこで、以下では実施例３として他の実施例を説明する。
【００９０】
（１）システム構成等
また、図示した各装置の各構成要素は機能概念的なものであり、必ずしも物理的に図示の如く構成されていることを要しない。すなわち、各装置の分散・統合の具体的形態は図示のものに限られず、その全部または一部を、各種の負荷や使用状況などに応じて、任意の単位で機能的または物理的に分散・統合して構成することができる。例えば、スクリプト追加部１２ｄを書込スクリプト追加部と読取スクリプト追加部とに分散してもよい。さらに、各装置にて行なわれる各処理機能は、その全部または任意の一部が、ＣＰＵおよび当該ＣＰＵにて解析実行されるプログラムにて実現され、あるいは、ワイヤードロジックによるハードウェアとして実現され得る。
【００９１】
（２）プログラム
図１の中継サーバ１０の処理をプログラムにより実行する場合、図１３に示すような情報処理装置（コンピュータ）が用いられる。図１３の情報処理装置は、Central  Processing  Unit（ＣＰＵ）１４０１、メモリ１４０２、入力装置１４０３、出力装置１４０４、外部記憶装置１４０５、媒体駆動装置１４０６、およびネットワーク接続装置１４０７を有し、互いに接続されている。
【００９２】
メモリ１４０２は、例えば、Read  Only  Memory（ＲＯＭ）、Random  Access  Memory（ＲＡＭ）等を含み、処理に用いられるプログラムおよびデータを格納する。ＣＰＵ１４０１は、メモリ１４０２を利用してプログラムを実行することにより、中継サーバと同様の処理を行う。
【００９３】
入力装置１４０３は、例えば、キーボード、ポインティングデバイス等であり、オペレータからの指示や情報の入力に用いられる。出力装置１４０４は、例えば、ディスプレイ、プリンタ、スピーカ等であり、オペレータへの問い合わせや処理結果の出力に用いられる。
【００９４】
外部記憶装置１４０５は、例えば、磁気ディスク装置、光ディスク装置、光磁気ディスク装置、テープ装置等である。情報処理装置は、この外部記憶装置１４０５に、プログラムおよびデータを格納しておき、必要に応じて、それらをメモリ１４０２にロードして使用する。
【００９５】
媒体駆動装置１４０６は、可搬記録媒体１４０８を駆動し、その記録内容にアクセスする。可搬記録媒体１４０８は、メモリカード、フレキシブルディスク、光ディスク、光磁気ディスク等の任意のコンピュータ読み取り可能な記録媒体である。オペレータは、この可搬記録媒体１４０８にプログラムおよびデータを格納しておき、必要に応じて、それらをメモリ１４０２にロードして使用する。
【００９６】
ネットワーク接続装置１４０７は、インターネット等の通信ネットワークに接続され、クライアント及び各目的サーバとの通信に伴うデータ変換を行う。また、情報処理装置は、必要に応じて、プログラムおよびデータを外部の装置からネットワーク接続装置１４０７を介して受け取り、それらをメモリ１４０２にロードして使用する。
【符号の説明】
【００９７】
１０、１０Ａ  中継サーバ
１１  リクエスト判別部
１２  中継部
１２ａ  リクエスト代行部
１２ｂ  ＵＲＩ置換部
１２ｃ  クッキー置換部
１２ｄ  スクリプト追加部
１３  クッキー操作ページ返却部
１４  画像クッキー処理部
１４ａ  ＵＲＩ置換部
１４ｂ  レスポンス作成部
１４ｃ  一時保管部
【図１】
0005581820.tif 000002
【図２】
0005581820.tif 000003
【図３】
0005581820.tif 000004
【図４】
0005581820.tif 000005
【図５】
0005581820.tif 000006
【図６】
0005581820.tif 000007
【図７】
0005581820.tif 000008
【図８】
0005581820.tif 000009
【図９】
0005581820.tif 000010
【図１０】
0005581820.tif 000011
【図１１】
0005581820.tif 000012
【図１２】
0005581820.tif 000013
【図１３】
0005581820.tif 000014
【図１４】
0005581820.tif 000015