プライバシーを保護する Oblivious HTTP の仕様 (OHTTP)

ユーザのトラッキングを防ぐ「Oblivious HTTP」という仕様が、Mozilla及びCloudFlareの方らの共著でIETFに提出されています。この仕様では、ユーザのIPアドレスを隠す仕組みを提供します。これによって、サーバが受信した複数のリクエストが同一ゆーざのものであるかわかりにくします。

先行して、CloudFlareは「Oblivious DoH」という仕組みを提案している。これはDNS over HTTPSのクライアントIPアドレスを隠蔽する仕組みである。その仕組をHTTPに適応したのがOblivious HTTPである。
blog.cloudflare.com

Googleが別途提唱している「Privacy Sandbox」でも、IPアドレスはユーザを識別するための要素であり、対策が検討されています。Privacy Sandboxの中では「Near-Path NAT」という仕組みを提案してる。HTTP/3上で通信をトンネリングする「MASQUE」の利用が検討されている模様。
github.com

今回は、Oblivious HTTPについて簡単に見ていく。

概要

通常のHTTP通信では、サーバ側はクライアントのIPアドレスと、HTTPリクエストの中身の両方を読むことができます。

Oblivious HTTPでは、ProxyはIPアドレスのみ、サーバ側はリクエストの中身のみを取得できます。
(通常Forward Proxyでも同様ですが、コネクションを張りっぱなしにしていると同一ユーザであることは分かってしまいます。)

クライアント・サーバサイドでのサポートが必要ではありますが、TorなどのIPアドレスを隠蔽する方式に比べて軽量であることも謳っています。

登場人物
  • クライアント: HTTPリクエストをOblivious Request Resourceの鍵で暗号化し、カプセル化してOblivious Proxy Resourceに送信します
  • Oblivious Proxy Resource: クライアントから受け取ったカプセル化されたリクエストをそのままOblivious Request Resourceに送信します
  • Oblivious Request Resource: カプセル化されたリクエストから、本来のリクエストを取り出して通常のHTTPリクエストとしてWebサーバ(Oblivious Target Resource)に渡します。

f:id:ASnoKaze:20210207212646p:plain

このように、間に信頼できるProxyサービスが入る形で、ユーザのIPアドレスを隠蔽する。

HTTPリクエストのカプセル化

クライアントは、もともと送りたいHTTPリクエストを暗号化しカプセル化します。

暗号化の処理では、まず
Binary Representation of HTTP Messages」という仕様にのっとりHTTPメッセージをバイナリ表現に変換します。それを、「Hybrid Public Key Encryption (HPKE)」で定義されるように、Oblivious Request Resourceの公開鍵で暗号化します。

クライアントは、暗号化したデータをPOSTリクエストのボディに格納し、Oblivious Proxy Resourceに送信します。

POST /request.example.net/proxy HTTP/1.1
Host: proxy.example.org
Content-Type: message/ohttp-req
Content-Length: 78

<content is the encapsulated request above>

Oblivious Proxy Resourceは受け取ったデータをそのままOblivious Request Resourceに送ります。

POST /oblivious/request HTTP/1.1
Host: example.com
Content-Type: message/ohttp-req
Content-Length: 78

<content is the encapsulated request above>

Oblivious Request Resourceは受け取ったボディから元のリクエストを取り出して、通常通りのHTTPリクエストとしてOblivious Target Resourceが処理します。

わからなかったところ

Oblivious Proxy Resourceがどうやって、転送先のOblivious Request Resourceを選択するのかちょっとわからなかった。

ODoHだと外側のGETリクエストパラメータに転送先が入ってるようだけど、Oblivious HTTPでは...?