Postman プロキシで HTTP/HTTPS 通信から API コレクションを作る

この記事は [Postman Advent Calendar 2023](https://qiita.com/advent-calendar/2023/postman) のシリーズ 2、13日目の記事です。

[前回の記事](https://qiita.com/nagix/items/84aac2eaff523d9a2485)では、ブラウザー拡張機能である Postman インターセプターを使って、ブラウザートラフィックから API コレクションを作る方法を紹介しました。さて、もし API にアクセスするアプリがブラウザーアプリではない場合、どうやって API トラフィックをキャプチャすればよいでしょうか？

こういう状況でよく使われる方法は、プロキシサーバーの利用です。特に、モバイルアプリからの API アクセスなどは、クライアント端末で [Wireshark](https://www.wireshark.org) などのパケットキャプチャツールを動かすわけにもいかないので、プロキシサーバーを設置して、端末からの通信をプロキシ経由に設定する方法が便利です。この用途に関しては、ローカル PC にプロキシを立ち上げてキャプチャを行う [Charles](https://www.charlesproxy.com) や [Fiddler](https://www.telerik.com/fiddler) などのツールが有名ですかね。

しかし、Postman が内蔵する**プロキシ機能**を使えば、プロキシの立ち上げから API トラフィックのキャプチャ、コレクションの作成までが、1 つのツールでシームレスに完結するので非常に効率的です。手順は Postman インターセプターとほぼ同じですので、とても簡単。

https://learning.postman.com/docs/sending-requests/capturing-request-data/capture-with-proxy/

では、以下でその手順を追っていきましょう。

# プロキシセッションの開始

:::note info
古いバージョンの Postman デスクトップアプリや Linux 版では、キャプチャの手順が若干異なりますので、[こちらのドキュメント](https://learning.postman.com/docs/sending-requests/capturing-request-data/capturing-http-requests/)をご覧ください。
:::

まずは Postman デスクトップアプリのフッターにある「プロキシの起動」をクリックすると、次のような「新しいプロキシセッション」の説明が表示されます。ここで左下の「プロキシセッションを開始」ボタンをクリックしましょう。

<img width="1071" alt="image.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/32610/b4cf2882-3844-d058-3935-b0a73692c8f9.png">

HTTPS 通信のキャプチャのために、初回プロキシセッション開始時に OS に証明書が自動的にインストールされます。この際、システムパスワードの要求が行われる可能性があることにご留意ください。

# トラフィックのキャプチャ

プロキシセッションが開始されると、次のような画面でリクエストと Cookie の一覧が表示されます。試しに、ローカル PC 上のブラウザーを使って Web ページへのアクセスを試みると、リクエストが増えていくのがわかります。

<img width="1071" alt="image.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/32610/ee1fafba-eb1b-0b80-cad2-175d0ef99542.png">

さて、ローカル PC のトラフィックは自動的にキャプチャされるのですが、別マシンやモバイルデバイスからの通信をキャプチャするには、それぞれのデバイス上でプロキシの設定が必要です。

例えば iOS であれば、「設定」→「Wifi」の画面で接続中のアクセスポイントの情報アイコン（○の中にｉ）をクリックして、「プロキシを構成」→「手動」を選択します。そして「サーバ」に Postman が動作するマシンの IP アドレス、「ポート」に 5559 を入力して「保存」をクリックします。

<img width="393" alt="image.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/32610/e8cab035-5f9f-3661-dff7-fe3ad99d77f2.png">

さらに、HTTPS 通信のキャプチャのために、証明書を iOS デバイスにインストールします。Postman が動作するマシンが macOS であれば、`~/Library/Application Support/Postman/proxy/postman-proxy-ca.crt` が証明書ファイルですので、AirDrop でこれを iOS デバイスに転送します。続いて「設定」→「プロファイルがダウンロードされました」で証明書のプロファイルが表示されますので、「インストール」をクリックします。

<img width="393" alt="image.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/32610/064ce970-0032-70ed-9fb8-c90d845d2177.png">

そしてもう一つ、「設定」→「一般」→「情報」→「証明書信頼設定」で「Postman Proxy CA」をオンに設定する必要があります。これで iOS デバイスからの通信をすべてキャプチャできるようになります。

<img width="393" alt="image.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/32610/707a2dbb-e168-5519-89f4-75e44f08763b.png">

以上は iOS の例でしたが、Android など他のデバイスの設定は[こちらのドキュメント](https://learning.postman.com/docs/sending-requests/capturing-request-data/capturing-https-traffic/)をご覧ください。

# 結果を Postman デスクトップアプリで表示

キャプチャを終了するには「停止」ボタンをクリックします。そうするとセッションが終了して、「Proxy debug session」と名付けられたタブの中に、キャプチャされたすべてのリクエスト（およびそのレスポンス）が表示されます。

<img width="1071" alt="image.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/32610/b788bc62-ec93-2349-fb85-0794ed1e363c.png">

「概要」「リクエスト」「Cookie」のそれぞれのタブで見ることができる情報は、[Postman インターセプターセッションで収集した情報](https://qiita.com/nagix/items/84aac2eaff523d9a2485#結果を-postman-デスクトップアプリで表示)とほぼ同じです。違いは、「概要」タブでステータスコードをベースに集計ができることと、「リクエスト」タブで各リクエストに対するレスポンスも表示できる点です。

また、プロキシセッションの結果のリクエストを選択して、「リクエストを保存」ボタンからコレクションに保存することもできます。こちらも Postman インターセプターと同様ですが、プロキシの場合はさらにレスポンスの情報がリクエストのサンプルとして保存されるため、後でレスポンスの内容を確認したり、サンプルを使ってモックサーバーの応答データとして活用することもできるのが素晴らしいところです。

<img width="1076" alt="image.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/32610/81120c78-6127-532a-9b7b-f24b748951cf.png">

Postman インターセプターと合わせて、プロキシ機能を使いこなし、リバースエンジニアリングを極めましょう。