← Blog
10 min de lectura
|
Publicado

Mejores prácticas de registro de webhooks: qué registrar y qué ocultar

Mejores prácticas de registro de webhooks para receptores: los campos que debe registrar, los secretos que debe mantener fuera, cómo rastrear reintentos y duplicados, y alertas que detectan fallos de forma temprana.

Capítulos
C
Chaingateway Team
Expertos en blockchain

Revisado por Maurice Sobiera

Isometric event tiles moving through logging stages

Un buen registro de webhooks se reduce a una regla: registre suficientes metadatos para reconstruir lo que ocurrió con cada entrega y mantenga las cargas útiles, los secretos y los valores de firma fuera de sus registros. Utilice entradas estructuradas indexadas por un ID de entrega o de evento. Capture el resultado de la verificación, el número de intento, el estado HTTP que devolvió y el resultado final del procesamiento. A continuación, configure alertas sobre los patrones que importan: picos de fallos, avalanchas de duplicados, acumulación en cola y silencio.

Esta guía muestra los campos, las reglas de ofuscación, los patrones de reintento y duplicados, y los umbrales de alerta. Está escrita para desarrolladores que reciben webhooks, incluidos eventos de pagos y depósitos en cadena.

TL;DR

  • Registre una entrada estructurada por entrega: ID de evento, marca de tiempo, endpoint, tipo de evento, resultado de la firma, número de intento, estado de respuesta, latencia y resultado del procesamiento.
  • Nunca registre secretos de firma, valores de cabecera de firma, cabeceras Authorization ni cuerpos de solicitud completos. Registre un hash e identificadores seguros en su lugar.
  • Trate los duplicados como algo normal. Base la idempotencia en el ID de entrega o de evento del proveedor y registre un estado “duplicado” en lugar de descartar el evento silenciosamente.
  • Verifique, encole, acuse recibo: registre cada etapa por separado para poder distinguir un fallo de recepción de un fallo de procesamiento.
  • Alerte sobre la tasa de fallos, fallos de firma, profundidad de cola, crecimiento de la cola de mensajes fallidos y silencio inesperado, no sobre errores individuales.

Tabla de contenidos

Qué debe responder un registro de webhook

Un registro útil responde a tres preguntas para cualquier entrega: qué llegó, qué hizo su sistema con ello y cómo terminó el procesamiento. Si un cliente pregunta por qué nunca apareció un pago, debería poder responder en un minuto: ¿llegó el evento a nosotros?, ¿lo aceptamos?, ¿lo procesamos?, ¿qué devolvimos?

Tres preguntas respondidas por un registro de webhook útil

Este enfoque decide los campos. Todo lo que registre debería ayudar a responder a una de esas tres preguntas. Cualquier cosa que no lo haga, como un volcado completo del cuerpo “por si acaso”, es coste y riesgo sin beneficio.

Los campos que debe registrar para cada entrega

Las guías de distintas fuentes convergen en una lista básica corta. La Hoja de trucos de seguridad de webhooks de OWASP recomienda registrar la marca de tiempo, la IP de origen, el método HTTP, el estado de respuesta, el ID del evento, el tipo de evento y la latencia de procesamiento. La documentación de Mambu añade la ruta del endpoint, la cabecera de clave de idempotencia, un resultado de alto nivel (aceptado, rechazado o fallido) y un ID de correlación o traza. El registro de entregas de Formspring muestra cómo puede ser un registro por intento: un número de intento, el estado HTTP, un código de error breve cuando la solicitud nunca se completó, la latencia, la hora de envío y la hora del próximo reintento.

Combinados, un registro práctico del lado del receptor tiene este aspecto:

CampoPor qué merece su lugar
ID de evento o entregaLa única clave que une todo lo demás; responde a “¿hemos visto esto antes?”
Marca de tiempo de recepción (UTC)Ordena los eventos y mide el retraso frente a la marca de tiempo del proveedor
Endpoint, método, tipo de eventoPermite agrupar fallos por ruta y tipo
IP de origenAyuda a detectar entregas desde direcciones inesperadas
Resultado de la firma y motivo del falloSepara las solicitudes falsificadas o mal configuradas de los fallos reales
Número de intentoIndica si se trata de una primera entrega o un reintento
Estado HTTP devueltoLo que el proveedor vio desde su lado
Estado de procesamientoRecibido, en cola, procesado, fallido o duplicado
LatenciaLos reconocimientos lentos provocan reintentos y, por tanto, duplicados
Hash de la carga útilDemuestra lo que llegó sin almacenar el contenido
ID de correlación o trazaSigue el evento a través de su cola, workers y llamadas posteriores

