用語集

HTTP プロキシとは何か?

HTTPプロキシとは、HTTP(およびCONNECTメソッドを介してHTTPS)トラフィックを理解して転送するプロキシサーバーであり、アプリケーション層で動作し、プレーンHTTPのリクエストおよびレスポンスデータを検査、変更、またはキャッシュすることができます。

HTTPプロキシとSOCKS5の違い、HTTP CONNECTの役割、そしてHTTPプロキシがほとんどのスクレイパーやHTTPクライアントでデフォルトプロトコルとして採用されている理由を理解する。

解説

HTTPプロキシは最も一般的なタイプのプロキシサーバーです。アプリケーション層でHTTPを理解します。クライアントがリクエストを送信すると、プロキシはURL、ヘッダー、(プレーンHTTPの場合)ボディを読み取ってから、リクエストを宛先に転送します。HTTPSの場合、プロキシはCONNECTメソッドを使用して宛先へのTCPトンネルを確立し、その後は暗号化されたバイトをそのままリレーするだけでコンテンツを参照することはできません。

レジデンシャル、ISP、データセンタープロバイダーを含むほとんどの商用プロキシサービスは、あらゆるHTTPクライアントやライブラリがネイティブにサポートしているためHTTPプロキシエンドポイントを公開しています。`HTTP_PROXY`および`HTTPS_PROXY`環境変数の設定、Pythonの`requests`への`proxies={...}`の渡し方、PlaywrightでのフラグによるHTTPプロキシURL(例:`http://user:pass@gate.shifter.io:10000`)の設定はすべてそのまま動作します。

HTTPとSOCKS5の違いは主にアーキテクチャ上のものです。HTTPプロキシはアプリケーション層で動作しHTTPを解析できますが、SOCKS5はトランスポート層で動作しTCP/UDPバイトをそのまま転送します。HTTPSスクレイピングにおいてはこの違いはほぼ形式的なものであり、どちらも暗号化されたバイトをトンネリングする結果になりますが、ツール全般でのHTTPプロキシサポートはより普遍的です。

仕組み

通常のHTTPでは、クライアントはプロキシに完全なリクエスト(絶対URLを使った`GET http://example.com/path HTTP/1.1`)を送信し、プロキシはURLを読み取って宛先への接続を開き、リクエストを転送してレスポンスを中継します。HTTPSの場合、クライアントはまずプロキシに`CONNECT example.com:443`リクエストを送信し、プロキシは宛先へのTCPトンネルを開きます。それ以降、クライアントとサーバーはプロキシを介してエンドツーエンドでTLS通信を行い、プロキシは暗号化されたバイトを転送するだけです。

認証は通常、`Proxy-Authorization`ヘッダー(ユーザー名:パスワードによるBasic認証)またはプロキシURL(`http://user:pass@host:port`)に認証情報をエンコードする方法で行います。商用サービスのジオターゲティングやセッションパラメーターは、通常ユーザー名(`customer-USER-country-us-session-12345`)にエンコードされます。

フォワードHTTPプロキシ

商業プロキシサービスが使用する構成です。クライアントの前に配置され、インターネット全体に対してクライアントを代理します。クライアントはプロキシアドレスを明示的に設定します。

リバースHTTPプロキシ

バックエンドサーバーの前に配置されます。ロードバランシング、キャッシュ、SSLターミネーション(Nginx、HAProxy、Cloudflare)に使用されます。クライアントはリバースプロキシの存在を知りません。

HTTP CONNECTトンネル

HTTP プロキシが HTTPS を処理するために使用するメカニズム。クライアントはプロキシに接続先へのトンネルを開くよう要求し、トンネルを通じて接続先とエンドツーエンドで TLS 通信を行います。

HTTPSプロキシ

TLS上で通信するHTTPプロキシです。クライアントからプロキシへの接続が暗号化されます(CONNECTトンネルを通じたエンドツーエンドのTLSに加えて)。一般的ではなく、プライバシー重視の構成で使用されます。

主な使用事例

HTTP/HTTPSコンテンツのスクレイピング(主要なユースケース)
固定IP出口を通じたAPIアクセス
社内の外部通信フィルタリング
帯域幅節約のための静的コンテンツのキャッシュ
アウトバウンドトラフィックの集中認証
開発/テスト環境でのアプリケーションごとのHTTPルーティング
FAQ

よくある質問

よくある質問: httpプロキシ.

HTTPプロキシはアプリケーション層で動作しHTTPリクエストを解析できますが、SOCKS5プロキシはトランスポート層で動作しペイロードを解析せずに生のTCP/UDPを転送します。HTTPSにおいてはこの違いはほぼ形式的なもので(どちらも暗号化バイトをトンネリングします)、非HTTPプロトコル(FTP、SMTP、BitTorrent、ゲーミング)をプロキシする必要がある場合はSOCKS5が優れています。

いいえ、コンテンツは見えません。HTTPSの場合、プロキシはCONNECT経由でTCPトンネルを開き、クライアントと宛先の間で暗号化されたバイトを転送するだけです。プロキシは宛先のホスト名(CONNECTリクエストおよびTLS SNI経由)とバイト量は確認できますが、リクエスト本文、ヘッダー、レスポンスは確認できません。

`proxies={'http': 'http://user:pass@gate.shifter.io:10000', 'https': 'http://user:pass@gate.shifter.io:10000'}; requests.get(url, proxies=proxies)`。http と https の両方に同じプロキシ URL を使用します。スキームが https の場合、Python は CONNECT フローを自動的に処理します。

はい。Shifter は HTTP/HTTPS(および SOCKS5)でレジデンシャルおよび ISP(静的レジデンシャル)プロキシエンドポイントを公開しています。両方のプロトコルで同じ認証情報とジオターゲティングパラメータを使用できます。クライアントサポートの広さから、ほとんどのお客様は HTTP を使用しています。

HTTP プロキシが HTTPS を処理するために使用するメカニズム。クライアントはプロキシに `CONNECT host:port HTTP/1.1` を送信し、プロキシは接続先への TCP ソケットを開きます。それ以降、クライアントと接続先はトンネルを通じてエンドツーエンドで TLS 通信を行います。プロキシは暗号化されたコンテンツを見ることができません。

プロキシへのHTTPは、ほとんどの商用利用で問題ありません。HTTPSターゲットへのエンドツーエンドのTLSは、いずれの場合も暗号化されたままです。プロキシへのHTTPSは、あなたとプロキシ間に追加の暗号化レイヤーを加え、信頼できないネットワーク上でのCONNECT行とProxy-Authorizationヘッダーへの受動的な観察から保護します。公共のWiFiでは有効ですが、サーバーからは通常やり過ぎです。