Webアプリのデバッグや障害対応等で、Webアプリに対するリクエストやレスポンスのHTTPヘッダや内容を確認したい場合がある。
次のような場面ではクライアント側での確認ができないため、今回のようにAPサーバ側でキャプチャを行う。
- ブラウザからのアクセスを想定したWebアプリの場合、ブラウザの開発ツール(F12)で通信内容をキャプチャできるが、REST API等のブラウザを介さないようなWebアプリへのアクセスについては、別の方法が必要である。
- Windowsの場合はnetshやWireshark、Linuxの場合はtcpdump等のツールを利用できるが、開発環境のようにWebサーバがローカルにある場合はループバックアダプタの通信内容をキャプチャする必要があるが、これは一般的に難しい。
- SSL/TLSが使用されている場合は、暗号化を解除するためにキャプチャツールに秘密鍵を設定する必要があり難易度が高い。
- 本番や検証環境の場合、APサーバのフロントにロードバランサやリバースプロキシが配置されてる多段構成になることが多い。ブラウザとロードバランサやリバースプロキシとの通信は、ブラウザの開発ツールでは確認できるが、ロードバランサやリバースプロキシとAPサーバ間の通信はキャプチャできない。
RequestDumper
Wildfly(undertow)には既定で、リクエストとレスポンスをダンプする機能が含まれている。
次のように設定を追加して、Wildflyを再起動すれば利用可能である。
※下記はWildfly13の例
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 | ... <subsystem xmlns="urn:jboss:domain:undertow:6.0" default-server="default-server" default-virtual-host="default-host" default-servlet-container="default" default-security-domain="other"> <buffer-cache name="default"/> <server name="default-server"> ... <host name="default-host" alias="localhost"> ... <filter-ref name="request-dumper"/> ... </host> </server> ... <filters> <filter name="request-dumper" module="io.undertow.core" class-name="io.undertow.server.handlers.RequestDumpingHandler"/> </filters> ... </subsystem> |
ダンプの例
Webアプリにアクセスすると、次のようにリクエストとレスポンスのヘッダがログに出力されます。
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 | 20:48:06,415 INFO [io.undertow.request.dump] (default task-1) ----------------------------REQUEST--------------------------- URI=/xxx/xxx.xhtml characterEncoding=null contentLength=-1 contentType=null cookie=_ga=GA1.1.xxx.xxx header=Connection=keep-alive header=Accept=text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3 header=Accept-Language=ja,en-US;q=0.9,en;q=0.8 header=Accept-Encoding=gzip, deflate, br header=Cookie=_ga=GA1.1.xxx.xxx header=User-Agent=Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36 header=Upgrade-Insecure-Requests=1 header=Host=xxx:1234 locale=[ja, en_US, en] method=GET protocol=HTTP/1.1 queryString= remoteAddr=/xxx:9876 remoteHost=host1 scheme=http host=xxx:1234 serverPort=8080 isSecure=false --------------------------RESPONSE-------------------------- contentLength=8244 contentType=text/html;charset=UTF-8 cookie=JSESSIONID=xxxxxx; domain=null; path=/xxx header=Connection=keep-alive header=Set-Cookie=JSESSIONID=xxxxxx; path=/xxx header=Content-Type=text/html;charset=UTF-8 header=Content-Length=8244 header=Date=Wed, 29 May 2019 11:48:06 GMT status=200 ============================================================== |