Utilice una lista fija de motivos de fallo breves (por ejemplo bad_signature, malformed_body, downstream_timeout) en lugar de mensajes de texto libre. Un conjunto fijo es fácil de filtrar, contar y graficar.

Defina la forma del registro una sola vez

Diseñe la entrada en una función auxiliar y llámela en todas partes. Las llamadas ad-hoc console.log(request) son la forma en que secretos y datos personales se filtran en los almacenes de logs. Una función central con una lista de permitidos explícita de campos hace que la forma segura sea la única forma.

{
"ts": "2026-11-04T14:03:22.481Z",
"event_id": "evt_8f31c2",
"event_type": "deposit.confirmed",
"endpoint": "/hooks/payments",
"signature": "valid",
"attempt": 1,
"status": 202,
"latency_ms": 41,
"state": "queued",
"payload_sha256": "9b74c9...",
"trace_id": "4bf92f3577b34da6"
}

Si el proveedor no envía un identificador de entrega, genere un UUID o ULID en su balanceador de carga o proxy, páselo a las llamadas posteriores y devuélvalo en las respuestas de error. Su propio ID hará entonces el trabajo que haría un ID de proveedor.

Qué mantener fuera de sus logs

Aquí es donde la mayoría de los logs fallan. OWASP es explícito: no registre cuerpos de solicitud completos, secretos de firma, ni los valores de las cabeceras Authorization y de firma, y elimínelos de los logs y respuestas de error. La guía de seguridad de webhooks de Twilio dice asimismo que los cuerpos de solicitud completos deben permanecer fuera de los logs de la aplicación, con campos sensibles redactados o excluidos.

Un valor de cabecera de firma no es un metadato inofensivo. Junto con un cuerpo filtrado, puede ayudar a alguien a estudiar su esquema de verificación, y muchos almacenes de logs son legibles por muchas más personas que su gestor de secretos. Trate los logs como un sistema de menor confianza que su aplicación.

Lista de permitidos, no lista de bloqueados

Construya cada entrada de log a partir de los campos que ha nombrado, en lugar de serializar la solicitud completa y eliminar las claves peligrosas después. Una lista de bloqueados falla la primera vez que un proveedor añade un nuevo campo sensible. Una lista de permitidos falla de forma segura: un nuevo campo simplemente no aparece.

Para capas más allá de la lista de permitidos, la guía de GitGuardian para mantener secretos fuera de los logs describe un enfoque multicapa: minimice los datos que maneja, redacte, tokenice o hashee lo que queda, envuelva cadenas sensibles en tipos que rechacen la serialización accidental y añada pruebas que fallen cuando aparezcan patrones sensibles en la salida capturada.

Registre referencias, no contenido

Cuando necesite apuntar a la carga útil, hágalo indirectamente:

  • Un hash SHA-256 del cuerpo sin procesar, para poder demostrar que dos entregas fueron idénticas o detectar que el mismo ID de evento regresó con diferente contenido.
  • El ID de evento del proveedor y los IDs de recursos, como un identificador de pedido, factura o transacción.
  • Los últimos cuatro caracteres de un identificador donde un humano necesite reconocerlo.

Si debe conservar la solicitud firmada sin procesar para reenvío, guárdela en un almacén separado y con acceso controlado, como una cola cifrada o un almacén de objetos restringido, con su propia retención corta, y recupérela por ID de entrega cuando alguien esté autorizado a investigar. Mantenga la retención de metadatos independiente de la retención de la carga útil: los metadatos son baratos y útiles durante meses, mientras que las cargas útiles son una responsabilidad en el momento en que dejan de ser necesarias.

Si la URL de su endpoint contiene un secreto, redacte la ruta antes de que llegue a los logs del balanceador de carga, proxy inverso o APM. Esas capas registran URLs por defecto.

Registre la verificación de firma como su propio paso

La verificación merece su propia línea de log, separada del procesamiento. La guía de OWASP es usar la biblioteca de verificación mantenida por el publicador, darle el cuerpo de la solicitud sin procesar antes de cualquier análisis del framework, recalcular el HMAC, comparar en tiempo constante y aceptar solo el esquema de firma esperado. Cuando la firma falte o sea incorrecta, devuelva 401 sin explicar por qué.

