フロントに配置されたリバースプロキシサーバやロードバランサで設定されたHTTPヘッダを使用するWebアプリを開発することが多々あります。
このようなシナリオでは、設計に基づいて実装することはできますが、テストの実施は結合試験やシステム試験工程に持ち越されることが多く、バグの検出が遅くなる懸念があります。
ここでは、開発環境(Windows)のApacheをロードバランサの代わりとし、HTTPヘッダを付与する方法を説明します。
HTTPヘッダを使うWebアプリの例:
- 監査のためにWebアプリに対するリクエストの送信元IPアドレスをログに記録したい場合がある。リバースプロキシ型の構成の場合、リクエストの送信元がほとんどリバースプロキシサーバのIPアドレスになってしまう。この問題を解決するために、リバースプロキシサーバで、本来の送信元IPアドレスをX-Forwarded-For(XFF)と呼ばれるHTTPヘッダに設定する方法がある。Webアプリでは、このHTTPヘッダ値をログに出力する必要がある。
- リバースプロキシサーバでシングルサインオン認証を行う場合、認証済ユーザのリクエストをWebアプリに転送する際、特定のHTTPヘッダに認証済ユーザのIDを設定する。Webアプリでは、このHTTPヘッダ値のユーザIDを使ってセッション情報を初期化する必要がある。
- リバースプロキシサーバでクライアント証明書の検証後、Webアプリ側でログインしようとしている会社・ユーザIDがクライアント証明書と紐づいているか?等の検証を行いたい場合、クライアント証明書のシリアル番号等の情報をHTTPヘッダに設定したい。
- インターネットからの一般ユーザによるアクセス、閉域網からの管理者ユーザによるアクセスが想定されており、インターネットからのアクセスの場合、Webアプリの管理者向け機能・画面にアクセスできないようにしたい。インターネットor閉域網からのアクセスかをWebアプリで識別できるようなHTTPヘッダ値をリバースプロキシサーバで設定する。
前提
- こちらの手順で、Widows 10(64ビット)環境で動作するapacheが既に構築されている。
- テストケースによって付与するHTTPヘッダやその値を変更できるようにする。これは、バーチャルホスト(ホスト名ベース)の仕組みを使ってリクエスト先ホスト名を使い分けることで実現する。
リクエスト先 転送先/設定ヘッダ http://host1:8070/site1 http://localhost:8080/example-web
X-Forwarded-For: 1.2.3.4
X-MY-VAL: truehttp://host2:8070/site1 http://localhost:8080/example-web
X-Forwarded-For: 1.2.3.4, 5.6.7.8
X-MY-VAL: false - 動作確認のために、”http://localhost:8080/example-web”に次のWebアプリが公開されている前提で記載しています。GitHub
Contribute to nextdoorwith/example development by creating a…
設定方法
ホスト名の登録
スタートメニューでメモ帳を右クリックし、「管理者として実行」を実行する。
“C:\Windows\System32\drivers\etc”にあるhostsファイルに、IPアドレスとホスト名のペアを追加する。
1 2 3 4 5 6 7 8 | ... # localhost name resolution is handled within DNS itself. #127.0.0.1 localhost #::1 localhost # test 127.0.0.1host1 127.0.0.1host2 |
Apacheの設定ファイルの変更
“C:\devenv\Apache24\conf”のhttpd.confを開き、次のように修正する。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 | ... # # Dynamic Shared Object (DSO) Support # ... #LoadModule http2_module modules/mod_http2.so LoadModule headers_module modules/mod_headers.so #LoadModule heartbeat_module modules/mod_heartbeat.so ... LoadModule negotiation_module modules/mod_negotiation.so LoadModule proxy_module modules/mod_proxy.so #LoadModule proxy_ajp_module modules/mod_proxy_ajp.so ... #LoadModule proxy_html_module modules/mod_proxy_html.so LoadModule proxy_http_module modules/mod_proxy_http.so #LoadModule proxy_http2_module modules/mod_proxy_http2.so ... # case: 1 <VirtualHost host1:8070> # リバースプロキシ設定 ProxyRequests Off ProxyPass /site1 http://localhost:8080/example-web ProxyPassReverse /site1 http://localhost:8080/example-web # リバースプロキシ用ヘッダの抑制 ProxyAddHeaders Off # テスト用ヘッダの設定 RequestHeader set X-Forwarded-For "1.2.3.4" RequestHeader set X-MY-VAL "true" </VirtualHost> # case: 2 <VirtualHost host2:8070> # リバースプロキシ設定 ProxyRequests Off ProxyPass /site1 http://localhost:8080/example-web ProxyPassReverse /site1 http://localhost:8080/example-web # リバースプロキシ用ヘッダの抑制 ProxyAddHeaders Off # テスト用ヘッダの設定 RequestHeader set X-Forwarded-For "1.2.3.4, 5.6.7.8" RequestHeader set X-MY-VAL "false" </VirtualHost> |
- 7行目:
- ヘッダを設定するためにheaders_moduleのロードが必要
- 11,15行目:
- HTTPのリバースプロキシとして動作させるためにproxy_module, proxy_http_moduleが必要
- 22行目:
- リバースプロキシのみ有効とするためにOff(ONにするとプロキシになってしまいセキュリティ上の問題があり。)
- 23, 24行目:
- リクエストを所定のサイトに転送、レスポンスを元のリクエストURLに戻す。
- 26行目:
- ProxyPass設定時に付与されるX-Forwarded-For, X-Forwarded-Host, X-Forwarded-Serverを抑制する。テストでX-Forwarded-Forに任意の値を設定したいため。詳細はApacheのリファレンスを参照のこと。
- 28, 29行目:
- 独自のヘッダを追加する。設定のバリエーションはApacheのリファレンスを参照のこと。
動作確認
ブラウザで次のURLを開きます。
上記で設定したHTTPヘッダが表示されることを確認します。
http://host1:8070/site1/ShowHeaders.xhtmlhttp://host2:8070/site1/ShowHeaders.xhtml