中継サーバ装置、クッキー制御方法およびクッキー制御プログラム
【課題】中継サーバを経由してブラウザからWebアプリケーションにアクセスする場合であっても、クッキー情報の書き込み処理を適切に実行する。
【解決手段】中継サーバ10は、Webサーバ20からのレスポンスヘッダのSet-Cookieやスクリプト内のdocument.cookieへの代入をsetCookieFunc関数への呼び出しへと置換し、HTML文書内に追加する。そして、ブラウザ30は、祖先ドメインを中継サーバへのURI置換を行い、クッキーのパス指定のあるディレクトリに予約済みのファイル名を付加したURIを表示するためのiframe要素を作成する。その後、ブラウザ30は、作成したiframeにpostMessageなどのクロスドメイン通信を行って親フレームから子フレームのドメインにクッキーのセット指示を出す。その後、iframe側で祖先ドメインに対応付けてクッキーセットを行う。
【解決手段】中継サーバ10は、Webサーバ20からのレスポンスヘッダのSet-Cookieやスクリプト内のdocument.cookieへの代入をsetCookieFunc関数への呼び出しへと置換し、HTML文書内に追加する。そして、ブラウザ30は、祖先ドメインを中継サーバへのURI置換を行い、クッキーのパス指定のあるディレクトリに予約済みのファイル名を付加したURIを表示するためのiframe要素を作成する。その後、ブラウザ30は、作成したiframeにpostMessageなどのクロスドメイン通信を行って親フレームから子フレームのドメインにクッキーのセット指示を出す。その後、iframe側で祖先ドメインに対応付けてクッキーセットを行う。
【発明の詳細な説明】
【技術分野】
【0001】
本発明は、中継サーバ装置、クッキー制御方法およびクッキー制御プログラムに関する。
【背景技術】
【0002】
近年、Webサーバがブラウザを通じてクライアントのコンピュータに一時的にクッキー情報を書き込んで保存させるクッキー(cookie)に関する技術が知られている。このように保存されたクッキー情報について、ブラウザがアクセスした複数のドメインの祖先ドメインが共通する場合には、クッキー情報を共有して利用することが知られている。例えば、ドメイン「sso.example.com」とドメイン「ap1.example.com」とは、祖先ドメイン「example.com」が共通しており、「sso.example.com」にアクセスしたブラウザと「ap1.example.com」にアクセスしたブラウザとでクッキー情報を共有して利用する。
【0003】
ここで、図14の例を用いて、祖先ドメインが共通する場合に、クッキーを共有して利用する処理について説明する。図14は、祖先ドメインが共通する場合に、クッキーを共有する処理について説明する図である。例えば、図14に示すように、ユーザがクライアント装置のブラウザA上から「sso.example.com」のWebアプリケーションでログイン処理を行うと、祖先ドメイン「example.com」の指定があるクッキーセット指示がWebサーバからブラウザAへ送信される。図14の例では、クッキーセット指示として、「Set-Cookie:sid=1234;domain=.example.com」というSet-Cookieヘッダを含んだHTTP(Hypertext Transfer Protocol)レスポンスがWebサーバからブラウザAに送信される。
【0004】
そして、ブラウザAは、クッキーセット指示「Set-Cookie:sid=1234;domain=.example.com」を受信すると、祖先ドメイン「example.com」を特定し、祖先ドメイン「example.com」に対応付けてクッキー情報「sid=1234」を書き込む。
【0005】
このように書き込まれたクッキーは、祖先ドメイン「.example.com」に対応付けて記憶されているため、「sso.example.com」だけでなく「ap1.example.com」にアクセスする場合にも、クッキーを送信する。例えば、「sso.example.com」へのログイン処理後に、ユーザがブラウザBから「ap1.example.com」にアクセスすると、「sso.example.com」へのログイン処理で送られてきたクッキー「Cookie:sid=1234」をHTTPリクエストのヘッダとしてWebサーバに送信する。
【0006】
また、Webサーバとクライアント装置との間に、URI(Uniform Resource Identifier)を置換する中継サーバが設けられている場合がある。具体的には、中継サーバは、URIのドメイン部分のドット「.」をハイフン「-」に置換するとともに中継サーバのホスト名を付加して、URIを置換する。例えば、図14の例を用いて説明すると、中継サーバは、中継サーバのホスト名が「r.test」である場合には、「sso.example.com」を「http-sso-example-com.r.test」に置換し、「ap1.example.com」を「http-ap1-example-com.r.test」に置換する。
【先行技術文献】
【特許文献】
【0007】
【特許文献1】特開2009−271676号公報
【発明の概要】
【発明が解決しようとする課題】
【0008】
しかしながら、上述した中継サーバがURIを置換する技術では、URIのドメイン部分が置換されるので、ドメインの親子関係が消滅してしまい、クッキー共有ができなくなり、クッキー情報の書き込み処理を適切に実行することができないという問題があった。
【0009】
例えば、図14の例では、「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」であることを特定できない。このため、ドメインの親子関係が消滅してしまい、祖先ドメインのクッキー情報の書き込み処理を適切に実行することができない。
【0010】
一つの側面では、中継サーバを経由してブラウザからWebアプリケーションにアクセスする場合であっても、クッキー情報の書き込み処理を適切に実行することを目的とする。
【課題を解決するための手段】
【0011】
第一の案では、サーバからブラウザに対するクッキー書き込み指示情報を受信した場合に、該クッキー書き込み指示情報をスクリプトの呼び出し情報に置換する。そして、スクリプトの呼び出し情報に対して、ブラウザのリクエスト先ドメインの祖先ドメインに対応するフレームを作成させるとともに該フレームに祖先ドメインに対応するクッキーの書き込み指示をクロスドメイン通信で送信するスクリプトを追加する。
【発明の効果】
【0012】
中継サーバを経由してブラウザからWebアプリケーションにアクセスする場合であっても、クッキー情報の書き込み処理を適切に実行することができる。
【図面の簡単な説明】
【0013】
【図1】図1は、実施例1に係る中継サーバ装置の構成を示すブロック図である。
【図2】図2は、クッキーの書き込み処理を説明する図である。
【図3】図3は、クッキーの読み取り処理を説明する図である。
【図4】図4は、実施例1に係る中継サーバ装置によるクッキー書き込み処理の流れを示すシーケンス図である。
【図5】図5は、実施例1に係る中継サーバ装置によるクッキー読み取り処理の流れを示すシーケンス図である。
【図6】図6は、実施例2に係る中継サーバ装置の構成を示すブロック図である。
【図7】図7は、中継サーバが受信する画像データのリクエストの一例を説明する図である。
【図8】図8は、祖先ドメイン氏名のあるクッキーがヘッダに付与された画像データの一例を説明する図である。
【図9】図9は、一時保管部のデータベータに記憶されるデータ例を示す図である。
【図10】図10は、実施例2に係る中継サーバ装置による画像クッキー処理の流れを示すシーケンス図である。
【図11】図11は、実施例2に係る中継サーバ装置による処理の流れを示すフローチャートである。
【図12】図12は、実施例2に係る中継サーバ装置による処理の流れを示すフローチャートである。
【図13】図13は、クッキー書込読取プログラムを実行するコンピュータを示す図である。
【図14】図14は、祖先ドメインが共通する場合に、クッキーを共有する処理について説明する図である。
【発明を実施するための形態】
【0014】
以下に添付図面を参照して、この発明に係る中継サーバ装置、クッキー制御方法およびクッキー制御プログラムの実施例を詳細に説明する。
【実施例1】
【0015】
以下の実施例では、実施例1に係る中継サーバの構成および処理の流れを順に説明し、最後に実施例1による効果を説明する。
【0016】
[中継サーバの構成]
まず最初に、図1を用いて、中継サーバ10の構成を説明する。図1は、実施例1に係る中継サーバ10の構成を示すブロック図である。図1に示すように、この中継サーバ10は、リクエスト判別部11、中継部12、クッキー操作ページ返却部13を有し、Webサーバ20および利用者端末のブラウザ30と接続される。以下にこれらの各部の処理を説明する。
【0017】
Webサーバ20は、中継サーバ10を経由して利用者端末のブラウザ30からアクセスがあると、アクセスをしてきた利用者端末のブラウザ30に対してHTML(HyperText Markup Language)文書や画像などの情報をレスポンスとして中継サーバ10経由で送信する。ブラウザ30は、中継サーバ10を経由してWebサーバ20にリクエストを送信し、リクエストに対するレスポンスを中継サーバ10経由でWebサーバ20から受信する。
【0018】
リクエスト判別部11は、リクエストのパスが特定のファイル名(例えば、「CookieHandler.html」)であるか判定し、リクエストのパスが特定のファイル名である場合に、クッキー操作ページへのリクエストであると判別する。具体的には、リクエスト判別部11は、ブラウザからリクエストを受信し、リクエストのパス部分を検出し、パスのファイル名と特定のファイル名(例えば、「CookieHandler.html」)とが一致しているか判定する。
【0019】
この結果、リクエスト判別部11は、リクエストのパス部分を検出し、パスのファイル名と特定のファイル名とが一致すると判定した場合には、後述するクッキー操作ページ返却部13へリクエストを通知する。また、リクエスト判別部11は、リクエストのパス部分を検出し、パスのファイル名と特定のファイル名とが一致しないと判定した場合には、後述する中継部12へURIを通知する。
【0020】
例えば、リクエスト判別部11は、リクエストのパスが「/CookieHandler.html」や「/dir1/dir2/CookieHandler.html」となっているリクエストについては、クッキー操作ページ返却部13にリクエストを通知する。
【0021】
また、リクエスト判別部11は、リクエストのパスが「/」や「/CookieHandler.html/dir/」なっているリクエストについては、中継部12へリクエストを通知する。なお、「CookieHandler.html」などの指定のファイル名は、中継サーバが自由に設定できるものであり、別のファイル名でもよく、他のWebサーバで使われていないファイル名で設定するのがよい。
【0022】
中継部12は、Webサーバ20と利用者端末のブラウザ30との間の通信を中継し、リクエスト代行部12a、URI置換部12b、クッキー置換部12c、スクリプト追加部12dを有する。
【0023】
URI置換部12bは、Webサーバ20からブラウザ30に対するレスポンスを受信した場合に、ブラウザ30のURIを置換する。具体的には、URI置換部12bは、Webサーバ20から受信したURIのドメイン部分のドット「.」をハイフン「-」に置換するとともに、中継サーバのホスト名「r.test」を付加する。
【0024】
例えば、URI置換部12bは、Webサーバ20から「http://sso.example.com」を受信すると、「http://http-sso-example-com.r.test」に置換する。また、URI置換12bは、ブラウザ30から「http://http-sso-example-com.r.test/login/login」を受信すると、「http://sso.example.com/login/login」に復元し、リクエスト代後部12aに通知する。
【0025】
リクエスト代行部12aは、利用者端末のブラウザ30から受信したリクエストを受信すると、リクエスト中のドメインを解釈してWebサーバにリクエストを送信する。具体的には、リクエスト代行部12aは、URI置換部12bからURIを受信し、受信されたURIを用いて、Webサーバ20にリクエストを送信する。
【0026】
クッキー置換部12cは、Webサーバ20からブラウザ30に対するクッキー書き込み指示情報を受信した場合に、クッキー書き込み指示情報をスクリプトの呼び出し情報に置換する。具体的には、クッキー置換部12cは、Webサーバ20からのレスポンスにSet-CookieヘッダやJava(登録商標)Script中のdocument.cookieへの代入が含まれているか判定する。この結果、Webサーバ20からのレスポンスにSet-Cookieヘッダやスクリプト中のdocument.cookieへの代入が含まれていると判定した場合には、Set-Cookieヘッダやスクリプト中のdocument.cookieをsetCookieFunc関数の呼び出しへと置換する。
【0027】
スクリプト追加部12dは、スクリプトの呼び出し情報に対して、ブラウザ20のドメインの祖先ドメインに対応するフレームを作成させるとともにフレームに祖先ドメインに対応するクッキーの書き込み指示をクロスドメイン通信で指示するスクリプトを追加する。例えば、スクリプト追加部12dは、クッキー置換部12cによってsetCookieFunc関数の呼び出しに置換された後に、setCookieFunc関数の定義をHTML文書内に追加する。
【0028】
また、スクリプト追加部12dは、祖先ドメインのフレームのパスのディレクトリをブラウザ20からのレスポンスの受信先フレームのパスのディレクトリと同じにしたiframe要素を作成するスクリプトを追加する。
【0029】
例えば、スクリプト追加部12dは、親フレームが「http://sso.example.com/login/login」であり、「Set-Cookie:sid=1234;domain=.example.com;path=/」のクッキーが送られてきた場合には、iframeのURIが「http://http-example-com.r.test/login/CookieHandler.html」となる。つまり、祖先ドメインのフレームのパスのディレクトリと受信先フレームのパスのディレクトリとを「/login/」でそろえる。これにより、Set-CookieヘッダやJavaScript中のdocument.cookieへの代入でドメインやパスの指定がある場合にも、適切にクッキーを処理することができる。
【0030】
また、スクリプト追加部12dは、祖先ドメインに対応するフレームを作成させるとともに該フレームに祖先ドメインのクッキーを取得させて親フレームにクロスドメイン通信で送信させる処理を一定時間ごとに行わせるスクリプトを追加する。
【0031】
例えば、Webサーバ20からHTMLドキュメントのレスポンスを受信した場合に、HTMLドキュメントに対して祖先ドメインからクッキーをコピーしてくるための読取スクリプトを追加する。
【0032】
クッキー操作ページ返却部13は、中継サーバ10内に格納されているHTMLとスクリプトで構成されたクッキー操作ページを返信する。ここで、クッキー操作ページとは、ブラウザ30におけるiframe内に読み込まれることを想定されており、ドメインをまたがったクッキーの読書きを行う。なお、クッキー操作ページには、クロスドメイン通信でのセキュリティを保つためのロジックも含めるようにしてもよい。
【0033】
ここで、クッキーの書き込み処理について図2を用いて具体的に説明する。図2に示すように、中継サーバ10は、Webサーバ20からのレスポンスヘッダのSet-Cookieやスクリプト内のdocument.cookieへの代入を受信すると、ヘッダやスクリプトをsetCookieFunc関数への呼び出しへと置換し、setCookieFunc関数をHTML文書内に追加する。例えば、中継サーバ10は、Set-Cookie:sid=1234;domain=.example.com; path=/のヘッダをsetCookieFunc(“sid=1234;domain=.example.com;path=/”)のスクリプトに置換し、ブラウザ30に送信する。
【0034】
そして、ブラウザ30は、setCookieFunc関数が呼ばれると、祖先ドメインの指定があるか判定する。この結果、ブラウザ30は、祖先ドメインの指定がないと判定した場合には、document.cookieにクッキーの内容を代入することでブラウザのクッキーに登録する。また、ブラウザ30は、祖先ドメインの指定があると判定した場合には、祖先ドメインを中継サーバへのURI置換を行い、親フレームと同じディレクトリにCookieHandler.htmlという予約済みのファイル名を付加したURIを表示するためのiframe要素を作成し、中継サーバ10からCookieHandler.htmlを取得する。
【0035】
その後、ブラウザ30は、作成したiframeにpostMessageなどのクロスドメイン通信を行って親フレームから子フレームのドメインにクッキーのセット指示を出す。指示を受けたiframe側のCookieHandler.html内のスクリプトでは、指示元が子孫ドメインであるかを確認する。この結果、指示元が子孫ドメインである場合には、iframe側でdocument.cookieにクッキーの内容を代入することで祖先ドメインへのクッキーセットを行う。
【0036】
次に、図3を用いて、クッキーの読み取り処理について具体的に説明する。クッキーの読み取り処理を行うケースとして、ブラウザがHTTPリクエストにCookieヘッダを付与して送信する場合と、スクリプトがdocument.cookieを読み取る場合の2種類がある。図3に示すように、中継サーバ10は、ブラウザ30からのリクエストに対してWebサーバ20からHTMLドキュメントを取得する。
【0037】
そして、中継サーバ10は、取得したHTMLドキュメントに対してクッキーの読取スクリプトを追加し、ブラウザ30に送信する。その後、読み取りスクリプトがブラウザ30上で実行され、元のドメインの祖先ドメインでCookieHandler.htmlを読み込むためのiframe要素を作成する。
【0038】
例えば、ブラウザ30が、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の個数はゼロや複数もありうる。
【0039】
そして、ブラウザ30は、中継サーバ10からCookieHandler.htmlを読み込んだ後に、iframeに対してクロスドメイン通信でクッキーの取得指示を送る。iframe側のCookieHandler.htmlのスクリプトがクロスドメイン通信の送信元を確認して子孫ドメインからの通信であるかを確認する。
【0040】
この結果、子孫ドメインからの通信であることの確認が取れた場合には、スクリプトでdocument.cookieの値を読み取る。ここで読み取れるクッキーについて、CookieHandler.htmlのドメインとパスに該当するものを読取ることができる。
【0041】
その後、クロスドメイン通信で親フレームにクッキーの内容を伝える。親フレームは、クロスドメイン通信の送信元が祖先ドメインであることを確認し、document.cookieにクッキーの内容を代入して祖先ドメインのクッキーを親フレームのドメインでも使えるようにする。その後、クッキーの一貫性を保つために、親フレームのdocument.cookieに代入するクッキーは expires を短く設定し、フレーム間でのクッキーの読み取りを一定時間おきに繰り返して実行する。これにより、祖先ドメインであって指定パスに該当するクッキーを読み取ることができる。
【0042】
[中継サーバによる処理]
次に、図4を用いて、実施例1に係る中継サーバ10によるクッキー書き込み処理を説明する。図4は、実施例1に係る中継サーバ装置によるクッキー書き込み処理の流れを示すシーケンス図である。以下の例では、http://sso.example.com/login/でログイン処理を行うと、Set-Cookie:sid=1234;domain=.example.com;path=/のレスポンスヘッダが返ってくるものとする。
【0043】
図4に示すように、中継サーバ10は、ブラウザ30からログインリクエストを受信する(ステップS101)。例えば、初期状態ではブラウザ30がhttp://sso.example.com/login/を中継サーバ10経由のhttp://http-sso-example-com.r.test/login/で開いている。そして、入力フォーム内のユーザ名とパスワードが入力され、ログインボタンが押されると、ブラウザ30がhttp://http-sso-example-com.r.test/login/loginにログインリクエストを送信する。
【0044】
続いて、中継サーバ10は、中継サーバのリクエスト判別部11がパスの/login/loginが「CookieHandler.html」と異なることから中継部12に処理を割り振る。そして、中継部12のURI置換部12bは、URIの復元を行いhttp://sso.example.com/login/loginというURIを得る(ステップS102)。
【0045】
そして、中継部12のリクエスト代行部12aは、Webサーバ20に対してリクエストを送信する(ステップS103)。続いて、Webサーバ20は、ユーザ名とパスワードのチェックを行って妥当性が確認できると、Set-Cookie:sid=1234;domain=.example.com;path=/ヘッダの付いたレスポンスを中継サーバ10へ返信する(ステップS104)。
【0046】
その後、中継サーバ10は、Webサーバ20から返ってきたレスポンスに対してURI置換、クッキー置換、スクリプト追加を行う(ステップS105)。例えば、中継サーバ10は、クッキー置換として、Set-Cookie:sid=1234; domain=.example.com;path=/のヘッダをsetCookieFunc(“sid=1234;domain=.example.com;path=/”)のスクリプトに置換する。
【0047】
そして、中継サーバ10は、URI置換、クッキー置換、スクリプト追加が行われたレスポンスをブラウザ30に送信する(ステップS106)。そして、ブラウザ30は、追加されたスクリプトによってiframeを作成する(ステップS107)。ここで、sso.example.comの祖先ドメインがexample.comの一つだけであり、パスが/login/loginであるため、作成されるiframeのURIがhttp://http-example-com.r.test/login/CookieHandler.htmlとなる。
【0048】
そして、中継サーバ10のリクエスト判別部11は、URI「http://http-example-com.r.test/login/CookieHandler.html」でのリクエストをブラウザ30のiframeから受信する(ステップS108)。そして、リクエスト判別部11は、パスのファイル名がCookieHandler.htmlであることからクッキー操作ページ返却部13に処理を割り振る。続いて、クッキー操作ページ返却部13は、クッキー操作ページをクライアントに返信する(ステップS109)。
【0049】
その後、ブラウザ30側でsetCookieFunc関数が呼び出されると、指定されてあるドメインの.example.comに対応するiframeのhttp://http-example-com.r.test/login/CookieHandler.htmlに対してクロスドメイン通信でクッキーセット要求を送る(ステップS110)。そして、クロスドメイン通信を受けたiframeは、クロスドメインの通信元の妥当性をチェックする。図4の例では、送信元のドメインがhttp-sso-example-com.r.testであり、iframeのドメインがhttp-example-com.r.testとなっており、置換前のドメインでは親子関係であるため妥当であると判断する。妥当であると判断された場合には、iframe側では、document.cookie=“sid=1234;path=/”のスクリプトを実行しクッキーのセットを行う(ステップS111)。
【0050】
次に、図5を用いて、実施例1に係る中継サーバ10によるクッキー読み取り処理を説明する。図5は、実施例1に係る中継サーバ装置によるクッキー読み取り処理の流れを示すシーケンス図である。以下の例では、図4で説明したログイン処理の後でアプリケーションのapp1を利用した場合について説明する。app1では、http://app1.example.com/sso/にアクセスすると、SSO認証が行われるものとする。
【0051】
図5に示すように、ブラウザ30は、中継サーバ10経由でhttp://app1.example.com/にアクセスして、http://http-app1-example-com.r.test/にリクエストを送る(ステップS201)。そして、中継サーバ10のリクエスト判別部11は、パス部分の/がCookieHandler.htmlと異なるため、中継部12へリクエスト処理を割り振る。
【0052】
そして、中継部12のURI置換部12bは、URIをhttp://app1.example.com/に復元する(ステップS202)。続いて、リクエスト代行部12aは、復元されたURIに対しリクエストを送ると(ステップS203)、Webサーバ20からレスポンスを受信する(ステップS204)。
【0053】
そして、中継サーバ10は、Webサーバ20から返ってきたレスポンスに対してURI置換、クッキー置換、スクリプト追加を行う(ステップS205)。ここでは、レスポンスにはSet-Cookieヘッダやスクリプト中のdocument.cookieへの代入が含まれていないので、クッキー置換を行わない。その後、中継サーバ10は、レスポンスをブラウザ30に送信する(ステップS206)。
【0054】
そして、ブラウザ30は、追加されたスクリプトでiframeを作成する(ステップS207)。app1.example.comの祖先ドメインは、「example.com」の一つだけであり、パスが「/」であるため、作成されるiframeのURIがhttp://http-example-com.r.test/CookieHandler.htmlとなる。そして、ブラウザ内のiframeは、このURIでのリクエストを中継サーバ10に送信して、/CookieHandler.htmlを読み込む(ステップS208)。
【0055】
そして、リクエスト判別部11は、パスが/CookieHandler.htmlであるので、クッキー操作ページ返却部13に処理を割り振る。クッキー操作ページ返却部13は、クッキー操作ページをクライアントに返却する(ステップS209)。続いて、ブラウザの親フレームがiframeに対してクロスドメイン通信でクッキーの取得要求を出す(ステップS210)。iframe側では、クロスドメイン通信の通信元がiframeのドメインの子孫ドメインであることを確認し、document.cookieプロパティを参照してブラウザ30がhttp-example.com.r.testドメインの/パスで保存しているクッキーを読み取る(ステップS211)。例えば、document.cookieを参照することでsid=1234のクッキーを読み取る。
【0056】
そして、iframeは、読み取ったクッキーをクロスドメイン通信で親フレームのhttp://http-app1-example-com.r.test/に送信する(ステップS212)。親フレームでは、クロスドメイン通信の通信元が祖先ドメインであるかを確認して、document.cookieプロパティにクッキーの内容を代入する(ステップS213)。これにより、親フレームのドメインで祖先ドメインのクッキーが読めるようになる。また、クッキーの一貫性のためにタイマー等でステップS210〜S213を繰り返し実行する。
【0057】
そして、ユーザがブラウザ30上に表示されているSSOのためのリンクをクリックすると(ステップS214)、ブラウザ30は、http://http-app1-example-com.r.test/sso/にリクエストを送ろうとする(ステップS215)。ここでは、祖先ドメインのクッキーがコピーされているため、ブラウザ30は、クッキーとしてCookie:sid=1234を付与してリクエストを送る。
【0058】
中継サーバ10のリクエスト判別部11は、リクエストを受信するとき、パスが/sso/であり、/CookieHandler.htmlでないので、中継部12にリクエスト処理を割り振る。中継部12のURI置換部12bがURIをhttp://app1.example.com/sso/と復元し(ステップS216)、リクエスト代行部12aがCookie: sid=1234のヘッダがついたリクエストをhttp://app1.example.com/sso/に送信する(ステップS217)。その後、Webサーバ20では、クッキーのsidの値を見てSSO認証を行うことになる。これによってドメインをまたがったSSO認証が中継サーバ10を介しても正常に行われることになる。
【0059】
[実施例1の効果]
上述してきたように、中継サーバ10は、Webサーバ20からブラウザ30に対するレスポンスを中継した場合に、リクエストのURIを置換する。そして、中継サーバ10は、Webサーバ20からブラウザ10に対するクッキー書き込み指示情報を受信した場合に、クッキー書き込み指示情報をスクリプトの呼び出し情報に置換する。その後、中継サーバ10は、置換されたスクリプトの呼び出し情報に対して、ブラウザ30のリクエスト先ドメインの祖先ドメインに対応するフレームを作成させるスクリプトを追加する。また、中継サーバ10は、フレームに祖先ドメインに対応するクッキーの書き込み指示をクロスドメイン通信で送信するスクリプトを追加する。このため、中継サーバを経由してブラウザからWebアプリケーションにアクセスする場合であっても、クッキー情報の書き込む処理を適切に実行することが可能である。
【0060】
また、実施例1によれば、中継サーバ10は、祖先ドメインのフレームのパスのディレクトリをブラウザ30からのレスポンスの受信先フレームのパスのディレクトリと同じにさせるスクリプトをさらに追加する。このため、Set-CookieヘッダやJavaScript中のdocument.cookieへの代入でドメインやパスの指定がある場合にも、iframeのパスのディレクトリを親フレームのパスのディレクトリとそろえる。この結果、祖先ドメインおよび指定パスに該当するクッキー情報の書き込む処理を適切に実行することが可能である。
【0061】
また、実施例1によれば、中継サーバ10は、Webサーバ20からブラウザ30に対するレスポンスを受信する。そして、中継サーバ10は、祖先ドメインに対応するフレームを作成させるとともに該フレームに祖先ドメインのクッキーを取得させて該クッキーをレスポンスの受信先フレームにクロスドメイン通信で送信させるスクリプトを追加する。このため、クッキー情報の読み取り処理を適切に実行することが可能である。
【0062】
また、実施例1によれば、中継サーバ10は、祖先ドメインに対応するフレームに祖先ドメインのクッキーを取得させてクッキーをレスポンスの受信先フレームにクロスドメイン通信で送信させる処理を一定時間ごとに行わせるスクリプトを追加する。このため、祖先ドメインの一貫性を保つことが可能である。
【実施例2】
【0063】
ところで、上記の実施例1では、HTMLやJavaScriptにSet-Cookieヘッダが付いている場合に、スクリプトに変換してクッキーの読み書き処理を行う場合を説明したが、本実施例はこれに限定されるものではなく、画像などにSet-Cookieヘッダが付いている場合にも、クッキーの書き込み処理を行う。
【0064】
例えば、ブラウザは、「http://www.example.com/image.jpg」を中継サーバ経由で読みこむために、図7に例示するようなHTTPのリクエストをWebサーバへ送信する。そして、Webサーバは、祖先ドメイン指定のあるクッキー「key=value;domain=.example.com;path=/」をヘッダに付けて、図8に例示するようなレスポンスを中継サーバ経由でブラウザに送信する。
【0065】
まず最初に、実施例2に係る中継サーバ10Aの構成を説明する。図6に示すように、中継サーバ10Aは、図1に示した中継サーバ10と比較して、画像クッキー処理部14を新たに有する点が相違する。かかる中継サーバ10Aにおいて、画像クッキー処理部14は、URI置換部14a、レスポンス作成部14b、一時保管部14cを有する。
【0066】
リクエスト判別部11は、実施例1と同様に、リクエストのパスが「/CookieHandler.html」や「/dir1/dir2/CookieHandler.html」となっているリクエストについては、クッキー操作ページ返却部13にリクエストを通知する。また、リクエスト判別部11は、実施例1と同様に、リクエストのパスが「/」や「/CookieHandler.html/dir/」となっているリクエストについては、中継部12へリクエストを通知する。また、リクエスト判別部11は、URIのクエリパラメータにSetCookieWithRedirection=trueを含んでいるリクエストについては、画像クッキー処理部14にリクエストを通知する。
【0067】
URI置換部14aは、Webサーバ20から受信したURIのドメイン部分を置換し、ブラウザ30から受信したURIのドメイン部を復元する。具体的には、URI置換部14aは、Webサーバ20から受信したURIのドメイン部分のドット「.」をハイフン「-」に置換するとともに、中継サーバのホスト名「r.test」を付加する。
【0068】
レスポンス作成部14bは、クッキー書き込み指示情報に含まれるクッキーを書き込んだ格納先であるURIをリダイレクト先としてブラウザ30に送信する。具体的には、レスポンス作成部14bは、データベースに格納されているcookiesの中から任意のクッキーを一つ取得し、このクッキーをセットできるURIへのリダイレクトをブラウザに送信する。
【0069】
そして、レスポンス作成部14bは、ブラウザ30からリダイレクト先に対するリクエストがあった場合には、クッキーをブラウザ30に送信するとともに、リダイレクト先に再度リクエストさせるレスポンスを作成する。そして、レスポンス作成部14bは、ブラウザ30からリダイレクト先に対するリクエストが再度あった場合には、一時保管部14cに格納されたレスポンスボディをブラウザ30に返信する。
【0070】
一時保管部14cは、サーバからブラウザに対するレスポンスに含まれるレスポンスボディがHTMLやJavaScriptではなく、祖先ドメイン指定のあるクッキー書き込み指示情報が含まれている場合に、クッキー書き込み指示情報に含まれるクッキーおよびレスポンスボディを記憶する。
【0071】
具体的には、一時保管部14cは、図9に示すように、一意に割り当てられた値である「id」、乱数によって生成された値である「token」、後述する図10のresp1rのSet-Cookieヘッダのうち祖先ドメインのドメイン指定のあるクッキーである「cookies」を対応付けて記憶する。また、一時保管部14cは、図9に示すように、画像データのレスポンスボディである「respBody」、ブラウザ30からWebサーバ20へのリクエストのURIを復元したURIである「returnTo」を対応付けて記憶する。
【0072】
次に、図10〜図12を用いて、実施例2に係る中継サーバ10Aによる処理を説明する。図10は、実施例2に係る中継サーバ装置による画像クッキー処理の流れを示すシーケンス図である。図11は、実施例2に係る中継サーバ装置による処理の流れを示すフローチャートである。図12は、実施例2に係る中継サーバ装置による処理の流れを示すフローチャートである。
【0073】
図10に示すように、ブラウザ30がhttp://www.example.com/image.jpgを中継サーバ経由で読み込むためにhttp://http-www-example-com.r.test/image.jpgにリクエストを送る(ステップS301)。そして、中継サーバ10Aは、リクエストを中継してhttp://www.example.com/image.jpgにリクエストを送る(ステップS302)。
【0074】
そして、Webサーバ20は,祖先ドメイン指定のあるクッキーkey=value;domain=.example.com;path=/をヘッダにつけて画像データを返す(ステップS303)。そして、中継サーバ10Aは、HTMLかJavaScriptのクッキーセット指示でなくて、かつ、祖先ドメイン指定があると判定した場合には、中継部12から画像クッキー処理部14に処理を委譲する。そして、画像クッキー処理部14では、一時保管部14cに対して新たな行を追加して、データを書き込む(ステップS304)。
【0075】
その後、レスポンス作成部14bは、一時保管部14cに格納されているcookiesの中から任意のクッキーを一つ取り出す。例えば、図9の例では、cookiesカラムにはクッキーが一つしか格納されていないため、key=value;domain=.example.com; path=/が取り出される。中継サーバ10は、取り出されたクッキーをセットできるURIであるhttp://http-example-com.r.test/?SetCookieWithRedirection=true&id=1234&token=0306へのリダイレクトをブラウザ30に返す(ステップS305)。なお、このURIでSetCookieWithRedirection=trueというクエリパラメータは、実施例1に登場したCookieHandler.htmlと同様に中継サーバが任意に設定できるものである。また、idとtokenのパラメータ名も中継サーバが自由に設定できる。
【0076】
ブラウザ30は、http://http-example-com.r.test/?SetCookieWithRedirection=true&id=1234&token=0306にリクエストを送り直す(ステップS306)。中継サーバ10のリクエスト判別部11は、リクエストされたURIのクエリパラメータにSetCookieWithRedirection=trueを含んでいるため画像クッキー処理部14のレスポンス作成部14bに処理を渡す。
【0077】
レスポンス作成部14bは、リクエストのidパラメータとtokenパラメータを取得し両者が一致する行を一時保管部14cから取得する。ステップS306において送信されたリクエストのURIを復元した時のドメインとパスは、example.comと/であり、このドメインとパスで設定することのできるクッキーをcookiesカラムから探すとkey=value;domain=.example.com;path=/が合致する。このため、レスポンス作成部14bは、このクッキーを一時保管部14cから取得してから削除する(ステップS307)。
【0078】
そして、中継サーバ10のレスポンス作成部14bは、cookiesカラムに残っているクッキーがなくなったので、returnToカラムの値をURI置換してクエリパラメータを追加する。そして、取得したクッキーをヘッダにつけてURIへのリダイレクトをブラウザに返す(ステップS308)。その後、ブラウザ30は、Set-Cookie:key=value;domain=.http-www-example-com.r.test;path=/のヘッダに従ってexample.comを置換したhttp-www-example-com.r.testドメインでのクッキーセットを行う。
【0079】
そして、ブラウザ30は、ステップS308で指示されているURIでリクエストを送り直す(ステップS309)。そして、中継サーバ10のリクエスト判別部11は、リクエストパラメータにSetCookieWithRedirection=trueがあるため画像クッキー処理部14に処理を渡す。
【0080】
レスポンス作成部14は、リクエストのidパラメータとtokenパラメータを取得し両者が一致する行を一時保管部14cから取得する。ステップS307においてcookiesカラムが空になっているため、respBodyの値を取得し、一時保管部14cから当該行を削除する(ステップS310)。その後、レスポンス作成部14は、respBodyでレスポンスを作成してブラウザ30に返す(ステップS311)。
【0081】
次に、図11および図12を用いて、実施例2に係る中継サーバによる処理の流れを説明する。図11および図12は、実施例2に係る中継サーバ装置による処理の流れを示すフローチャートである。図11に示すように、中継サーバ10Aは、レスポンスを受信すると(ステップS401肯定)、Webサーバ20からのレスポンスがHTMLまたはJavascriptであるか判定する(ステップS402)。
【0082】
この結果、中継サーバ装置10Aは、レスポンスがHTMLまたはJavascriptであると判定した場合には(ステップS402肯定)、実施例1で説明したように、クッキーセット指示をsetCookieFunc関数の呼び出しに置換する(ステップS403)。そして、中継サーバ装置10Aは、レスポンスにSet-Cookieヘッダやdocument.cookieへの代入が含まれておらず(ステップS402否定)、Set-Cookieヘッダが付いている場合には、ドメイン指定があるか判定する(ステップS404)。
【0083】
この結果、中継サーバ装置10Aは、祖先ドメインの指定がある場合には(ステップS404肯定)、クッキー読み取り処理と行削除処理(後に、図12を用いて詳述)を行う(ステップS405)。また、中継サーバ装置10Aは、祖先ドメインの指定がない場合には(ステップS404否定)、ヘッダにもともとついていたクッキーのドメインを置換する(ステップS406)。
【0084】
次に、図12を用いて、中継サーバ10Aによるクッキー読み取り処理と行削除処理について説明する。図12に示すように、同一ドメインのクッキーをレスポンスヘッダに追加し(ステップS501)、一時保管部14cに対して新たな行を作成する(ステップS502)。
【0085】
そして、中継サーバ10Aのレスポンス作成部14bは、一時保管部14cのcookiesカラムにクッキーがあるか判定する(ステップS503)。この結果、レスポンス作成部14bは、一時保管部14cのcookiesカラムにクッキーがある場合には(ステップS503肯定)、cookiesカラムからクッキーを一つ取得する(ステップS504)。そして、取得したクッキーをセットできるURIにリダイレクトをブラウザ30に送信する(ステップS505)。
【0086】
その後、中継サーバ10Aは、次のリクエストを待った後(ステップS506)、cookiesカラムにあるクッキーのうち現在のURIでセットできるクッキーをすべて取得し、当該クッキーをカラムから削除してレスポンスヘッダに追加する(ステップS507)。そして、ステップS503に戻って、一時保管部14cのcookiesカラムにクッキーがなくなるまでステップS504〜S507の処理を繰り返す。その後、一時保管部14cのcookiesカラムにクッキーがなくなると(ステップS503否定)、returnToカラムの値を取得する(ステップS508)。
【0087】
そして、取得したクッキーをヘッダにつけてURIへのリダイレクトをブラウザに返す(ステップS509)。その後、中継サーバ10は、リクエストを待った後(ステップS510)、リクエストのidパラメータとtokenパラメータを取得して両者が一致する行を一時保管部14cから取得してrespBodyの値を読み出し、当該行を削除する(ステップS511)。
【0088】
このように実施例2によれば、中継サーバ10Aは、Webサーバ20からブラウザ30に対するレスポンスに含まれるレスポンスボディがHTMLかJavaScriptではなくクッキー書き込み指示情報が含まれている場合に、クッキー書き込み指示情報に含まれるクッキーおよびレスポンスボディを一時保管部14cに格納する。そして、中継サーバ10Aは、クッキー書き込み指示情報に含まれるクッキーを書き込んだURIをリダイレクト先としてブラウザ30に送信する。続いて、中継サーバ10Aは、ブラウザ30からリダイレクト先に対するリクエストがあった場合には、クッキーをブラウザ30に送信するとともに、リダイレクト先に再度リクエストさせるレスポンスを作成する。その後、中継サーバ10Aは、ブラウザ30からリダイレクト先に対するリクエストが再度あった場合には、一時保管部14cに格納されたレスポンスボディをブラウザ30に返信する。このため、中継サーバ10Aは、画像などにSet-Cookieが付いている場合であっても、ブラウザ30にクッキーを適切に処理させることが可能となる。
【実施例3】
【0089】
さて、これまで実施例1、2について説明したが、上述した実施例以外にも、種々の異なる形態にて実施されてよいものである。そこで、以下では実施例3として他の実施例を説明する。
【0090】
(1)システム構成等
また、図示した各装置の各構成要素は機能概念的なものであり、必ずしも物理的に図示の如く構成されていることを要しない。すなわち、各装置の分散・統合の具体的形態は図示のものに限られず、その全部または一部を、各種の負荷や使用状況などに応じて、任意の単位で機能的または物理的に分散・統合して構成することができる。例えば、スクリプト追加部12dを書込スクリプト追加部と読取スクリプト追加部とに分散してもよい。さらに、各装置にて行なわれる各処理機能は、その全部または任意の一部が、CPUおよび当該CPUにて解析実行されるプログラムにて実現され、あるいは、ワイヤードロジックによるハードウェアとして実現され得る。
【0091】
(2)プログラム
図1の中継サーバ10の処理をプログラムにより実行する場合、図13に示すような情報処理装置(コンピュータ)が用いられる。図13の情報処理装置は、Central Processing Unit(CPU)1401、メモリ1402、入力装置1403、出力装置1404、外部記憶装置1405、媒体駆動装置1406、およびネットワーク接続装置1407を有し、互いに接続されている。
【0092】
メモリ1402は、例えば、Read Only Memory(ROM)、Random Access Memory(RAM)等を含み、処理に用いられるプログラムおよびデータを格納する。CPU1401は、メモリ1402を利用してプログラムを実行することにより、中継サーバと同様の処理を行う。
【0093】
入力装置1403は、例えば、キーボード、ポインティングデバイス等であり、オペレータからの指示や情報の入力に用いられる。出力装置1404は、例えば、ディスプレイ、プリンタ、スピーカ等であり、オペレータへの問い合わせや処理結果の出力に用いられる。
【0094】
外部記憶装置1405は、例えば、磁気ディスク装置、光ディスク装置、光磁気ディスク装置、テープ装置等である。情報処理装置は、この外部記憶装置1405に、プログラムおよびデータを格納しておき、必要に応じて、それらをメモリ1402にロードして使用する。
【0095】
媒体駆動装置1406は、可搬記録媒体1408を駆動し、その記録内容にアクセスする。可搬記録媒体1408は、メモリカード、フレキシブルディスク、光ディスク、光磁気ディスク等の任意のコンピュータ読み取り可能な記録媒体である。オペレータは、この可搬記録媒体1408にプログラムおよびデータを格納しておき、必要に応じて、それらをメモリ1402にロードして使用する。
【0096】
ネットワーク接続装置1407は、インターネット等の通信ネットワークに接続され、クライアント及び各目的サーバとの通信に伴うデータ変換を行う。また、情報処理装置は、必要に応じて、プログラムおよびデータを外部の装置からネットワーク接続装置1407を介して受け取り、それらをメモリ1402にロードして使用する。
【符号の説明】
【0097】
10、10A 中継サーバ
11 リクエスト判別部
12 中継部
12a リクエスト代行部
12b URI置換部
12c クッキー置換部
12d スクリプト追加部
13 クッキー操作ページ返却部
14 画像クッキー処理部
14a URI置換部
14b レスポンス作成部
14c 一時保管部
【技術分野】
【0001】
本発明は、中継サーバ装置、クッキー制御方法およびクッキー制御プログラムに関する。
【背景技術】
【0002】
近年、Webサーバがブラウザを通じてクライアントのコンピュータに一時的にクッキー情報を書き込んで保存させるクッキー(cookie)に関する技術が知られている。このように保存されたクッキー情報について、ブラウザがアクセスした複数のドメインの祖先ドメインが共通する場合には、クッキー情報を共有して利用することが知られている。例えば、ドメイン「sso.example.com」とドメイン「ap1.example.com」とは、祖先ドメイン「example.com」が共通しており、「sso.example.com」にアクセスしたブラウザと「ap1.example.com」にアクセスしたブラウザとでクッキー情報を共有して利用する。
【0003】
ここで、図14の例を用いて、祖先ドメインが共通する場合に、クッキーを共有して利用する処理について説明する。図14は、祖先ドメインが共通する場合に、クッキーを共有する処理について説明する図である。例えば、図14に示すように、ユーザがクライアント装置のブラウザA上から「sso.example.com」のWebアプリケーションでログイン処理を行うと、祖先ドメイン「example.com」の指定があるクッキーセット指示がWebサーバからブラウザAへ送信される。図14の例では、クッキーセット指示として、「Set-Cookie:sid=1234;domain=.example.com」というSet-Cookieヘッダを含んだHTTP(Hypertext Transfer Protocol)レスポンスがWebサーバからブラウザAに送信される。
【0004】
そして、ブラウザAは、クッキーセット指示「Set-Cookie:sid=1234;domain=.example.com」を受信すると、祖先ドメイン「example.com」を特定し、祖先ドメイン「example.com」に対応付けてクッキー情報「sid=1234」を書き込む。
【0005】
このように書き込まれたクッキーは、祖先ドメイン「.example.com」に対応付けて記憶されているため、「sso.example.com」だけでなく「ap1.example.com」にアクセスする場合にも、クッキーを送信する。例えば、「sso.example.com」へのログイン処理後に、ユーザがブラウザBから「ap1.example.com」にアクセスすると、「sso.example.com」へのログイン処理で送られてきたクッキー「Cookie:sid=1234」をHTTPリクエストのヘッダとしてWebサーバに送信する。
【0006】
また、Webサーバとクライアント装置との間に、URI(Uniform Resource Identifier)を置換する中継サーバが設けられている場合がある。具体的には、中継サーバは、URIのドメイン部分のドット「.」をハイフン「-」に置換するとともに中継サーバのホスト名を付加して、URIを置換する。例えば、図14の例を用いて説明すると、中継サーバは、中継サーバのホスト名が「r.test」である場合には、「sso.example.com」を「http-sso-example-com.r.test」に置換し、「ap1.example.com」を「http-ap1-example-com.r.test」に置換する。
【先行技術文献】
【特許文献】
【0007】
【特許文献1】特開2009−271676号公報
【発明の概要】
【発明が解決しようとする課題】
【0008】
しかしながら、上述した中継サーバがURIを置換する技術では、URIのドメイン部分が置換されるので、ドメインの親子関係が消滅してしまい、クッキー共有ができなくなり、クッキー情報の書き込み処理を適切に実行することができないという問題があった。
【0009】
例えば、図14の例では、「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」であることを特定できない。このため、ドメインの親子関係が消滅してしまい、祖先ドメインのクッキー情報の書き込み処理を適切に実行することができない。
【0010】
一つの側面では、中継サーバを経由してブラウザからWebアプリケーションにアクセスする場合であっても、クッキー情報の書き込み処理を適切に実行することを目的とする。
【課題を解決するための手段】
【0011】
第一の案では、サーバからブラウザに対するクッキー書き込み指示情報を受信した場合に、該クッキー書き込み指示情報をスクリプトの呼び出し情報に置換する。そして、スクリプトの呼び出し情報に対して、ブラウザのリクエスト先ドメインの祖先ドメインに対応するフレームを作成させるとともに該フレームに祖先ドメインに対応するクッキーの書き込み指示をクロスドメイン通信で送信するスクリプトを追加する。
【発明の効果】
【0012】
中継サーバを経由してブラウザからWebアプリケーションにアクセスする場合であっても、クッキー情報の書き込み処理を適切に実行することができる。
【図面の簡単な説明】
【0013】
【図1】図1は、実施例1に係る中継サーバ装置の構成を示すブロック図である。
【図2】図2は、クッキーの書き込み処理を説明する図である。
【図3】図3は、クッキーの読み取り処理を説明する図である。
【図4】図4は、実施例1に係る中継サーバ装置によるクッキー書き込み処理の流れを示すシーケンス図である。
【図5】図5は、実施例1に係る中継サーバ装置によるクッキー読み取り処理の流れを示すシーケンス図である。
【図6】図6は、実施例2に係る中継サーバ装置の構成を示すブロック図である。
【図7】図7は、中継サーバが受信する画像データのリクエストの一例を説明する図である。
【図8】図8は、祖先ドメイン氏名のあるクッキーがヘッダに付与された画像データの一例を説明する図である。
【図9】図9は、一時保管部のデータベータに記憶されるデータ例を示す図である。
【図10】図10は、実施例2に係る中継サーバ装置による画像クッキー処理の流れを示すシーケンス図である。
【図11】図11は、実施例2に係る中継サーバ装置による処理の流れを示すフローチャートである。
【図12】図12は、実施例2に係る中継サーバ装置による処理の流れを示すフローチャートである。
【図13】図13は、クッキー書込読取プログラムを実行するコンピュータを示す図である。
【図14】図14は、祖先ドメインが共通する場合に、クッキーを共有する処理について説明する図である。
【発明を実施するための形態】
【0014】
以下に添付図面を参照して、この発明に係る中継サーバ装置、クッキー制御方法およびクッキー制御プログラムの実施例を詳細に説明する。
【実施例1】
【0015】
以下の実施例では、実施例1に係る中継サーバの構成および処理の流れを順に説明し、最後に実施例1による効果を説明する。
【0016】
[中継サーバの構成]
まず最初に、図1を用いて、中継サーバ10の構成を説明する。図1は、実施例1に係る中継サーバ10の構成を示すブロック図である。図1に示すように、この中継サーバ10は、リクエスト判別部11、中継部12、クッキー操作ページ返却部13を有し、Webサーバ20および利用者端末のブラウザ30と接続される。以下にこれらの各部の処理を説明する。
【0017】
Webサーバ20は、中継サーバ10を経由して利用者端末のブラウザ30からアクセスがあると、アクセスをしてきた利用者端末のブラウザ30に対してHTML(HyperText Markup Language)文書や画像などの情報をレスポンスとして中継サーバ10経由で送信する。ブラウザ30は、中継サーバ10を経由してWebサーバ20にリクエストを送信し、リクエストに対するレスポンスを中継サーバ10経由でWebサーバ20から受信する。
【0018】
リクエスト判別部11は、リクエストのパスが特定のファイル名(例えば、「CookieHandler.html」)であるか判定し、リクエストのパスが特定のファイル名である場合に、クッキー操作ページへのリクエストであると判別する。具体的には、リクエスト判別部11は、ブラウザからリクエストを受信し、リクエストのパス部分を検出し、パスのファイル名と特定のファイル名(例えば、「CookieHandler.html」)とが一致しているか判定する。
【0019】
この結果、リクエスト判別部11は、リクエストのパス部分を検出し、パスのファイル名と特定のファイル名とが一致すると判定した場合には、後述するクッキー操作ページ返却部13へリクエストを通知する。また、リクエスト判別部11は、リクエストのパス部分を検出し、パスのファイル名と特定のファイル名とが一致しないと判定した場合には、後述する中継部12へURIを通知する。
【0020】
例えば、リクエスト判別部11は、リクエストのパスが「/CookieHandler.html」や「/dir1/dir2/CookieHandler.html」となっているリクエストについては、クッキー操作ページ返却部13にリクエストを通知する。
【0021】
また、リクエスト判別部11は、リクエストのパスが「/」や「/CookieHandler.html/dir/」なっているリクエストについては、中継部12へリクエストを通知する。なお、「CookieHandler.html」などの指定のファイル名は、中継サーバが自由に設定できるものであり、別のファイル名でもよく、他のWebサーバで使われていないファイル名で設定するのがよい。
【0022】
中継部12は、Webサーバ20と利用者端末のブラウザ30との間の通信を中継し、リクエスト代行部12a、URI置換部12b、クッキー置換部12c、スクリプト追加部12dを有する。
【0023】
URI置換部12bは、Webサーバ20からブラウザ30に対するレスポンスを受信した場合に、ブラウザ30のURIを置換する。具体的には、URI置換部12bは、Webサーバ20から受信したURIのドメイン部分のドット「.」をハイフン「-」に置換するとともに、中継サーバのホスト名「r.test」を付加する。
【0024】
例えば、URI置換部12bは、Webサーバ20から「http://sso.example.com」を受信すると、「http://http-sso-example-com.r.test」に置換する。また、URI置換12bは、ブラウザ30から「http://http-sso-example-com.r.test/login/login」を受信すると、「http://sso.example.com/login/login」に復元し、リクエスト代後部12aに通知する。
【0025】
リクエスト代行部12aは、利用者端末のブラウザ30から受信したリクエストを受信すると、リクエスト中のドメインを解釈してWebサーバにリクエストを送信する。具体的には、リクエスト代行部12aは、URI置換部12bからURIを受信し、受信されたURIを用いて、Webサーバ20にリクエストを送信する。
【0026】
クッキー置換部12cは、Webサーバ20からブラウザ30に対するクッキー書き込み指示情報を受信した場合に、クッキー書き込み指示情報をスクリプトの呼び出し情報に置換する。具体的には、クッキー置換部12cは、Webサーバ20からのレスポンスにSet-CookieヘッダやJava(登録商標)Script中のdocument.cookieへの代入が含まれているか判定する。この結果、Webサーバ20からのレスポンスにSet-Cookieヘッダやスクリプト中のdocument.cookieへの代入が含まれていると判定した場合には、Set-Cookieヘッダやスクリプト中のdocument.cookieをsetCookieFunc関数の呼び出しへと置換する。
【0027】
スクリプト追加部12dは、スクリプトの呼び出し情報に対して、ブラウザ20のドメインの祖先ドメインに対応するフレームを作成させるとともにフレームに祖先ドメインに対応するクッキーの書き込み指示をクロスドメイン通信で指示するスクリプトを追加する。例えば、スクリプト追加部12dは、クッキー置換部12cによってsetCookieFunc関数の呼び出しに置換された後に、setCookieFunc関数の定義をHTML文書内に追加する。
【0028】
また、スクリプト追加部12dは、祖先ドメインのフレームのパスのディレクトリをブラウザ20からのレスポンスの受信先フレームのパスのディレクトリと同じにしたiframe要素を作成するスクリプトを追加する。
【0029】
例えば、スクリプト追加部12dは、親フレームが「http://sso.example.com/login/login」であり、「Set-Cookie:sid=1234;domain=.example.com;path=/」のクッキーが送られてきた場合には、iframeのURIが「http://http-example-com.r.test/login/CookieHandler.html」となる。つまり、祖先ドメインのフレームのパスのディレクトリと受信先フレームのパスのディレクトリとを「/login/」でそろえる。これにより、Set-CookieヘッダやJavaScript中のdocument.cookieへの代入でドメインやパスの指定がある場合にも、適切にクッキーを処理することができる。
【0030】
また、スクリプト追加部12dは、祖先ドメインに対応するフレームを作成させるとともに該フレームに祖先ドメインのクッキーを取得させて親フレームにクロスドメイン通信で送信させる処理を一定時間ごとに行わせるスクリプトを追加する。
【0031】
例えば、Webサーバ20からHTMLドキュメントのレスポンスを受信した場合に、HTMLドキュメントに対して祖先ドメインからクッキーをコピーしてくるための読取スクリプトを追加する。
【0032】
クッキー操作ページ返却部13は、中継サーバ10内に格納されているHTMLとスクリプトで構成されたクッキー操作ページを返信する。ここで、クッキー操作ページとは、ブラウザ30におけるiframe内に読み込まれることを想定されており、ドメインをまたがったクッキーの読書きを行う。なお、クッキー操作ページには、クロスドメイン通信でのセキュリティを保つためのロジックも含めるようにしてもよい。
【0033】
ここで、クッキーの書き込み処理について図2を用いて具体的に説明する。図2に示すように、中継サーバ10は、Webサーバ20からのレスポンスヘッダのSet-Cookieやスクリプト内のdocument.cookieへの代入を受信すると、ヘッダやスクリプトをsetCookieFunc関数への呼び出しへと置換し、setCookieFunc関数をHTML文書内に追加する。例えば、中継サーバ10は、Set-Cookie:sid=1234;domain=.example.com; path=/のヘッダをsetCookieFunc(“sid=1234;domain=.example.com;path=/”)のスクリプトに置換し、ブラウザ30に送信する。
【0034】
そして、ブラウザ30は、setCookieFunc関数が呼ばれると、祖先ドメインの指定があるか判定する。この結果、ブラウザ30は、祖先ドメインの指定がないと判定した場合には、document.cookieにクッキーの内容を代入することでブラウザのクッキーに登録する。また、ブラウザ30は、祖先ドメインの指定があると判定した場合には、祖先ドメインを中継サーバへのURI置換を行い、親フレームと同じディレクトリにCookieHandler.htmlという予約済みのファイル名を付加したURIを表示するためのiframe要素を作成し、中継サーバ10からCookieHandler.htmlを取得する。
【0035】
その後、ブラウザ30は、作成したiframeにpostMessageなどのクロスドメイン通信を行って親フレームから子フレームのドメインにクッキーのセット指示を出す。指示を受けたiframe側のCookieHandler.html内のスクリプトでは、指示元が子孫ドメインであるかを確認する。この結果、指示元が子孫ドメインである場合には、iframe側でdocument.cookieにクッキーの内容を代入することで祖先ドメインへのクッキーセットを行う。
【0036】
次に、図3を用いて、クッキーの読み取り処理について具体的に説明する。クッキーの読み取り処理を行うケースとして、ブラウザがHTTPリクエストにCookieヘッダを付与して送信する場合と、スクリプトがdocument.cookieを読み取る場合の2種類がある。図3に示すように、中継サーバ10は、ブラウザ30からのリクエストに対してWebサーバ20からHTMLドキュメントを取得する。
【0037】
そして、中継サーバ10は、取得したHTMLドキュメントに対してクッキーの読取スクリプトを追加し、ブラウザ30に送信する。その後、読み取りスクリプトがブラウザ30上で実行され、元のドメインの祖先ドメインでCookieHandler.htmlを読み込むためのiframe要素を作成する。
【0038】
例えば、ブラウザ30が、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の個数はゼロや複数もありうる。
【0039】
そして、ブラウザ30は、中継サーバ10からCookieHandler.htmlを読み込んだ後に、iframeに対してクロスドメイン通信でクッキーの取得指示を送る。iframe側のCookieHandler.htmlのスクリプトがクロスドメイン通信の送信元を確認して子孫ドメインからの通信であるかを確認する。
【0040】
この結果、子孫ドメインからの通信であることの確認が取れた場合には、スクリプトでdocument.cookieの値を読み取る。ここで読み取れるクッキーについて、CookieHandler.htmlのドメインとパスに該当するものを読取ることができる。
【0041】
その後、クロスドメイン通信で親フレームにクッキーの内容を伝える。親フレームは、クロスドメイン通信の送信元が祖先ドメインであることを確認し、document.cookieにクッキーの内容を代入して祖先ドメインのクッキーを親フレームのドメインでも使えるようにする。その後、クッキーの一貫性を保つために、親フレームのdocument.cookieに代入するクッキーは expires を短く設定し、フレーム間でのクッキーの読み取りを一定時間おきに繰り返して実行する。これにより、祖先ドメインであって指定パスに該当するクッキーを読み取ることができる。
【0042】
[中継サーバによる処理]
次に、図4を用いて、実施例1に係る中継サーバ10によるクッキー書き込み処理を説明する。図4は、実施例1に係る中継サーバ装置によるクッキー書き込み処理の流れを示すシーケンス図である。以下の例では、http://sso.example.com/login/でログイン処理を行うと、Set-Cookie:sid=1234;domain=.example.com;path=/のレスポンスヘッダが返ってくるものとする。
【0043】
図4に示すように、中継サーバ10は、ブラウザ30からログインリクエストを受信する(ステップS101)。例えば、初期状態ではブラウザ30がhttp://sso.example.com/login/を中継サーバ10経由のhttp://http-sso-example-com.r.test/login/で開いている。そして、入力フォーム内のユーザ名とパスワードが入力され、ログインボタンが押されると、ブラウザ30がhttp://http-sso-example-com.r.test/login/loginにログインリクエストを送信する。
【0044】
続いて、中継サーバ10は、中継サーバのリクエスト判別部11がパスの/login/loginが「CookieHandler.html」と異なることから中継部12に処理を割り振る。そして、中継部12のURI置換部12bは、URIの復元を行いhttp://sso.example.com/login/loginというURIを得る(ステップS102)。
【0045】
そして、中継部12のリクエスト代行部12aは、Webサーバ20に対してリクエストを送信する(ステップS103)。続いて、Webサーバ20は、ユーザ名とパスワードのチェックを行って妥当性が確認できると、Set-Cookie:sid=1234;domain=.example.com;path=/ヘッダの付いたレスポンスを中継サーバ10へ返信する(ステップS104)。
【0046】
その後、中継サーバ10は、Webサーバ20から返ってきたレスポンスに対してURI置換、クッキー置換、スクリプト追加を行う(ステップS105)。例えば、中継サーバ10は、クッキー置換として、Set-Cookie:sid=1234; domain=.example.com;path=/のヘッダをsetCookieFunc(“sid=1234;domain=.example.com;path=/”)のスクリプトに置換する。
【0047】
そして、中継サーバ10は、URI置換、クッキー置換、スクリプト追加が行われたレスポンスをブラウザ30に送信する(ステップS106)。そして、ブラウザ30は、追加されたスクリプトによってiframeを作成する(ステップS107)。ここで、sso.example.comの祖先ドメインがexample.comの一つだけであり、パスが/login/loginであるため、作成されるiframeのURIがhttp://http-example-com.r.test/login/CookieHandler.htmlとなる。
【0048】
そして、中継サーバ10のリクエスト判別部11は、URI「http://http-example-com.r.test/login/CookieHandler.html」でのリクエストをブラウザ30のiframeから受信する(ステップS108)。そして、リクエスト判別部11は、パスのファイル名がCookieHandler.htmlであることからクッキー操作ページ返却部13に処理を割り振る。続いて、クッキー操作ページ返却部13は、クッキー操作ページをクライアントに返信する(ステップS109)。
【0049】
その後、ブラウザ30側でsetCookieFunc関数が呼び出されると、指定されてあるドメインの.example.comに対応するiframeのhttp://http-example-com.r.test/login/CookieHandler.htmlに対してクロスドメイン通信でクッキーセット要求を送る(ステップS110)。そして、クロスドメイン通信を受けたiframeは、クロスドメインの通信元の妥当性をチェックする。図4の例では、送信元のドメインがhttp-sso-example-com.r.testであり、iframeのドメインがhttp-example-com.r.testとなっており、置換前のドメインでは親子関係であるため妥当であると判断する。妥当であると判断された場合には、iframe側では、document.cookie=“sid=1234;path=/”のスクリプトを実行しクッキーのセットを行う(ステップS111)。
【0050】
次に、図5を用いて、実施例1に係る中継サーバ10によるクッキー読み取り処理を説明する。図5は、実施例1に係る中継サーバ装置によるクッキー読み取り処理の流れを示すシーケンス図である。以下の例では、図4で説明したログイン処理の後でアプリケーションのapp1を利用した場合について説明する。app1では、http://app1.example.com/sso/にアクセスすると、SSO認証が行われるものとする。
【0051】
図5に示すように、ブラウザ30は、中継サーバ10経由でhttp://app1.example.com/にアクセスして、http://http-app1-example-com.r.test/にリクエストを送る(ステップS201)。そして、中継サーバ10のリクエスト判別部11は、パス部分の/がCookieHandler.htmlと異なるため、中継部12へリクエスト処理を割り振る。
【0052】
そして、中継部12のURI置換部12bは、URIをhttp://app1.example.com/に復元する(ステップS202)。続いて、リクエスト代行部12aは、復元されたURIに対しリクエストを送ると(ステップS203)、Webサーバ20からレスポンスを受信する(ステップS204)。
【0053】
そして、中継サーバ10は、Webサーバ20から返ってきたレスポンスに対してURI置換、クッキー置換、スクリプト追加を行う(ステップS205)。ここでは、レスポンスにはSet-Cookieヘッダやスクリプト中のdocument.cookieへの代入が含まれていないので、クッキー置換を行わない。その後、中継サーバ10は、レスポンスをブラウザ30に送信する(ステップS206)。
【0054】
そして、ブラウザ30は、追加されたスクリプトでiframeを作成する(ステップS207)。app1.example.comの祖先ドメインは、「example.com」の一つだけであり、パスが「/」であるため、作成されるiframeのURIがhttp://http-example-com.r.test/CookieHandler.htmlとなる。そして、ブラウザ内のiframeは、このURIでのリクエストを中継サーバ10に送信して、/CookieHandler.htmlを読み込む(ステップS208)。
【0055】
そして、リクエスト判別部11は、パスが/CookieHandler.htmlであるので、クッキー操作ページ返却部13に処理を割り振る。クッキー操作ページ返却部13は、クッキー操作ページをクライアントに返却する(ステップS209)。続いて、ブラウザの親フレームがiframeに対してクロスドメイン通信でクッキーの取得要求を出す(ステップS210)。iframe側では、クロスドメイン通信の通信元がiframeのドメインの子孫ドメインであることを確認し、document.cookieプロパティを参照してブラウザ30がhttp-example.com.r.testドメインの/パスで保存しているクッキーを読み取る(ステップS211)。例えば、document.cookieを参照することでsid=1234のクッキーを読み取る。
【0056】
そして、iframeは、読み取ったクッキーをクロスドメイン通信で親フレームのhttp://http-app1-example-com.r.test/に送信する(ステップS212)。親フレームでは、クロスドメイン通信の通信元が祖先ドメインであるかを確認して、document.cookieプロパティにクッキーの内容を代入する(ステップS213)。これにより、親フレームのドメインで祖先ドメインのクッキーが読めるようになる。また、クッキーの一貫性のためにタイマー等でステップS210〜S213を繰り返し実行する。
【0057】
そして、ユーザがブラウザ30上に表示されているSSOのためのリンクをクリックすると(ステップS214)、ブラウザ30は、http://http-app1-example-com.r.test/sso/にリクエストを送ろうとする(ステップS215)。ここでは、祖先ドメインのクッキーがコピーされているため、ブラウザ30は、クッキーとしてCookie:sid=1234を付与してリクエストを送る。
【0058】
中継サーバ10のリクエスト判別部11は、リクエストを受信するとき、パスが/sso/であり、/CookieHandler.htmlでないので、中継部12にリクエスト処理を割り振る。中継部12のURI置換部12bがURIをhttp://app1.example.com/sso/と復元し(ステップS216)、リクエスト代行部12aがCookie: sid=1234のヘッダがついたリクエストをhttp://app1.example.com/sso/に送信する(ステップS217)。その後、Webサーバ20では、クッキーのsidの値を見てSSO認証を行うことになる。これによってドメインをまたがったSSO認証が中継サーバ10を介しても正常に行われることになる。
【0059】
[実施例1の効果]
上述してきたように、中継サーバ10は、Webサーバ20からブラウザ30に対するレスポンスを中継した場合に、リクエストのURIを置換する。そして、中継サーバ10は、Webサーバ20からブラウザ10に対するクッキー書き込み指示情報を受信した場合に、クッキー書き込み指示情報をスクリプトの呼び出し情報に置換する。その後、中継サーバ10は、置換されたスクリプトの呼び出し情報に対して、ブラウザ30のリクエスト先ドメインの祖先ドメインに対応するフレームを作成させるスクリプトを追加する。また、中継サーバ10は、フレームに祖先ドメインに対応するクッキーの書き込み指示をクロスドメイン通信で送信するスクリプトを追加する。このため、中継サーバを経由してブラウザからWebアプリケーションにアクセスする場合であっても、クッキー情報の書き込む処理を適切に実行することが可能である。
【0060】
また、実施例1によれば、中継サーバ10は、祖先ドメインのフレームのパスのディレクトリをブラウザ30からのレスポンスの受信先フレームのパスのディレクトリと同じにさせるスクリプトをさらに追加する。このため、Set-CookieヘッダやJavaScript中のdocument.cookieへの代入でドメインやパスの指定がある場合にも、iframeのパスのディレクトリを親フレームのパスのディレクトリとそろえる。この結果、祖先ドメインおよび指定パスに該当するクッキー情報の書き込む処理を適切に実行することが可能である。
【0061】
また、実施例1によれば、中継サーバ10は、Webサーバ20からブラウザ30に対するレスポンスを受信する。そして、中継サーバ10は、祖先ドメインに対応するフレームを作成させるとともに該フレームに祖先ドメインのクッキーを取得させて該クッキーをレスポンスの受信先フレームにクロスドメイン通信で送信させるスクリプトを追加する。このため、クッキー情報の読み取り処理を適切に実行することが可能である。
【0062】
また、実施例1によれば、中継サーバ10は、祖先ドメインに対応するフレームに祖先ドメインのクッキーを取得させてクッキーをレスポンスの受信先フレームにクロスドメイン通信で送信させる処理を一定時間ごとに行わせるスクリプトを追加する。このため、祖先ドメインの一貫性を保つことが可能である。
【実施例2】
【0063】
ところで、上記の実施例1では、HTMLやJavaScriptにSet-Cookieヘッダが付いている場合に、スクリプトに変換してクッキーの読み書き処理を行う場合を説明したが、本実施例はこれに限定されるものではなく、画像などにSet-Cookieヘッダが付いている場合にも、クッキーの書き込み処理を行う。
【0064】
例えば、ブラウザは、「http://www.example.com/image.jpg」を中継サーバ経由で読みこむために、図7に例示するようなHTTPのリクエストをWebサーバへ送信する。そして、Webサーバは、祖先ドメイン指定のあるクッキー「key=value;domain=.example.com;path=/」をヘッダに付けて、図8に例示するようなレスポンスを中継サーバ経由でブラウザに送信する。
【0065】
まず最初に、実施例2に係る中継サーバ10Aの構成を説明する。図6に示すように、中継サーバ10Aは、図1に示した中継サーバ10と比較して、画像クッキー処理部14を新たに有する点が相違する。かかる中継サーバ10Aにおいて、画像クッキー処理部14は、URI置換部14a、レスポンス作成部14b、一時保管部14cを有する。
【0066】
リクエスト判別部11は、実施例1と同様に、リクエストのパスが「/CookieHandler.html」や「/dir1/dir2/CookieHandler.html」となっているリクエストについては、クッキー操作ページ返却部13にリクエストを通知する。また、リクエスト判別部11は、実施例1と同様に、リクエストのパスが「/」や「/CookieHandler.html/dir/」となっているリクエストについては、中継部12へリクエストを通知する。また、リクエスト判別部11は、URIのクエリパラメータにSetCookieWithRedirection=trueを含んでいるリクエストについては、画像クッキー処理部14にリクエストを通知する。
【0067】
URI置換部14aは、Webサーバ20から受信したURIのドメイン部分を置換し、ブラウザ30から受信したURIのドメイン部を復元する。具体的には、URI置換部14aは、Webサーバ20から受信したURIのドメイン部分のドット「.」をハイフン「-」に置換するとともに、中継サーバのホスト名「r.test」を付加する。
【0068】
レスポンス作成部14bは、クッキー書き込み指示情報に含まれるクッキーを書き込んだ格納先であるURIをリダイレクト先としてブラウザ30に送信する。具体的には、レスポンス作成部14bは、データベースに格納されているcookiesの中から任意のクッキーを一つ取得し、このクッキーをセットできるURIへのリダイレクトをブラウザに送信する。
【0069】
そして、レスポンス作成部14bは、ブラウザ30からリダイレクト先に対するリクエストがあった場合には、クッキーをブラウザ30に送信するとともに、リダイレクト先に再度リクエストさせるレスポンスを作成する。そして、レスポンス作成部14bは、ブラウザ30からリダイレクト先に対するリクエストが再度あった場合には、一時保管部14cに格納されたレスポンスボディをブラウザ30に返信する。
【0070】
一時保管部14cは、サーバからブラウザに対するレスポンスに含まれるレスポンスボディがHTMLやJavaScriptではなく、祖先ドメイン指定のあるクッキー書き込み指示情報が含まれている場合に、クッキー書き込み指示情報に含まれるクッキーおよびレスポンスボディを記憶する。
【0071】
具体的には、一時保管部14cは、図9に示すように、一意に割り当てられた値である「id」、乱数によって生成された値である「token」、後述する図10のresp1rのSet-Cookieヘッダのうち祖先ドメインのドメイン指定のあるクッキーである「cookies」を対応付けて記憶する。また、一時保管部14cは、図9に示すように、画像データのレスポンスボディである「respBody」、ブラウザ30からWebサーバ20へのリクエストのURIを復元したURIである「returnTo」を対応付けて記憶する。
【0072】
次に、図10〜図12を用いて、実施例2に係る中継サーバ10Aによる処理を説明する。図10は、実施例2に係る中継サーバ装置による画像クッキー処理の流れを示すシーケンス図である。図11は、実施例2に係る中継サーバ装置による処理の流れを示すフローチャートである。図12は、実施例2に係る中継サーバ装置による処理の流れを示すフローチャートである。
【0073】
図10に示すように、ブラウザ30がhttp://www.example.com/image.jpgを中継サーバ経由で読み込むためにhttp://http-www-example-com.r.test/image.jpgにリクエストを送る(ステップS301)。そして、中継サーバ10Aは、リクエストを中継してhttp://www.example.com/image.jpgにリクエストを送る(ステップS302)。
【0074】
そして、Webサーバ20は,祖先ドメイン指定のあるクッキーkey=value;domain=.example.com;path=/をヘッダにつけて画像データを返す(ステップS303)。そして、中継サーバ10Aは、HTMLかJavaScriptのクッキーセット指示でなくて、かつ、祖先ドメイン指定があると判定した場合には、中継部12から画像クッキー処理部14に処理を委譲する。そして、画像クッキー処理部14では、一時保管部14cに対して新たな行を追加して、データを書き込む(ステップS304)。
【0075】
その後、レスポンス作成部14bは、一時保管部14cに格納されているcookiesの中から任意のクッキーを一つ取り出す。例えば、図9の例では、cookiesカラムにはクッキーが一つしか格納されていないため、key=value;domain=.example.com; path=/が取り出される。中継サーバ10は、取り出されたクッキーをセットできるURIであるhttp://http-example-com.r.test/?SetCookieWithRedirection=true&id=1234&token=0306へのリダイレクトをブラウザ30に返す(ステップS305)。なお、このURIでSetCookieWithRedirection=trueというクエリパラメータは、実施例1に登場したCookieHandler.htmlと同様に中継サーバが任意に設定できるものである。また、idとtokenのパラメータ名も中継サーバが自由に設定できる。
【0076】
ブラウザ30は、http://http-example-com.r.test/?SetCookieWithRedirection=true&id=1234&token=0306にリクエストを送り直す(ステップS306)。中継サーバ10のリクエスト判別部11は、リクエストされたURIのクエリパラメータにSetCookieWithRedirection=trueを含んでいるため画像クッキー処理部14のレスポンス作成部14bに処理を渡す。
【0077】
レスポンス作成部14bは、リクエストのidパラメータとtokenパラメータを取得し両者が一致する行を一時保管部14cから取得する。ステップS306において送信されたリクエストのURIを復元した時のドメインとパスは、example.comと/であり、このドメインとパスで設定することのできるクッキーをcookiesカラムから探すとkey=value;domain=.example.com;path=/が合致する。このため、レスポンス作成部14bは、このクッキーを一時保管部14cから取得してから削除する(ステップS307)。
【0078】
そして、中継サーバ10のレスポンス作成部14bは、cookiesカラムに残っているクッキーがなくなったので、returnToカラムの値をURI置換してクエリパラメータを追加する。そして、取得したクッキーをヘッダにつけてURIへのリダイレクトをブラウザに返す(ステップS308)。その後、ブラウザ30は、Set-Cookie:key=value;domain=.http-www-example-com.r.test;path=/のヘッダに従ってexample.comを置換したhttp-www-example-com.r.testドメインでのクッキーセットを行う。
【0079】
そして、ブラウザ30は、ステップS308で指示されているURIでリクエストを送り直す(ステップS309)。そして、中継サーバ10のリクエスト判別部11は、リクエストパラメータにSetCookieWithRedirection=trueがあるため画像クッキー処理部14に処理を渡す。
【0080】
レスポンス作成部14は、リクエストのidパラメータとtokenパラメータを取得し両者が一致する行を一時保管部14cから取得する。ステップS307においてcookiesカラムが空になっているため、respBodyの値を取得し、一時保管部14cから当該行を削除する(ステップS310)。その後、レスポンス作成部14は、respBodyでレスポンスを作成してブラウザ30に返す(ステップS311)。
【0081】
次に、図11および図12を用いて、実施例2に係る中継サーバによる処理の流れを説明する。図11および図12は、実施例2に係る中継サーバ装置による処理の流れを示すフローチャートである。図11に示すように、中継サーバ10Aは、レスポンスを受信すると(ステップS401肯定)、Webサーバ20からのレスポンスがHTMLまたはJavascriptであるか判定する(ステップS402)。
【0082】
この結果、中継サーバ装置10Aは、レスポンスがHTMLまたはJavascriptであると判定した場合には(ステップS402肯定)、実施例1で説明したように、クッキーセット指示をsetCookieFunc関数の呼び出しに置換する(ステップS403)。そして、中継サーバ装置10Aは、レスポンスにSet-Cookieヘッダやdocument.cookieへの代入が含まれておらず(ステップS402否定)、Set-Cookieヘッダが付いている場合には、ドメイン指定があるか判定する(ステップS404)。
【0083】
この結果、中継サーバ装置10Aは、祖先ドメインの指定がある場合には(ステップS404肯定)、クッキー読み取り処理と行削除処理(後に、図12を用いて詳述)を行う(ステップS405)。また、中継サーバ装置10Aは、祖先ドメインの指定がない場合には(ステップS404否定)、ヘッダにもともとついていたクッキーのドメインを置換する(ステップS406)。
【0084】
次に、図12を用いて、中継サーバ10Aによるクッキー読み取り処理と行削除処理について説明する。図12に示すように、同一ドメインのクッキーをレスポンスヘッダに追加し(ステップS501)、一時保管部14cに対して新たな行を作成する(ステップS502)。
【0085】
そして、中継サーバ10Aのレスポンス作成部14bは、一時保管部14cのcookiesカラムにクッキーがあるか判定する(ステップS503)。この結果、レスポンス作成部14bは、一時保管部14cのcookiesカラムにクッキーがある場合には(ステップS503肯定)、cookiesカラムからクッキーを一つ取得する(ステップS504)。そして、取得したクッキーをセットできるURIにリダイレクトをブラウザ30に送信する(ステップS505)。
【0086】
その後、中継サーバ10Aは、次のリクエストを待った後(ステップS506)、cookiesカラムにあるクッキーのうち現在のURIでセットできるクッキーをすべて取得し、当該クッキーをカラムから削除してレスポンスヘッダに追加する(ステップS507)。そして、ステップS503に戻って、一時保管部14cのcookiesカラムにクッキーがなくなるまでステップS504〜S507の処理を繰り返す。その後、一時保管部14cのcookiesカラムにクッキーがなくなると(ステップS503否定)、returnToカラムの値を取得する(ステップS508)。
【0087】
そして、取得したクッキーをヘッダにつけてURIへのリダイレクトをブラウザに返す(ステップS509)。その後、中継サーバ10は、リクエストを待った後(ステップS510)、リクエストのidパラメータとtokenパラメータを取得して両者が一致する行を一時保管部14cから取得してrespBodyの値を読み出し、当該行を削除する(ステップS511)。
【0088】
このように実施例2によれば、中継サーバ10Aは、Webサーバ20からブラウザ30に対するレスポンスに含まれるレスポンスボディがHTMLかJavaScriptではなくクッキー書き込み指示情報が含まれている場合に、クッキー書き込み指示情報に含まれるクッキーおよびレスポンスボディを一時保管部14cに格納する。そして、中継サーバ10Aは、クッキー書き込み指示情報に含まれるクッキーを書き込んだURIをリダイレクト先としてブラウザ30に送信する。続いて、中継サーバ10Aは、ブラウザ30からリダイレクト先に対するリクエストがあった場合には、クッキーをブラウザ30に送信するとともに、リダイレクト先に再度リクエストさせるレスポンスを作成する。その後、中継サーバ10Aは、ブラウザ30からリダイレクト先に対するリクエストが再度あった場合には、一時保管部14cに格納されたレスポンスボディをブラウザ30に返信する。このため、中継サーバ10Aは、画像などにSet-Cookieが付いている場合であっても、ブラウザ30にクッキーを適切に処理させることが可能となる。
【実施例3】
【0089】
さて、これまで実施例1、2について説明したが、上述した実施例以外にも、種々の異なる形態にて実施されてよいものである。そこで、以下では実施例3として他の実施例を説明する。
【0090】
(1)システム構成等
また、図示した各装置の各構成要素は機能概念的なものであり、必ずしも物理的に図示の如く構成されていることを要しない。すなわち、各装置の分散・統合の具体的形態は図示のものに限られず、その全部または一部を、各種の負荷や使用状況などに応じて、任意の単位で機能的または物理的に分散・統合して構成することができる。例えば、スクリプト追加部12dを書込スクリプト追加部と読取スクリプト追加部とに分散してもよい。さらに、各装置にて行なわれる各処理機能は、その全部または任意の一部が、CPUおよび当該CPUにて解析実行されるプログラムにて実現され、あるいは、ワイヤードロジックによるハードウェアとして実現され得る。
【0091】
(2)プログラム
図1の中継サーバ10の処理をプログラムにより実行する場合、図13に示すような情報処理装置(コンピュータ)が用いられる。図13の情報処理装置は、Central Processing Unit(CPU)1401、メモリ1402、入力装置1403、出力装置1404、外部記憶装置1405、媒体駆動装置1406、およびネットワーク接続装置1407を有し、互いに接続されている。
【0092】
メモリ1402は、例えば、Read Only Memory(ROM)、Random Access Memory(RAM)等を含み、処理に用いられるプログラムおよびデータを格納する。CPU1401は、メモリ1402を利用してプログラムを実行することにより、中継サーバと同様の処理を行う。
【0093】
入力装置1403は、例えば、キーボード、ポインティングデバイス等であり、オペレータからの指示や情報の入力に用いられる。出力装置1404は、例えば、ディスプレイ、プリンタ、スピーカ等であり、オペレータへの問い合わせや処理結果の出力に用いられる。
【0094】
外部記憶装置1405は、例えば、磁気ディスク装置、光ディスク装置、光磁気ディスク装置、テープ装置等である。情報処理装置は、この外部記憶装置1405に、プログラムおよびデータを格納しておき、必要に応じて、それらをメモリ1402にロードして使用する。
【0095】
媒体駆動装置1406は、可搬記録媒体1408を駆動し、その記録内容にアクセスする。可搬記録媒体1408は、メモリカード、フレキシブルディスク、光ディスク、光磁気ディスク等の任意のコンピュータ読み取り可能な記録媒体である。オペレータは、この可搬記録媒体1408にプログラムおよびデータを格納しておき、必要に応じて、それらをメモリ1402にロードして使用する。
【0096】
ネットワーク接続装置1407は、インターネット等の通信ネットワークに接続され、クライアント及び各目的サーバとの通信に伴うデータ変換を行う。また、情報処理装置は、必要に応じて、プログラムおよびデータを外部の装置からネットワーク接続装置1407を介して受け取り、それらをメモリ1402にロードして使用する。
【符号の説明】
【0097】
10、10A 中継サーバ
11 リクエスト判別部
12 中継部
12a リクエスト代行部
12b URI置換部
12c クッキー置換部
12d スクリプト追加部
13 クッキー操作ページ返却部
14 画像クッキー処理部
14a URI置換部
14b レスポンス作成部
14c 一時保管部
【特許請求の範囲】
【請求項1】
サーバからブラウザに対するレスポンスを中継した場合に、該リクエストの資源識別子を置換する資源識別子置換部と、
前記サーバから前記ブラウザに対するクッキー書き込み指示情報を受信した場合に、該クッキー書き込み指示情報をスクリプトの呼び出し情報に置換するクッキー置換部と、
前記クッキー置換部によって置換されたスクリプトの呼び出し情報に対して、前記ブラウザのリクエスト先ドメインの祖先ドメインに対応するフレームを作成させるとともに祖先ドメインに対応するクッキーの書き込み指示をクロスドメイン通信で前記フレームへ送信させるスクリプトを追加する書込スクリプト追加部と、
を有することを特徴とする中継サーバ装置。
【請求項2】
前記書込スクリプト追加部は、前記祖先ドメインのフレームのパスのディレクトリを前記ブラウザからのレスポンスの受信先フレームのパスのディレクトリと同じにさせるスクリプトをさらに追加することを特徴とする請求項1に記載の中継サーバ装置。
【請求項3】
前記祖先ドメインに対応するフレームを作成させるとともに該フレームに祖先ドメインのクッキーを読み取らせて該クッキーを前記レスポンスの受信先フレームにクロスドメイン通信で送信させるスクリプトを追加する読取スクリプト追加部をさらに有することを特徴とする請求項1または2に記載の中継サーバ装置。
【請求項4】
前記読取スクリプト追加部は、前記祖先ドメインに対応するフレームに祖先ドメインのクッキーを取得させて該クッキーを前記レスポンスの受信先フレームにクロスドメイン通信で送信させる処理を一定時間ごとに行わせるスクリプトを追加することを特徴とする請求項1〜3のいずれか一つに記載の中継サーバ装置。
【請求項5】
前記サーバから前記ブラウザに対するレスポンスに含まれるレスポンスボディが画像情報であってクッキー書き込み指示情報が含まれている場合に、該クッキー書き込み指示情報に含まれるクッキーおよびレスポンスボディを記憶部に格納するクッキー格納部と、
前記クッキー書き込み指示情報に含まれるクッキーを書き込んだ格納先情報をリダイレクト先として前記ブラウザに送信するリダイレクト先送信部と、
前記ブラウザから前記リダイレクト先に対するリクエストがあった場合には、前記クッキーをブラウザに送信するとともに、前記リダイレクト先に再度リクエストさせるレスポンスを作成するレスポンス作成部と、
前記ブラウザから前記リダイレクト先に対するリクエストが再度あった場合には、前記記憶部に格納されたレスポンスボディを前記ブラウザに返信するレスポンスボディ返信部と、
をさらに有することを特徴とする請求項1〜4のいずれか一つに記載の中継サーバ装置。
【請求項6】
ブラウザからサーバに対するリクエストを受信した場合に、該リクエストの資源識別子を置換するURI置換ステップと、
前記サーバから前記ブラウザに対するクッキー書き込み指示情報を受信した場合に、該クッキー書き込み指示情報をスクリプトの呼び出し情報に置換するクッキー置換ステップと、
前記クッキー置換ステップによって置換されたスクリプトの呼び出し情報に対して、前記ブラウザのリクエスト先ドメインの祖先ドメインに対応するフレームを作成させるとともに該フレームに祖先ドメインに対応するクッキーの書き込み指示をクロスドメイン通信で送信するスクリプトを追加する書込スクリプト追加ステップと、
を含んだことを特徴とするクッキー制御方法。
【請求項7】
ブラウザからサーバに対するリクエストを受信した場合に、該リクエストの資源識別子を置換するURI置換手順と、
前記サーバから前記ブラウザに対するクッキー書き込み指示情報を受信した場合に、該クッキー書き込み指示情報をスクリプトの呼び出し情報に置換するクッキー置換手順と、
前記クッキー置換手順によって置換されたスクリプトの呼び出し情報に対して、前記ブラウザのリクエスト先ドメインの祖先ドメインに対応するフレームを作成させるとともに該フレームに祖先ドメインに対応するクッキーの書き込み指示をクロスドメイン通信で送信するスクリプトを追加する書込スクリプト追加手順と、
をコンピュータに実行させることを特徴とするクッキー制御プログラム。
【請求項1】
サーバからブラウザに対するレスポンスを中継した場合に、該リクエストの資源識別子を置換する資源識別子置換部と、
前記サーバから前記ブラウザに対するクッキー書き込み指示情報を受信した場合に、該クッキー書き込み指示情報をスクリプトの呼び出し情報に置換するクッキー置換部と、
前記クッキー置換部によって置換されたスクリプトの呼び出し情報に対して、前記ブラウザのリクエスト先ドメインの祖先ドメインに対応するフレームを作成させるとともに祖先ドメインに対応するクッキーの書き込み指示をクロスドメイン通信で前記フレームへ送信させるスクリプトを追加する書込スクリプト追加部と、
を有することを特徴とする中継サーバ装置。
【請求項2】
前記書込スクリプト追加部は、前記祖先ドメインのフレームのパスのディレクトリを前記ブラウザからのレスポンスの受信先フレームのパスのディレクトリと同じにさせるスクリプトをさらに追加することを特徴とする請求項1に記載の中継サーバ装置。
【請求項3】
前記祖先ドメインに対応するフレームを作成させるとともに該フレームに祖先ドメインのクッキーを読み取らせて該クッキーを前記レスポンスの受信先フレームにクロスドメイン通信で送信させるスクリプトを追加する読取スクリプト追加部をさらに有することを特徴とする請求項1または2に記載の中継サーバ装置。
【請求項4】
前記読取スクリプト追加部は、前記祖先ドメインに対応するフレームに祖先ドメインのクッキーを取得させて該クッキーを前記レスポンスの受信先フレームにクロスドメイン通信で送信させる処理を一定時間ごとに行わせるスクリプトを追加することを特徴とする請求項1〜3のいずれか一つに記載の中継サーバ装置。
【請求項5】
前記サーバから前記ブラウザに対するレスポンスに含まれるレスポンスボディが画像情報であってクッキー書き込み指示情報が含まれている場合に、該クッキー書き込み指示情報に含まれるクッキーおよびレスポンスボディを記憶部に格納するクッキー格納部と、
前記クッキー書き込み指示情報に含まれるクッキーを書き込んだ格納先情報をリダイレクト先として前記ブラウザに送信するリダイレクト先送信部と、
前記ブラウザから前記リダイレクト先に対するリクエストがあった場合には、前記クッキーをブラウザに送信するとともに、前記リダイレクト先に再度リクエストさせるレスポンスを作成するレスポンス作成部と、
前記ブラウザから前記リダイレクト先に対するリクエストが再度あった場合には、前記記憶部に格納されたレスポンスボディを前記ブラウザに返信するレスポンスボディ返信部と、
をさらに有することを特徴とする請求項1〜4のいずれか一つに記載の中継サーバ装置。
【請求項6】
ブラウザからサーバに対するリクエストを受信した場合に、該リクエストの資源識別子を置換するURI置換ステップと、
前記サーバから前記ブラウザに対するクッキー書き込み指示情報を受信した場合に、該クッキー書き込み指示情報をスクリプトの呼び出し情報に置換するクッキー置換ステップと、
前記クッキー置換ステップによって置換されたスクリプトの呼び出し情報に対して、前記ブラウザのリクエスト先ドメインの祖先ドメインに対応するフレームを作成させるとともに該フレームに祖先ドメインに対応するクッキーの書き込み指示をクロスドメイン通信で送信するスクリプトを追加する書込スクリプト追加ステップと、
を含んだことを特徴とするクッキー制御方法。
【請求項7】
ブラウザからサーバに対するリクエストを受信した場合に、該リクエストの資源識別子を置換するURI置換手順と、
前記サーバから前記ブラウザに対するクッキー書き込み指示情報を受信した場合に、該クッキー書き込み指示情報をスクリプトの呼び出し情報に置換するクッキー置換手順と、
前記クッキー置換手順によって置換されたスクリプトの呼び出し情報に対して、前記ブラウザのリクエスト先ドメインの祖先ドメインに対応するフレームを作成させるとともに該フレームに祖先ドメインに対応するクッキーの書き込み指示をクロスドメイン通信で送信するスクリプトを追加する書込スクリプト追加手順と、
をコンピュータに実行させることを特徴とするクッキー制御プログラム。
【図1】
【図2】
【図3】
【図4】
【図5】
【図6】
【図7】
【図8】
【図9】
【図10】
【図11】
【図12】
【図13】
【図14】
【図2】
【図3】
【図4】
【図5】
【図6】
【図7】
【図8】
【図9】
【図10】
【図11】
【図12】
【図13】
【図14】
【公開番号】特開2011−257810(P2011−257810A)
【公開日】平成23年12月22日(2011.12.22)
【国際特許分類】
【出願番号】特願2010−129428(P2010−129428)
【出願日】平成22年6月4日(2010.6.4)
【出願人】(000005223)富士通株式会社 (25,993)
【Fターム(参考)】
【公開日】平成23年12月22日(2011.12.22)
【国際特許分類】
【出願日】平成22年6月4日(2010.6.4)
【出願人】(000005223)富士通株式会社 (25,993)
【Fターム(参考)】
[ Back to top ]