Lo que registra aquí es el veredicto, no la evidencia: aprobado o fallido, el esquema y un código de motivo corto. Nunca la firma calculada o recibida. Un aumento en el recuento de fallos es una de sus mejores señales tempranas, porque puede significar un secreto rotado, un proxy alterando el cuerpo o sondeos.

Una firma válida prueba quién envió la carga útil, no que su contenido sea seguro. Valide el esquema y los valores antes de actuar, y registre los fallos de validación por separado de los fallos de firma para que las dos causas no se confundan.

Por nuestra parte, añadimos más control sobre esta capa; nuestra publicación sobre una nueva función para mejorar la seguridad de los webhooks explica cómo funcionan las entregas firmadas.

Registre la verificación de firma como su propio paso

Verifique, encole, acuse recibo: registre cada etapa

El diseño de receptor más fiable es breve: verifique la firma, ponga el evento en una cola, devuelva un 2xx rápidamente y realice el trabajo real de forma asíncrona. Los proveedores esperan respuestas rápidas, y un gestor lento provoca reintentos, lo que crea duplicados.

Ese diseño le proporciona puntos de registro naturales:

  1. Ingesta: solicitud recibida, tamaño, IP de origen, ID del evento.
  2. Validación: veredicto de firma y esquema, con el código de motivo en caso de fallo.
  3. Cola: evento aceptado, nombre de la cola, hora programada.
  4. Procesamiento: inicio del trabajador, resultado, duración, código de error si lo hay.
  5. Reintento o carta muerta: hora del próximo intento, o el motivo por el que el evento quedó aparcado.

Mantenga el mismo ID de evento e ID de traza a lo largo de los cinco. Entonces, un filtro por el ID de evento devuelve toda la historia, y puede ver exactamente dónde se detuvo una entrega. Si desea una visión más profunda de este patrón, nuestro artículo sobre webhooks vs WebSockets y el patrón de ingesta, cola, fan-out lo recorre en detalle.

Registro de reintentos, duplicados y fallos

Los duplicados son normales

Los proveedores que garantizan la entrega al menos una vez enviarán el mismo evento más de una vez, especialmente después de un tiempo de espera por su parte. Por tanto, los duplicados no son una anomalía que ocultar. Regístrelos como un estado.

Utilice el ID de entrega o de evento inmutable del proveedor como clave de idempotencia. Si los IDs son únicos solo por cuenta, delimite la clave por proveedor y cuenta. Cuando un evento se vuelva a ver, registre duplicate, omita el trabajo y devuelva igualmente 2xx para que el proveedor deje de reintentar. Si el mismo ID llega alguna vez con un hash de carga útil diferente, no lo procese: póngalo en cuarentena y alerte a alguien.

Lea los códigos de estado como lo hacen los proveedores

La forma en que un proveedor trata su respuesta determina su tráfico de reintentos. Un esquema documentado trata un 2xx en unos pocos segundos como éxito, trata 408, 429, 5xx y tiempos de espera como reintentables con retroceso, y trata otras respuestas 4xx como fallos permanentes que pasan a un estado muerto sin más reintentos (documentación de webhooks de ObjectOS). Los proveedores difieren, así que compruebe el suyo, pero la lección se mantiene: el estado que devuelve es una decisión sobre si el evento vuelve.

Por eso es tan útil registrar el estado devuelto y el número de intento juntos. Una ráfaga de 500s seguida de entradas de intento 2 y 3 le indica que la causa está en su lado y que los reintentos ya están en camino.

Use niveles de registro que coincidan con la urgencia

Asigne resultados a niveles para que los ingenieros de guardia puedan filtrar: éxito en info, respuestas 4xx en warn, y 5xx, tiempos de espera y errores de red en error. Mantenga el registro de depuración desactivado en producción por defecto, porque la salida de depuración es donde tienden a aparecer cargas útiles y cabeceras.

Separe sus reintentos de los del proveedor

Dos bucles de reintento se acumulan rápidamente. El proveedor reintenta la entrega hacia usted; sus propios trabajadores pueden reintentar una llamada descendente fallida. Registre a cuál pertenece un intento, reintente solo fallos transitorios como tiempos de espera y 429, 502, 503 y 504, use retroceso exponencial con fluctuación (jitter), y mueva los eventos agotados a una cola de cartas muertas donde una persona pueda revisarlos.

