ゆっきーのブログ

実践的なシステム設計開発、アプリケーションフレームワーク開発、トラブルシューティング、 後輩育成のためのブログ。その他、キャンプ、トレッキング・登山やレジャー等。

1. システムエンジニアリング Apache 基盤技術

Webアプリテスト用のHTTPヘッダの追加

投稿日:2019年1月19日 更新日:


フロントに配置されたリバースプロキシサーバやロードバランサで設定された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ヘッダ値をリバースプロキシサーバで設定する。

前提

設定方法

ホスト名の登録

スタートメニューでメモ帳を右クリックし、「管理者として実行」を実行する。
“C:\Windows\System32\drivers\etc”にあるhostsファイルに、IPアドレスとホスト名のペアを追加する。

# Copyright (c) 1993-2009 Microsoft Corp.
#
# This is a sample HOSTS file used by Microsoft TCP/IP for Windows.
#
...
# localhost name resolution is handled within DNS itself.
#	127.0.0.1       localhost
#	::1             localhost

# test
127.0.0.1	host1
127.0.0.1	host2

Apacheの設定ファイルの変更

“C:\devenv\Apache24\conf”のhttpd.confを開き、次のように修正する。

...
#
# 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.xhtml
http://host2:8070/site1/ShowHeaders.xhtml

-1. システムエンジニアリング, Apache, 基盤技術

執筆者:


comment

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

関連記事

Wildfly11のインストール

このサイトでWebアプリを公開したい。 仕事ではJBoss Enterprise Application Server(JBoss EAP)を使う機会が多いのでそれを使いたいがライセンス料がかかる。無 …

JBoss EAP7でDEBUG/TRACEログを出力

JBoss EAP7でアプリのDEBUGやTRACEのログを出力する方法を記載します。 開発の序盤でアプリのDEBUGログがeclipseのコンソールやログファイルに出力されず、困る場合があるので、メ …

CentOS7のマルチホーム化

サイトの存在を隠しつつも、sftpサーバを公開し、後輩と1G以上のファイルのやりとりしたい。 パブリック側のIPアドレスを教えてしまうと、どこのサーバだろうかとブラウザで開いたりするとサイトの存在がわ …

開発環境のJBoss EAP7にリモートアクセス

開発中のものを他者に見せたり、問題が発生している開発者の開発物を参照するために、eclipse上で起動しているEAP7のWebアプリに別のPCからアクセスしたい場合があります。 このための手順を記載し …

マスタデータ生成ツール

開発や結合試験、本番環境等で使用するマスタデータをExcelで管理することがあります。 そのようなExcelファイルからDBに登録するためのインサート文を作成するために、いつもツールに悩むので作成して …