アプリ開発ときどきアウトドア

主にJavaを使ったアプリ開発やトラブルシューティング等のノウハウ、キャンプや登山の紹介や体験談など。

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ヘッダ値をリバースプロキシサーバで設定する。

前提

  • こちらの手順で、Widows 10(64ビット)環境で動作するapacheが既に構築されている。
  • テストケースによって付与するHTTPヘッダやその値を変更できるようにする。これは、バーチャルホスト(ホスト名ベース)の仕組みを使ってリクエスト先ホスト名を使い分けることで実現する。
    リクエスト先 転送先/設定ヘッダ
    http://host1:8070/site1 http://localhost:8080/example-web
    X-Forwarded-For: 1.2.3.4
    X-MY-VAL: true
    http://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アプリが公開されている前提で記載しています。

設定方法

ホスト名の登録

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

...
# 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



(adsbygoogle = window.adsbygoogle || []).push({});


(adsbygoogle = window.adsbygoogle || []).push({});

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

執筆者:


comment

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

関連記事

DB操作フレームワーク はJPA or mybatis?

開発に向けた準備で、開発標準を準備するフレームワーク(FW)チーム、それらを使って実装を行う業務チームが集まって、「DB操作を行うためのFWは何を使うか?」という協議になった。 FWチームは、FW・J …

JBoss EAP7でDEBUG/TRACEログを出力

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

WindowsにApacheを構築

アプリケーション開発環境として主にWindowsを使っています。 開発時の検証で使用するミドルウェアがApacheを使用することが多いので、ここでは開発環境であるWindowsにApacheを構築する …

JavaEE7のJSF, Facelets, JSPの関係

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

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

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

プロフィール ゆっきーです。
都内でシステムエンジニアをやっています。
もっと詳細を見る