Muestree solo los éxitos de alto volumen

A volúmenes muy altos, registrar cada primer intento exitoso resulta costoso. Un compromiso común es muestrear una pequeña fracción de éxitos limpios manteniendo cada reintento, fallo, evento de carta muerta y fallo de firma. Mantenga los recuentos de métricas exactos incluso cuando las líneas de registro se muestreen, para que los paneles sigan siendo honestos.

Métricas y alertas construidas sobre los registros

Los registros explican una entrega; las métricas muestran si el sistema está sano. Derive ambos a partir de los mismos campos estructurados. La guía de monitorización de webhooks de Field Nation ofrece un conjunto inicial concreto de objetivos:

MétricaObjetivo inicial
Tasa de éxito de entregaSuperior al 99 %
Latencia de entregaInferior a 5 segundos en p95
Tasa de reintentosInferior al 5 %
Tasa de tiempos de esperaInferior al 1 %
Duración del procesamientoInferior a 2 segundos en p95
Profundidad de la colaInferior a 100
Tamaño de la cola de mensajes fallidos0

Trate estos valores como una línea base para ajustar contra su propio tráfico, no como umbrales universales. Una cola de pagos y una cola de boletines merecen números distintos.

La guía de alertas de OWASP se centra más en patrones que en cifras: alerte sobre picos en fallos de firma, sobre respuestas 4xx o 5xx sostenidas y sobre entregas desde direcciones de origen inesperadas. Añada tres más que cuestan poco:

  • Silencio: no se reciben eventos durante más tiempo que su intervalo normal. Un endpoint silencioso suele ser una suscripción rota o una URL cambiada.
  • Crecimiento de la cola de mensajes fallidos: cualquier subida sostenida significa que los eventos están fallando definitivamente.
  • Tasa de duplicados: se espera cierta duplicación, pero una tasa alta suele significar que su endpoint está confirmando demasiado lento.

Notifique a una persona en condiciones que requieran acción (tasa de fallos en una ventana, cola creciendo, cola de mensajes fallidos acumulando), y envíe el resto a un panel de control. Las alertas por fallos individuales entrenan a la gente para ignorar el canal.

Uso de los registros para solucionar problemas en producción

Cuando algo falla, trabaje a partir del ID de entrega hacia fuera:

  1. Encuentre la entrada. Busque por ID de evento. Si no hay entrada, el evento nunca llegó a usted: compruebe la suscripción, la URL y el propio historial de entregas del proveedor.
  2. Compruebe la validación. Una firma fallida apunta a un desacuerdo en el secreto, un cuerpo alterado por un proxy o un paso de análisis que se ejecuta antes de la verificación.
  3. Compruebe la respuesta. ¿Qué estado devolvió y cuánto tardó? Las respuestas lentas y los 5xx conducen directamente a reintentos.
  4. Compruebe el estado. ¿Se puso en cola pero nunca se procesó? ¿Se procesó dos veces? ¿Se marcó como duplicado?
  5. Recupere la carga útil solo si es necesario. Use el ID para obtener la petición cruda del almacén restringido y repítala a través de la ruta de repetición controlada de su manejador, no publicándola a mano en producción.

Pruebe esto antes de un incidente. Envíe eventos de prueba sembrados que contengan secretos falsos y campos con apariencia sensible, y verifique que ninguno de ellos aparece en los registros capturados. Dispare duplicados, firmas incorrectas y cuerpos mal formados y confirme que cada uno produce la entrada de registro y el estado que espera. Una regla de ofuscación que nunca ha probado es una suposición.

Registro de webhooks para eventos de blockchain

Las notificaciones on-chain añaden algunas complicaciones. La misma transacción puede notificarse cuando se ve y de nuevo cuando se confirma, así que registre el hash de la transacción y el estado de confirmación del evento junto con el ID del evento. Mantenga en el registro la cadena, la dirección y los identificadores de la transacción, ya que son públicos y le proporcionan claves de búsqueda precisas, mientras mantiene fuera las credenciales de la API y los secretos de firma. Los depósitos son el caso clásico: si su gestor abona un saldo, la idempotencia y un registro de estado claro son lo que evita un doble abono. Nuestra guía sobre el uso de webhooks para procesar depósitos automáticamente muestra cómo encaja todo esto, y las notas sobre monitorización de direcciones explican cómo se generan los eventos en primer lugar.

