Web Browsing
Browsing a website means fetching pages by name. Each request carries a URL and often a query string. The site on the other end is the party you talk to directly, so it is the primary adversary.
What must not leak
The secret here is not your identity alone. It is your browsing history: the set of pages and queries, tied to a person. That history must not be attributable, and the requests must not group into one profile.
The threat model
The primary adversary is L2, the website or API. The dominant vector is V3 content: the URL and the query are the request, so the site reads which pages you fetch. Hiding your IP does not change that.
Browsing also faces an application-specific public observer.
| L1 | Public-record observer |
|---|---|
| Vantage | Reads public DNS and Certificate Transparency logs. |
| Sees | Which domains and subdomains exist, and the certificates issued for them. |
| Cannot see | Which user visits a site, which pages they request, or request content. |
The invariants a browser must hold:
| Invariant | Statement | Depends on |
|---|---|---|
| A. History not attributable | The set of URLs and queries must not link to a person. | P1, plus P2, plus V3 content discipline: the URLs name the content. |
| B. Requests not groupable | The site must not group requests into one profile. | P2 exit rotation, plus V3 request-shape discipline. |
Unprotected: the site reads everything
The browser talks to the website directly. The site sees the client IP, every URL and query, and the full request pattern. The history is attributed with no effort.
Protected: rotate exits, and the site still reads the URLs
Distinct WireGuard peers at several exits split requests across exit IPs. Per-request rotation unlinks requests at the transport layer, and browsing stays fast.
The verdicts show P1 yes and P2 yes at the site, and that is only half the story. IP-hiding and exit rotation do not touch the dominant vector. The site still reads the exact URL and query of every request, because the content is the request. A login cookie or a personalised query re-links the session regardless of exit.
Transport hides who you are from the site. It does not hide what you fetch. Protecting the browsing history itself is a hygiene-layer job: discipline the request shape and strip the identifiers, work that no configuration does for you.
Where to go next
- Choose a Defence picks a configuration for your case.
- Build it maps the configuration you picked to a package, for Rust and for the browser.
- The two-layer model explains why transport alone is never the whole answer.
- Packet Anatomy shows what a Sphinx packet exposes and hides.