HTTPのProxyを改善する「Upgrade: connect-tcp」 の提案仕様

Modernizing HTTP Forward Proxy Functionality」という仕様がIETFに提出されています。

これは、CONNECTメソッドを使った今までのForward Proxyの機能を、新しい(モダン)なしくみに置き換える提案です。HTTP/2やHTTP/3上でHTTP以外のデータをやり取りする場合は、拡張CONNECTの仕組みを使うのが一般的です。例えば、HTTPを介してUDPパケットをProxyするCONNECT-UDPなどもこの拡張CONNECTを使っています。

この拡張CONNECTのアイディアをもとに、今までのCONNECTにバックポートするというのが今回の「Modernizing HTTP Forward Proxy Functionality」になります (参考: MLでの著者のメール)

拡張CONNECT

拡張CONNECTの仕組みは以前説明したとおりです
asnokaze.hatenablog.com

今までのCONNECTメソッド問題点

今までのCONNECTメソッドの使い方は次のとおりです

クライアントはProxyに対してCONNECTメソッドを行い、TCP通信のデータをTargetにForwardしてもらいます

CONNECT server.example.com:80 HTTP/1.1
Host: server.example.com

この方法では

  • Proxyサーバは単一のエンドポイントしか提供できない。VirtualHostや、Pathを使ってサービスを分ける事ができない。
  • クライアントはIPアドレスでTargetを指定する際に、IPv4IPv6どちらで指定すれば良いかわからない

Modernizing HTTP Forward Proxy Functionality

本提案では、拡張CONNECT同様、ProxyのエンドポイントとしてPathを指定できるようになっています。
また、targetとしてIPv4IPv6を併記し、Proxyが選択できるようになっています。

HTTP/1.1

HTTP/1.1ではProxyに対して次のリクエストを送って、targetにデータをforwardしてもらいます

GET /proxy?target_host=192.0.2.1,2001:db8::1&tcp_port=443 HTTP/1.1
Host: example.com
Connection: Upgrade
Upgrade: connect-tcp
  • GETのクエリパラメータとしてtarget_host, tcp_port を指定する
  • ConnectionヘッダにUpgrade を指定する
  • Upgradeヘッダに connect-tcp を指定する
HTTP/2, HTTP/3の場合

HTTP/1.1では拡張CONNECTと同様にリクエストします

CONNECT HTTP/2.0
:authority = request-proxy.example
:scheme = https
:path = /proxy?target_host=192.0.2.1,2001:db8::1&port=443
:protocol = connect-tcp
  • CONNECTで、クエリパラメータとしてtarget_host, tcp_port を指定する
  • protocol疑似ヘッダで connect-tcp を指定する