A TRACIO é um sistema de identificação cliente-servidor. O cliente coleta sinais do navegador e os envia ao servidor, que calcula um identificador de visitante estável, executa algoritmos de detecção e retorna resultados enriquecidos. Esta seção explica cada estágio do pipeline.
Browser TRACIO Cloud | | |-- Tracio.init({ publicKey }) ---------> | (init, no network) | | |-- tracio.getResult() ----------------> | | 1. Collect 130+ browser signals | | 2. Encrypt (XOR + deflate + B64) | | 3. POST to ingress endpoint | | | | |-- Decrypt & extract signals | |-- Compute visitor ID (MurmurHash3-128) | |-- Run bot detection (weighted scoring) | |-- Run smart signals (server-side enrichment) | |-- Run IP intelligence (VPN/proxy/Tor) | |-- Store visit event | | |<-- JSON response ------------------- | | visitorId, confidence, | | bot detection, smart signals | | | |-- Store visitor cookie (_vid_t) -----> | (365-day persistence)Quando tracio.getResult() é chamado, o cliente coleta 130+ sinais distintos de navegador organizados em camadas. A coleta usa um pipeline de múltiplas fases com Web Workers e iframes compartilhados para desempenho.
| Categoria | Contagem de Sinais | Exemplos |
|---|---|---|
| Canvas & WebGL | 9 | Impressão digital de canvas, renderer WebGL, parâmetros WebGL, WebGPU |
| Áudio | 3 | Impressão digital de AudioContext, latência base, timing de DRM |
| Fontes & Renderização | 10 | Detecção de fontes, preferências de fontes, MathML, renderização de emoji |
| Navigator & Plataforma | 25 | User-Agent, idiomas, tela, concorrência de hardware, fuso horário |
| Armazenamento & Cookies | 10 | localStorage, sessionStorage, cookies, cota de armazenamento |
| CSS & Media Queries | 10 | Esquema de cores, HDR, movimento reduzido, cores forçadas |
| Rede & WebRTC | 3 | Sonda TURN, RTT de conexão, versão do app |
| Bot Detection | 15 | Flag webdriver, frameworks de automação, eval length |
| Detecção de Adulteração | 8 | Introspecção de getter de propriedades, cadeias de protótipos, integridade de função nativa |
| Extensões Personalizadas | 14 | Impressão digital de Math, detecção de arquitetura, recursos WASM |
O pipeline de coleta roda em quatro estágios para minimizar o bloqueio da thread principal:
Estágio 1 (Imediato): sinais de alta prioridade que são rápidos de coletar (propriedades de navigator, tela, fuso horário). A sonda TURN também começa aqui, pois roda concorrentemente.
Estágio 2 (Idle Callback): sinais síncronos que se beneficiam de um período ocioso (media queries de CSS, sondas de armazenamento, testes de cookies).
Estágio 3 (Async): sinais que exigem APIs assíncronas ou renderização (canvas, WebGL, impressão digital de áudio, detecção de fontes, renderização de emoji).
Web Worker: coleta de sinais isolada em uma thread dedicada (detecção de recursos WASM, doNotTrack).
Um iframe oculto compartilhado é criado uma vez e reutilizado por múltiplos coletores (emoji, MathML, cores do sistema, fontes, frame de tela) para evitar o custo de criar iframes separados por sinal.
Todo sinal segue uma estrutura consistente:
interface Signal<T> { s: number // Status code v: T // Value (when successful)}Códigos de status:
| Código | Significado |
|---|---|
0 | Sucesso |
-1 | Não disponível (propriedade undefined) |
-2 | Verificação secundária falhou |
-3 | Comportamento inesperado |
-4 | Timeout |
-5 | Desabilitado |
-6 | Bloqueado por CSP |
-7 | Erro de segurança |
Os sinais coletados são serializados em JSON, depois criptografados e comprimidos antes da transmissão:
Serialização JSON: todos os valores de sinais são empacotados em um objeto JSON indexado por sinal, mais campos de metadados (c para chave de API, t para tag, lid para linked ID).
Compressão: se o payload exceder 1024 bytes, ele é comprimido usando CompressionStream("deflate-raw").
Criptografia XOR: o payload é envolvido em um envelope de criptografia:
Codificação Base64: o payload criptografado é codificado em Base64url e enviado como o corpo do POST.
A requisição é enviada ao endpoint de ingress com parâmetros de query para a versão do cliente e a chave de API. As credenciais CORS são incluídas para enviar cookies first-party.
O servidor recebe o payload criptografado e o processa através de vários subsistemas:
O servidor decodifica o envelope XOR, descomprime se necessário e faz o parse dos dados JSON dos sinais. O código de status e o valor de cada sinal são extraídos e validados.
O ID de visitante é calculado usando uma abordagem de hashing em camadas (V3):
Tier 1 (Frozen): 20 base62 characters - Stable hardware signals that rarely change - Canvas, WebGL renderer, audio fingerprint, fonts - Provides long-term visitor identity
Tier 2 (Semi-stable): 10 base62 characters - Signals that change with browser updates - User-Agent data, Client Hints, plugins - Extensible without breaking Tier 1
Tier 3 (Volatile): 10 base62 characters - Signals that change frequently - Screen resolution, timezone, language - Used for confidence scoring, not identityCada camada extrai seus sinais designados, constrói uma string canônica e a submete a hash com MurmurHash3-x64-128. Os três hashes das camadas são concatenados e codificados em base62 para produzir o ID de visitante final.
A pontuação de confiança (0.0 a 1.0) indica quão certo o sistema está de que este visitante foi corretamente identificado:
_vid_t corresponder, a confiança é máxima.O engine de detecção de bots executa múltiplos detectores cujas saídas ponderadas são combinadas em uma pontuação de bot (limiares: bot ≥ 0.70, suspicious ≥ 0.30; um sinal de falha imediata força um veredito de bot). Os detectores contribuintes incluem:
Os sinais de enriquecimento no servidor são calculados a partir dos dados brutos dos sinais e da IP intelligence. Eles incluem detecção de VPN/proxy/Tor, geolocalização de IP, análise de adulteração de navegador e suspect scoring.
O subsistema de IP intelligence fornece:
O servidor retorna uma resposta JSON contendo:
{ "visitorId": "X7fh2Hg9LkMn3pQr", "bot": { "detected": false, "confidence": 2, "reasons": [] }}Este é o resultado para o qual tracio.getResult() resolve no navegador. O
evento completo e enriquecido — incluindo o bot_result canônico
(human / bot / uncertain), geolocalização e smart signals — é
entregue no servidor através de webhooks e exibido no
dashboard.
O cliente armazena um token de visitante tanto em um cookie first-party (expiração de 365 dias, SameSite=Lax) quanto no localStorage para persistência entre sessões.
| Passo | Local | Duração | Descrição |
|---|---|---|---|
| 1 | Browser | ~5ms | Inicializar agente, criar iframe compartilhado |
| 2 | Browser | ~50-150ms | Coletar 130+ sinais (paralelo, multifase) |
| 3 | Browser | ~5ms | Criptografar e comprimir payload |
| 4 | Network | ~10-50ms | POST para o servidor |
| 5 | Server | ~5-20ms | Descriptografar, extrair sinais, calcular ID de visitante |
| 6 | Server | ~5-15ms | Executar detecção de bots e smart signals |
| 7 | Server | ~5ms | Construir resposta |
| 8 | Network | ~10-50ms | Retornar resposta JSON |
| 9 | Browser | ~1ms | Armazenar cookie de visitante |
Round-trip total: tipicamente 80-300ms dependendo das condições de rede e das capacidades do navegador.