Explicado
Quando seu cliente abre uma conexão TLS, os primeiros bytes são um pacote ClientHello que descreve quais conjuntos de cifras, versões do TLS, extensões, curvas elípticas e valores ALPN o seu cliente suporta. A lista exata e a ordem desses atributos são específicas da implementação — o ClientHello do Chrome é diferente do Firefox, que é diferente do curl, que é diferente da biblioteca `requests` do Python, e assim por diante.
O JA3 (e seu sucessor JA4) é um formato de hash que transforma a estrutura do ClientHello em um identificador curto. Fornecedores de anti-bot calculam esse hash para cada conexão TLS recebida e o comparam com assinaturas conhecidas. Se o seu scraper usa `requests` do Python, sua fingerprint TLS corresponde ao padrão do OpenSSL e é instantaneamente identificada como 'não é um navegador real' — mesmo antes de você enviar um único byte HTTP.
É por isso que tantos scrapers falham no Cloudflare, Akamai e stacks semelhantes mesmo quando o IP e o User-Agent parecem corretos. A camada TLS denuncia que a requisição não veio do Chrome. Bibliotecas modernas de stealth (como `curl_cffi`, `tls-client`, Playwright com as flags de inicialização certas) imitam fingerprints TLS de navegadores reais para evitar isso.
Como Funciona
O JA3 constrói a fingerprint a partir de cinco campos do ClientHello: versão do TLS, cipher suites suportadas, extensões suportadas, curvas elípticas suportadas e formatos de ponto de curva elíptica suportados. Ele os junta, aplica hash MD5 ao resultado e produz uma assinatura de 32 caracteres.
O JA4 (o substituto moderno) estende isso com ALPN, versão, presença de SNI, tratamento de GREASE, e ordena as extensões de forma estável e resistente à randomização. O JA4 também tem variantes para QUIC (JA4Q), HTTP (JA4H) e sessão SSL (JA4S). Os servidores calculam a fingerprint e ou a verificam em listas de permissão/bloqueio ou a alimentam em um modelo de pontuação de risco junto com outros sinais.