Syllabus Lesson 138 of 156 · Privacy tech beyond blocking
Privacy tech beyond blocking

Oblivious HTTP

Why it matters Many apps quietly ask a server small questions: "is this site on a list of harmful sites?", "what is the weather here?", "send this crash report". Each request reveals both who asked (your IP address) and what they asked. Oblivious HTTP splits those two facts between two different companies, so neither alone can join them.

The sealed letter and the post office

You want to ask a question of an advice service without it knowing who you are. You seal your question in an envelope only the advice service can open, and hand it to a post office. The post office sees your face but cannot read the letter. The advice service reads the letter but only sees the post office. Unless the two compare notes, nobody knows both who you are and what you asked.

Oblivious HTTP (OHTTP): a standard (RFC 9458, published in 2024) for sending an encrypted web request through a relay, so the relay knows who is asking but not what, and the server knows what is asked but not by whom.

HTTP: the language browsers and servers use for requests ("GET me this page") and responses. Usually your device sends it directly to the server, which also sees your IP address.

The parts

  • Client: your app or browser. It fetches the gateway's public key in advance and encrypts each request with it, using a method called HPKE (Hybrid Public Key Encryption, RFC 9180).
  • Relay: run by one organisation. It receives the encrypted request from your IP address and forwards it, without your address, to the gateway. It cannot read it.
  • Gateway: run by, or for, the service. It decrypts the request, passes it to the real server, and encrypts the response so only your client can read it.
  • Target: the actual service that answers.
PartyKnows who you are (IP)?Knows what you asked?
RelayYesNo
Gateway and targetNoYes
Both, if they colludeYesYes

Where it fits and where it does not

OHTTP is designed for separate, one-off requests that should not be linked to each other: a safety lookup, a telemetry report, a single query. Each request is sealed independently, so there are no cookies or sessions joining them. That is also its limit: it is not for browsing a website, logging in, or anything that needs the server to remember you between requests.

It is also not anonymity against everyone. The whole design rests on the relay and the gateway being run by different organisations that do not share logs. And the content of the request can still identify you: a request that includes your account number tells the service who you are, however it was delivered.

Compared with things you know

  • A VPN hides your IP from sites, but the VPN provider sees both who you are and every site you contact. OHTTP splits those so no single party has both.
  • Anonymity networks, covered in the next module, route traffic through several relays for whole browsing sessions. OHTTP uses one relay for individual requests, which is simpler and faster but protects less.

A common misconception

"Encrypted means anonymous." Ordinary HTTPS already encrypts the request, but the server still sees your IP address with it. Encryption hides content from people in the middle; OHTTP's relay is what hides you from the server.

Try it See what one direct request reveals. Open your browser's developer tools (F12, or Cmd+Option+I on a Mac), choose the Network tab and load any page. Click the first request and look at its headers: the server receives your request, your cookies for that site, your browser's language and, invisibly, your IP address, all together. With OHTTP, the relay would get the IP address and the gateway would get the rest.

Recap

  • Oblivious HTTP (RFC 9458) splits who you are (the relay sees your IP) from what you asked (the gateway sees the request).
  • The client encrypts each request to the gateway's public key, so the relay cannot read it.
  • It suits single, unlinked requests, not logged-in browsing.
  • It only works if relay and gateway do not collude, and it cannot hide identifying details inside the request itself.

Spotted a problem in this lesson? Report it

Code · runs in your browser
Output