ゆっきーのブログ

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

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

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

関連記事

JBoss EAP7でDEBUG/TRACEログを出力

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

パスワード情報の保管方式の比較

Webアプリの開発でパスワードを使ったユーザ認証を設計・実装する機会がよくある。 後輩への説明や勉強会ネタとして、この辺の話を纏めてみようと思う。 概要 オンラインバンキングやネットショッピングのサイ …

JavaEE7のJSF, Facelets, JSPの関係

JavaEEを使ったアプリ開発の際に、いつも気になるが後回しにしていたこと… HTML5への対応方法の調査等、今後の理解促進のために、調べてみた。 FaceletsとJSFとの関係は? J …

EAP7のインストールとパッチ適用

仕事でredhat社のEnterprise Application Server7(EAP7)を扱うことが多いので備忘録として記載します。 なお、このサイトでWebアプリを公開したいと考えていますが、 …

WebサイトのSSL化

次のようなGoogleウェブマスター向け公式ブログでの推奨や、リモートか管理の安全性向上の向上のためにSSL(TLS)を有効にする。 概要 Googleさんの考え 保護されたウェブの普及を目指して(2 …