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

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

前提

設定方法

ホスト名の登録

スタートメニューでメモ帳を右クリックし、「管理者として実行」を実行する。
“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

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

関連記事

CentOS7のマルチホーム化

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

Windows Updateが終わらない問題

ふと会社で使っているPCのWindows Updateがほとんど当たっていないことに気づいた。 手動でWindows Updateを実行すると、30分、1時間たっても終わらない… これは何 …

マスタデータ生成ツール

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

jQueryによるデフォルトボタンの実装

デフォルトボタンについて Webページ上でエンターキーを押した場合、そのページ上であらかじめ決められたボタンをクリックしたかのように処理を実行する仕組みがある。何らかのデータの検索を行うようなページは …

疎通確認用pingツール

新人君たちと本番環境の構築作業でデータセンターに入り。 構築したサーバから、既存の重要なサーバへの疎通確認を行うために、pingを何度も入力する予定とのこと。 作業時間の短縮や間違いの低減のために、こ …



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