HTTP中継(プロキシ)のプロトコル詳細解説

HTTP中継(プロキシ)は、アプリケーション層(OSIの第7層)のHTTPプロトコルを中継(再発行)する仕組みです。プロキシサーバーはTCP/IPのセッションを一度終了させ、新たに別のセッションを開始して通信を中継します。

この記事では、HTTPの構造、リクエスト/レスポンスの伝播、TCP/IP層での扱い、ヘッダーの処理など、「プロトコルとして何がどう動いているか」に焦点を当てて詳述します。

HTTP中継のプロトコル的な概要

HTTP中継(proxy)は、アプリケーション層(OSIの第7層)のHTTPプロトコルを中継(再発行)するものです。プロキシサーバーはTCP/IPのセッションを一度終了させ、新たに別のセッションを開始して通信を中継します。

1
[Client] --(HTTP over TCP)--> [Proxy] --(HTTP over TCP)--> [Server]

つまり、ClientとProxy間のTCPコネクションと、ProxyとServer間のTCPコネクションは完全に別物です。

プロトコル単位での構造

1. クライアント→プロキシ(Proxy)

クライアントからプロキシへのHTTPリクエスト例

1
2
3
4
5
GET /api/item HTTP/1.1
Host: proxy.example.com
Content-Type: application/json
Content-Length: 12345
Authorization: Bearer token123

2. プロキシでの動作

プロキシサーバーは以下を行います。

  • TCPで受け取ったHTTPリクエストをアプリケーション層で解析
  • 必要に応じてヘッダーを書き換え(例:Host, Authorization, X-Forwarded-For など)
  • 新たなHTTPリクエストとしてバックエンドに送信

3. プロキシ→バックエンド

プロキシからバックエンドで新たなリクエストが送られます。
リクエスト先Hostがbackendサーバーに変更され、X-Forwarded-Forが追加、Authorizationがプロキシによって変更されています。

1
2
3
4
5
6
GET /api/item HTTP/1.1
Host: backend.internal
Content-Type: application/json
Content-Length: 12345
X-Forwarded-For: 192.168.1.10
Authorization: internal-api-key

4. バックエンド→プロキシ(HTTPレスポンス)

バックエンドサーバーはプロキシにレスポンスを返します。

1
2
3
4
5
HTTP/1.1 200 OK
Content-Type: application/json
Content-Length: 123

{"username": "taro"}

5. プロキシ→クライアント

そのレスポンスを、必要に応じて加工しながら、もとのクライアントに返します。

TCP/IPレイヤーの流れ

内容
アプリケーション層 (HTTP) リクエストやレスポンスのヘッダー・ボディの構造処理
トランスポート層 (TCP) クライアント→プロキシ、プロキシ→バックエンドの別個のTCPコネクション
ネットワーク層 (IP) Proxyが受け取ったIPヘッダのSource IPを見て、X-Forwarded-Forに記録することが多い
データリンク層 イーサネットフレームなど。HTTP中継の動作とは直接関係しないが、パケット分割などは影響あり

ヘッダーの役割とプロキシにおける重要性

ヘッダー 意味・使い道
Host バックエンドのホスト名に変更される
X-Forwarded-For オリジナルのクライアントIPを伝えるためにプロキシが付加
Authorization プロキシで独自の認証に変換することもある(例:トークン → 内部APIキー)
Via どのプロキシを通ったかを記録(RFC2616で推奨)
Content-Length / Transfer-Encoding ストリーミングやチャンク転送時に注意が必要

プロキシの種類と特徴

フォワードプロキシ

クライアントがプロキシを経由してインターネットにアクセスする形態です。

1
[Client][Forward Proxy][Internet][Server]

リバースプロキシ

サーバーの前に配置され、クライアントからのリクエストを適切なバックエンドサーバーに振り分ける形態です。

1
[Client][Reverse Proxy][Backend Server]

トランスペアレントプロキシ

クライアントがプロキシの存在を意識せずに通信できるプロキシです。通常はネットワークレベルでトラフィックをインターセプトします。

プロキシにおける重要な技術的考慮事項

1. コネクション管理

プロキシは以下のコネクション管理が重要です。

  • Keep-Alive: クライアントとのコネクションを維持
  • Connection Pooling: バックエンドサーバーとのコネクションを再利用
  • タイムアウト設定: 適切なタイムアウト値の設定

2. バッファリングとストリーミング

  • メモリ使用量の最適化: 大きなファイルやデータを扱う場合、バッファリングとストリーミングでメモリ使用量を最小限に抑えることが重要です

3. エラーハンドリング

プロキシは様々なエラーケースを適切に処理する必要があります。

  • バックエンドサーバーの障害
  • ネットワークタイムアウト
  • 不正なHTTPリクエスト
  • SSL/TLS証明書の問題

まとめ

HTTP中継(プロキシ)は、単純に見えて実は非常に複雑な仕組みです。TCP/IPレイヤーでのセッション管理、HTTPヘッダーの適切な処理、セキュリティ上の考慮事項など、多くの技術的要素が絡み合っています。

この記事で解説した内容を基に、実際のプロキシサーバーの設定や、カスタムプロキシの実装に取り組んでみてください。