Visão Geral
Proteger seus endpoints de webhook é crítico para garantir que as solicitações de webhook venham do Gu1 e não de atores maliciosos. Este guia cobre como verificar assinaturas de webhook, implementar melhores práticas de segurança e evitar erros de segurança comuns.Verificação de Assinatura
Gu1 assina todas as solicitações de webhook com uma assinatura HMAC SHA-256 usando seu secret de webhook. A assinatura é enviada no headerX-Webhook-Signature, permitindo que você verifique se a solicitação é autêntica.
Como Funciona a Verificação de Assinatura
- Gu1 gera uma assinatura: Ao enviar um webhook, Gu1 cria um hash HMAC SHA-256 do corpo raw da solicitação usando seu secret de webhook
- Assinatura é enviada no header: A assinatura é incluída no header
X-Webhook-Signature - Seu servidor recalcula: Seu endpoint recalcula a assinatura usando o mesmo secret e corpo raw
- Comparar assinaturas: Se as assinaturas corresponderem, o webhook é autêntico
Exemplos de Verificação de Assinatura
Node.js (Express)
Crítico: Você deve verificar a assinatura usando o corpo raw da solicitação antes de ser analisado como JSON. Se você verificar contra o corpo JSON analisado (por exemplo,
JSON.stringify(req.body)), a assinatura não corresponderá porque a formatação JSON pode diferir.Python (Flask)
Go (Gin)
Corpo Raw vs JSON Analisado
Um erro comum é verificar a assinatura usando o objeto JSON analisado em vez do corpo raw da solicitação. Isso sempre falhará porque a formatação JSON pode diferir.O que a Gu1 assina (e o que não assina)
A Gu1 calculaHMAC-SHA256(secret, raw_request_body) e envia o digest hexadecimal em X-Webhook-Signature.
Use comparação timing-safe ao validar a assinatura (por exemplo
crypto.timingSafeEqual no Node.js). Veja a seção de boas práticas abaixo.Histórico de webhooks no dashboard
O monitor de webhooks exibe o payload para debug e suporte. Essa visualização não é a string byte a byte que foi assinada no envio. Pretty-print, copiar da UI ouJSON.stringify() em um objeto parseado pode gerar uma string diferente e fazer uma entrega correta parecer inválida.
Para depurar uma falha, compare o header X-Webhook-Signature recebido pelo seu endpoint com o HMAC calculado sobre o raw body daquele mesmo request HTTP. Não re-verifique apenas com o JSON do dashboard.
Falhas intermitentes de assinatura
Se a verificação funciona em alguns eventos mas em outros retorna401 Invalid signature com o mesmo secret e endpoint, as causas mais comuns são:
- JSON parseado e re-serializado —
JSON.stringify(req.body)apósexpress.json()(ou equivalente) não reproduz de forma confiável os bytes do body da Gu1. Payloads diferentes (ordem de chaves, forma aninhada, formatação numérica) podem falhar só às vezes. - Middleware que altera o body — deduplicar arrays, remover campos
null, ordenar chaves ou normalizar strings antes de verificar muda o input assinado. - Secret incorreto — secret regenerado no dashboard enquanto o valor antigo permanece no seu ambiente.
- Header de assinatura ausente — se o webhook não tiver secret configurado, a Gu1 pode omitir
X-Webhook-Signature; tratar header ausente como assinatura inválida é esperado.
Padrões de Idempotência
Webhooks podem ser entregues mais de uma vez devido a problemas de rede, timeouts ou tentativas. Implemente idempotência para garantir que você processe cada webhook apenas uma vez.Idempotência Baseada em Banco de Dados
Armazene IDs de webhook processados no seu banco de dados:Idempotência Baseada em Cache
Para webhooks de alto volume, use um cache como Redis:Melhores Práticas de Segurança
1. Sempre Verificar Assinaturas
1. Sempre Verificar Assinaturas
Nunca pule a verificação de assinatura em ambientes de produção. Esta é sua defesa principal contra webhooks falsos.
2. Usar Apenas HTTPS
2. Usar Apenas HTTPS
Configure seus endpoints de webhook para usar apenas HTTPS. Rejeite solicitações HTTP:
3. Validar Tipos de Eventos
3. Validar Tipos de Eventos
Processe apenas tipos de eventos que você está esperando:
4. Implementar Limitação de Taxa
4. Implementar Limitação de Taxa
Proteja seu endpoint contra abuso com limitação de taxa:
5. Armazenar Secrets de Webhook com Segurança
5. Armazenar Secrets de Webhook com Segurança
Nunca codifique secrets de webhook. Use variáveis de ambiente ou gerenciamento de secrets:Para produção, use um gerenciador de secrets:
- AWS Secrets Manager
- HashiCorp Vault
- Azure Key Vault
- Google Secret Manager
6. Validar Estrutura do Payload
6. Validar Estrutura do Payload
Valide a estrutura do payload do webhook antes de processar:
7. Usar Comparações Seguras Contra Timing
7. Usar Comparações Seguras Contra Timing
Ao comparar assinaturas, use funções de comparação seguras contra timing para prevenir ataques de timing:
8. Implementar Logs de Webhook
8. Implementar Logs de Webhook
Registre todas as tentativas de webhook para auditoria e depuração:
9. Retornar 200 Rapidamente
9. Retornar 200 Rapidamente
Responda com código de status 200 rapidamente para prevenir tentativas. Processe trabalho pesado assincronamente:
10. Implementar Lógica de Tentativa
10. Implementar Lógica de Tentativa
Se o processamento de webhook falhar, armazene para tentativa:
Erros Comuns de Segurança a Evitar
1. Pular Verificação de Assinatura
2. Verificar JSON Analisado Em Vez de Corpo Raw
3. Usar HTTP Em Vez de HTTPS
4. Codificar Secrets
5. Não Implementar Idempotência
6. Expor Erros aos Clientes
7. Não Validar Tipos de Eventos
8. Usar Secrets Fracos
Testando Segurança de Webhook
Testar Assinaturas Inválidas
Testar Ataques de Replay
Envie o mesmo webhook duas vezes e verifique idempotência:Monitoramento e Alertas
Configure monitoramento para segurança de webhook:Próximos Passos
Configuração de Webhook
Aprenda como configurar webhooks
Eventos de Entidades
Lidar com eventos de ciclo de vida de entidades
Eventos KYC
Processar eventos de verificação KYC
Eventos de Regras
Responder a regras de conformidade