All articles Advanced signals

HTTP/2 Fingerprinting: Passive Signals Beyond the TLS Handshake

TLS fingerprinting gets the attention, but the HTTP/2 layer sitting on top of it leaks just as much and is just as passive. Every client announces framing preferences the moment a connection opens, and those preferences vary by library, browser, and version in ways an attacker rarely bothers to match.

What HTTP/2 exposes at connection time

HTTP/2 replaces plain-text HTTP with a binary framing layer, and that layer negotiates behavior up front. Several elements of this negotiation are stable per client and observable server-side:

  • SETTINGS frame values: parameters like SETTINGS_HEADER_TABLE_SIZE, SETTINGS_MAX_CONCURRENT_STREAMS, SETTINGS_INITIAL_WINDOW_SIZE, and SETTINGS_MAX_HEADER_LIST_SIZE. Their values and even their order differ between implementations.
  • Window update behavior: the initial connection-level flow-control window a client advertises.
  • Pseudo-header ordering: the order of :method, :authority, :scheme, and :path in the first request. Browsers emit a characteristic order; many HTTP libraries emit a different one.
  • Header priority and dependency hints: how the client structures stream priorities.
  • Header casing and ordering of regular headers, which browsers and scripts handle differently.

This combination is often summarized as an Akamai-style HTTP/2 fingerprint, and it is remarkably consistent within a browser family and version.

Why it complements TLS JA4

A TLS fingerprint such as JA4 describes the encryption handshake: cipher suites, extensions, and supported groups. An HTTP/2 fingerprint describes the framing that follows. They are independent, which is exactly what makes the pair powerful.

A sophisticated bot might use a TLS library patched to mimic Chrome’s handshake, producing a convincing JA4. But if it then drives requests through a generic HTTP/2 client, the SETTINGS values and pseudo-header order betray the mismatch. A real Chrome TLS fingerprint paired with a Go or Python HTTP/2 framing signature is a contradiction that no legitimate browser produces. Prynt scores the pair together, so faking one layer is not enough.

Why passive signals are hard to evade

The great strength of both TLS and HTTP/2 fingerprints is that they are passive. They are derived from the connection itself before a single line of JavaScript runs. This means:

  • They work against clients that block or strip scripts.
  • They cannot be patched by overriding a JavaScript API in an anti-detect browser.
  • They reflect the actual networking stack, which is far harder to modify than a navigator property.

To change its HTTP/2 fingerprint convincingly, an attacker must reimplement the framing layer to match a target browser exactly, including SETTINGS ordering and flow-control quirks. Few do, and those that try often get a detail wrong.

How Prynt uses HTTP/2 framing

Prynt captures the HTTP/2 fingerprint at its edge and joins it with the TLS fingerprint and the client-side signal set. The three layers reinforce each other:

  • Network layer: TLS JA4 and HTTP/2 framing describe the stack.
  • Client layer: canvas, WebGPU, screen, and locale describe the browser and device.
  • Correlation: contradictions between layers, such as a browser-like TLS handshake with library-like HTTP/2 framing, surface automation.

This layered view feeds directly into Prynt’s bot detection, where passive network signals catch the bots that defeat client-side checks and vice versa. Because Prynt is a cloud platform terminating connections at its own edge, it sees the raw framing that a client-side-only tool never can.

Version drift and maintenance

Passive network fingerprints are durable but not frozen. Browser vendors adjust their HTTP/2 SETTINGS values and flow-control defaults between major releases, so a signature that perfectly matched Chrome a year ago will not match today’s build. A detection system that hard-codes exact framing values will start flagging legitimate up-to-date browsers as anomalies. The maintainable approach is to model framing as a distribution that evolves with browser releases rather than a fixed string, and to update reference signatures as new versions ship. Prynt maintains these reference profiles centrally, so customers inherit updated signatures without touching their own code. This is a quiet advantage of a cloud model: the framing knowledge lives in one place that stays current, instead of in dozens of stale rule sets scattered across origins.

Practical considerations

  • Do not rely on HTTP/2 framing alone; pair it with TLS and client signals for a complete picture.
  • Account for CDNs and proxies, which can normalize or rewrite framing before it reaches your origin. Prynt captures the fingerprint at the edge to avoid this loss.
  • Expect framing to shift between browser major versions, so keep signatures updated rather than hard-coded.
  • Treat a browser TLS fingerprint with non-browser HTTP/2 framing as a strong automation signal.

HTTP/2 fingerprinting is a reminder that the network stack tells its own story, independent of anything a page can override. Combined with TLS, it forms a passive foundation that the client layer then confirms or contradicts.

See how passive network signals combine with device intelligence. Start on the free tier.

Try it free

Prynt is device intelligence with a free tier — visitor IDs, bot & fraud Smart Signals, and behavioral biometrics, powered by a cross-site network. Start free.

Keep reading