プロキシツールmitmproxy・mitmdumpで、httprequest・httpresponseの内容をチェックする

ソフトウェア開発でhttpリクエストを送ることはよくあると思うが、その中身をチェック・デバッグするにはどうするか。

もちろん開発しているツールで中身を見てもいいし、ログを仕込んでもいいと思うが、場合によっては少し手間がかかったりもするしリアルタイムで把握しづらかったりもする。

通信の間にプロキシを介在させればHttpリクエスト、レスポンスの中身がプロクシにより取得できるので便利である。

色々とツールはあるが無料で機能が豊富なmitmproxyを使う。これをmac上で動かし、別のiOSデバイス(iPhoneなど)からインターネットへのアクセスを仲介してみる。実際に試してみたが、手軽に素早くリクエスト・レスポンスをチェックできるため、デバッグの速度が上がり何よりストレスが減った。1

他のツールを探したい場合 -> [アプリのAPIリクエストのトレースはどうするのが効率的か？](https://techblog.zozo.com/entry/ios_api_request_trace)

### インストール

Homebrewというツールを使いインストールする。

```
brew install mitmproxy
```

mac以外のデバイス上で動かすときは-> [Installation - mitmproxy](https://docs.mitmproxy.org/stable/overview-installation/)

### 起動

ターミナルで以下のコマンドを叩くと、mitmproxyが起動する。

```
mitmproxy
```

後で使うので、macのプライベートネットワーク内のIPアドレスを調べておく。

```
ifconfig
```

以上のように入力すると、出力の`en=0`という欄にipアドレスが記載されている。例えば、192.168.100.107など。[詳細](http://bambinya.hateblo.jp/entry/2015/04/04/234428)

### iOSデバイス側

「設定」アプリを開く。Wi-Fi > 現在使用しているWi-fiの横にある「i」ボタン > HTTPプロクシ > 手動 

「サーバー」の欄に、macのipアドレスを入力する。
「ポート番号」の欄には、mitmproxyのポート番号（特に何も指定しなければ、デフォルトでは8080）を入力する。

次にiOSデバイスにmitmproxyの証明書をDLする。

Safariからhttp://mitm.itにアクセスし、Appleのりんごのマークをタップする。
「設定」アプリを開き、一般 > プロビジョニング でmitmproxyのプロファイルが追加されているはずなので、タップして認証する。

以降、iOSデバイス側からのHTTPリクエスト、およびiOSデバイスが受け取るHTTPレスポンスがmitmproxyに一覧表示される。

なお、App storeからアプリをダウンロードするにはプロキシがあるとできないようなので、その前にプロクシの設定を一度解除する必要がある。

### macを使う場合

mitmproxy自体を起動しているMacのトラフィックを見るという事もできる。

また、Xcodeのシミュレータでアプリなどを起動し、そのトラフィックを見たい場合、シミュレータ独自のプロクシの設定はできないことから、やはりmitmproxy自体を起動しているMacのトラフィックを見るよう設定する事になる。

[Intercepting Network Traffic with mitmproxy](https://www.andyibanez.com/posts/intercepting-network-mitmproxy/)

mac全体のプロキシ設定を変更することとなる。いちいち手動で設定を変更するのは面倒かと思うので、シェルスクリプト を使い変更すると楽。

```sh:turnOnMitmproxySettings.sh
#!/bin/sh

# turn on mitmproxy wifi settings
networksetup -setwebproxy "Wi-fi" 0.0.0.0 8080
networksetup -setsecurewebproxy "Wi-fi" 0.0.0.0 8080
```

```sh:turnOffMitmproxySettings.sh
#!/bin/sh

# turn off mitmproxy wifi settings back to default settings
networksetup -setwebproxystate "Wi-fi" off
networksetup -setsecurewebproxystate "Wi-fi" off
```

その後、シミュレータに証明書をインストールする。
ターミナルで以下のコマンドを叩く。

```
curl -O https://raw.githubusercontent.com/ADVTOOLS/ADVTrustStore/master/iosCertTrustManager.py
chmod 744 ./iosCertTrustManager.py
./iosCertTrustManager.py -a ~/.mitmproxy/mitmproxy-ca-cert.pem
rm ./iosCertTrustManager.py
```

Mac自体のSafariなどのトラッキングもしたければ、Mac自体にも証明書をインストールする。MacのSafariからmitm.itにアクセスし、そのページの指示に従い、MacOS用の証明書をインストールし、信用する。

参考： [mitmproxyでiOS Simulatorを覗くためのメモ](https://hmhv.info/2015/10/mitmproxy-with-ios-simulator/)

### 各リクエストの詳細

クリックすると各リクエストの詳細が見れる。

「q」キーで一覧画面に戻る。

「F」キーで最新のリクエストを自動で追いかける。

### フィルタリング
 
「f」キーで、一定の文字列でフィルタリングを行う。

### 保存

普通にマウスでドラッグしようとすると画面に説明が表示されるが、その説明の通りで、macの場合はFnキーを押しながらドラッグすると画面を選択できるので、画面に表示されるものをコピーできる。

またbキーを押し、保存先のパスを入力し、エンターキーを押すとそのファイルに保存もできる。
デフォルトのresponse.content を書き換えると、以下のものが保存される。

request : リクエスト方法とURLが保存される
request.headers : リクエストヘッダが保存される
request.content : リクエストパラメータが&で繋がれて保存される
response : レスポンス結果（４０４とか３０２とか）が保存される
response.headers : レスポンスヘッダが保存される
response.content : レスポンスパラメータが&で繋がれて保存される

ただ全ログをファイルに書き込みたい時にはあまり向かないので、後述のmitmdumpを使った方がいい。

## mitmdump

基本的にはmitmproxyと同じだがログをダンプするには向いている。

### 基本

`mitmdump`でmitmproxyと同様に起動する

### ログの保存

`mitmdump -w (ファイル名)`で、ファイルにログを全て書き込む。

### フィルタリング

`mitmdump -w (ファイル名) FILTER`

FILTER部分にフィルタリング用の表現を書き込む。

[mitmproxy docs - filter expressions](https://docs.mitmproxy.org/stable/concepts-filters/)

`mitmdump -w (ファイル名) "~m post"`

HTTPメソッドがPOSTのもののみ書き込む。

`mitmdump -w (ファイル名) "~u hogehoge"`

URLに`hogehoge`を含むもののみ書き込む。

### 参考
[mitmproxy docs](https://docs.mitmproxy.org/stable/overview-getting-started/)
[モバイルアプリ開発者のための mitmproxy 入門](https://qiita.com/hkurokawa/items/9034274cc1b9e1405c68)
[iOS実機のSSL通信をプロキシによって傍受したり改ざんする方法](https://qiita.com/yimajo/items/c67cb711851f747c35e5)