Nuestra perspectiva

La mayoría de los incidentes con webhooks que vemos discutidos no son exóticos. Un gestor responde demasiado lento, el proveedor reintenta, se cuela un duplicado y nadie puede decir después qué recibió realmente el sistema. El registro es la diferencia entre una solución de diez minutos y un día de conjeturas.

Por eso construimos Chaingateway en torno a cargas útiles que llegan ya decodificadas, con peticiones firmadas con HMAC, para que su receptor pueda verificar primero y dedicar su esfuerzo a su lógica de negocio en lugar de analizar datos brutos de la cadena. Menos decodificación personalizada significa menos lugares donde una línea de registro pueda filtrar algo que no debería, y una superficie menor para probar.

Nuestro consejo es definir la estructura de su registro de una vez, usar el ID del evento como clave para todo, y tratar los duplicados y reintentos como estados ordinarios en su canalización. Hágalo así, y una fuente unificada de webhooks a través de varias cadenas seguirá siendo tan depurable como una sola.

Bitblade

Obtenga eventos decodificados y firmados sin ejecutar nodos

Si está creando funciones de pago o monedero, puede dedicar su tiempo al receptor y su registro en lugar de a la fontanería específica de cada cadena. Chaingateway Webhooks entrega notificaciones de eventos de blockchain en tiempo real con peticiones firmadas con HMAC a través de redes como Ethereum, Bitcoin, Tron, Solana, Polyggon, BNB Chain y Arbitrum, sin necesidad de ejecutar sus propios nodos.

Chaingateway

Los planes comienzan en 49 € al mes para Plus, con Pro a 99 €, Premium a 249 € y Enterprise a 499 € al mes. La facturación anual es de 490 €, 990 €, 2490 € y 4990 € respectivamente. Primero viene una prueba gratuita. Consulte la página de precios para ver lo que incluye cada plan.

Preguntas frecuentes

¿Debo registrar la carga útil completa del webhook?

No, no en los registros generales de su aplicación. Tanto OWASP como Twilio aconsejan mantener los cuerpos completos de las peticiones fuera de los registros. Registre un hash de la carga útil, el ID del evento y los IDs de recursos relevantes en su lugar. Si necesita el cuerpo crudo para reproducción o auditoría, guárdelo en un sistema restringido y cifrado con un período de retención corto.

¿Cuánto tiempo debo conservar los registros de webhooks?

Establezca la retención por separado para metadatos y cargas útiles. Los metadatos como el ID del evento, el estado y el resultado son pequeños y útiles para la conciliación, por lo que pueden conservarse más tiempo. Las cargas útiles crudas solo deben conservarse el tiempo que las necesite para depuración o reproducción. Sus obligaciones de cumplimiento, como PCI DSS o SOC 2, marcan el mínimo para los registros de auditoría, así que revíselas con su responsable de seguridad o cumplimiento.

¿Cuál es el campo más importante en un registro de webhook?

El ID de entrega o de evento. Le permite encontrar cada intento, detectar duplicados y unir el registro a sus colas y registros de trabajadores. Si el proveedor no lo proporciona, genere el suyo propio en el borde y páselo río abajo.

¿Cómo registro webhooks duplicados?

Registre un estado de procesamiento duplicate contra el mismo ID de evento, omita la lógica de negocio y devuelva un 2xx para que el proveedor deje de reintentar. Si el mismo ID llega con un hash de carga útil diferente, póngalo en cuarentena y alerte a alguien en lugar de procesarlo.

¿Qué alertas debo configurar primero?

Empiece por la tasa de fallos en una ventana corta, cualquier aumento en fallos de firma, profundidad de cola que siga creciendo, acumulación en la cola de mensajes fallidos y silencio inesperado del endpoint. Ajuste los umbrales contra su propio tráfico tras unas semanas de datos.

Fuentes

Recomendado

Cómo escribimos estos artículos

¿Listo para construirlo tú mismo? Obtenga su clave de API — prueba de 7 días, sin tarjeta — o consulte API Blockchain para la referencia completa de los endpoints.

C
Chaingateway Team
Expertos en blockchain

El equipo de Chaingateway se dedica a simplificar la integración blockchain para desarrolladores de todo el mundo.