Ir al contenido

Glosario Webhook

¿Qué es un webhook?

Definición

Un webhook es una petición HTTP que un servicio envía de forma automática a una URL registrada previamente en cuanto ocurre un evento concreto, como un pedido nuevo o un alta en el boletín. El receptor no tiene que preguntar: recibe el aviso.

En esta página 5
  1. Qué significa un webhook
  2. Cómo funciona
  3. Por qué importa
  4. Buenas prácticas
  5. Errores frecuentes
En breve

Un webhook avisa de un evento con una petición HTTP a una URL registrada, push en vez de consulta: cómo funciona, cómo se protege y para qué sirve.

Qué significa un webhook

Jeff Lindsay describió los webhooks en mayo de 2007 como llamadas de retorno definidas por el usuario y hechas con HTTP POST. El usuario indica una URL y la aplicación envía allí un mensaje cuando pasa algo. La especificación Standard Webhooks los llama hoy el nombre habitual de las llamadas de retorno HTTP con las que los servicios se avisan unos a otros de sus eventos.

La diferencia con una API corriente está en la dirección. Con una API, el programa propio pregunta si hay algo nuevo: eso es pull. Con un webhook, el otro servicio avisa por su cuenta en cuanto hay algo nuevo: eso es push. Quien pregunta cada cinco minutos envía muchas peticiones sin resultado y, en el peor caso, se entera de un evento cinco minutos tarde.

Los webhooks complementan las API, no las sustituyen. A menudo el webhook solo trae el aviso de que algo ha cambiado, y el receptor consulta los detalles después por la API.

Cómo funciona

El proceso tiene tres pasos. Primero, el receptor prepara una dirección capaz de recibir peticiones, el endpoint, y la registra en el servicio emisor junto con los eventos que le interesan. Cuando ocurre uno de ellos, el servicio envía una petición HTTP POST a esa dirección, casi siempre con los datos en formato JSON. El receptor confirma la llegada con un código de estado de la serie 2xx.

Un ejemplo del email marketing: Mailchimp puede avisar por webhook cuando alguien se da de alta o de baja, cambia su dirección de correo o cuando se ha enviado una campaña. Así un CRM puede actualizar el estado de un contacto al momento, sin cotejar la lista cada cierto tiempo.

Cada proveedor decide dos cosas. La primera es el tiempo de espera. GitHub espera una respuesta 2xx en diez segundos; si no llega, corta la conexión y da la entrega por fallida. La segunda son los reintentos. GitHub no vuelve a entregar de forma automática los envíos fallidos. Stripe, en cambio, lo reintenta en modo real durante un máximo de tres días, con intervalos que crecen de forma exponencial. Por eso el receptor tiene que leer en la documentación de cada servicio qué se pierde si su servidor no responde.

El recorrido es igual en todas partes; las reglas ante un fallo, no.

Por qué importa

Los webhooks conectan herramientas sin que nadie pase datos a mano. Un pedido nuevo en la tienda puede generar una factura, un registro en el CRM y un correo de seguimiento. Muchos flujos de marketing automation se basan en eventos así.

Como el endpoint es accesible desde internet, cualquiera puede llamarlo. Por eso muchos proveedores firman sus webhooks. GitHub envía en la cabecera X-Hub-Signature-256 un hash HMAC calculado con la clave secreta del webhook y el contenido del mensaje. HMAC es un mecanismo de autenticación de mensajes con funciones hash criptográficas, descrito en el RFC 2104 de febrero de 1997. El receptor calcula el mismo hash y compara los dos. GitHub y Stripe recomiendan hacerlo con una comparación de tiempo constante y no con un operador de igualdad simple.

El receptor debe conocer otras dos propiedades. Stripe advierte que un endpoint puede recibir de vez en cuando el mismo evento más de una vez, y que Stripe no garantiza el orden de los eventos. Stripe incluye además una marca de tiempo en la firma; sus bibliotecas rechazan por defecto los mensajes con más de cinco minutos de antigüedad, para frenar los mensajes reenviados.

Buenas prácticas

  • Comprobar la firma de cada mensaje entrante y descartar los que no tengan una firma válida.
  • Comparar el hash en tiempo constante, no con un operador de igualdad simple.
  • Responder 2xx enseguida y hacer el procesamiento real después, en una cola.
  • Guardar el ID de cada evento y procesar solo una vez los que lleguen repetidos.
  • En los eventos cuyo orden importa, consultar el estado actual por la API.
  • Comprobar si el servicio reintenta las entregas fallidas y, si no lo hace, recuperar uno mismo los eventos perdidos.

Errores frecuentes

  • Mantener el endpoint sin comprobar la firma, de modo que cualquiera puede colar eventos falsos.
  • Hacer un procesamiento largo antes de responder y superar así el tiempo límite del servicio.
  • Tratar cada evento como único y crear, por ejemplo, un pedido dos veces.
  • Dar por hecho que todos los servicios reintentan las entregas fallidas.
  • Guardar la clave secreta en el código fuente o en un repositorio público.
Manuel Riveiro Rodriguez CEO & Digital Strategist

Una auditoría técnica revisa esto y el resto en un solo paso.

Solicitar auditoría

Preguntas frecuentes

¿Qué es un webhook?

Un webhook es una petición HTTP que un servicio envía automáticamente a una URL registrada en cuanto ocurre un evento concreto. Así, por ejemplo, un CRM se entera al momento de un pedido o de un alta nueva, sin tener que preguntar cada cierto tiempo. Los datos llegan casi siempre en formato JSON y por HTTP POST.

¿Qué diferencia hay entre un webhook y una API?

Con una API, el programa propio pregunta activamente si hay datos nuevos; eso se llama pull. Con un webhook, el otro servicio avisa por su cuenta en cuanto pasa algo; eso se llama push. A menudo se combinan: el webhook avisa del cambio y los detalles se consultan después por la API.

¿Cómo se protege un webhook?

Sobre todo con una firma. El emisor calcula un hash HMAC a partir de una clave secreta y del contenido del mensaje y lo envía en una cabecera. El receptor calcula el mismo hash, compara los dos en tiempo constante y descarta los mensajes sin firma válida. Una marca de tiempo protege además contra los mensajes reenviados.

¿Qué pasa si el receptor no está disponible?

Depende del servicio. Stripe reintenta la entrega en modo real durante un máximo de tres días, con intervalos crecientes. GitHub, en cambio, no vuelve a entregar de forma automática los envíos fallidos; se pueden recuperar a mano o con código. Por eso cada webhook exige leer la documentación del proveedor correspondiente.

¿Puede un webhook enviar el mismo evento dos veces?

Sí. Stripe advierte expresamente que un endpoint puede recibir el mismo evento más de una vez, y que el orden de los eventos no está garantizado. Por eso el receptor guarda el ID de cada evento procesado y se salta las repeticiones, para que, por ejemplo, un pedido no se cree dos veces.

Fuentes

  1. Jeff Lindsay, «Web hooks to revolutionize the web», 3 de mayo de 2007, copia archivada el 28 de septiembre de 2018; la dirección original da hoy 404 (en inglés). Fuente de la descripción como llamadas de retorno definidas por el usuario con HTTP POST.
  2. Standard Webhooks, especificación versión 1.0.0 (en inglés). Fuente de los webhooks como nombre habitual de las llamadas de retorno HTTP entre servicios.
  3. Mailchimp Developer, «Webhooks», sin fecha de actualización (en inglés). Fuente de los webhooks por altas, bajas, cambios de dirección y envío de campañas.
  4. GitHub Docs, «Best practices for using webhooks», sin fecha de actualización (en inglés). Fuente del plazo de respuesta de diez segundos.
  5. GitHub Docs, «Handling failed webhook deliveries», sin fecha de actualización (en inglés). Fuente de que GitHub no reintenta automáticamente las entregas fallidas.
  6. GitHub Docs, «Validating webhook deliveries», sin fecha de actualización (en inglés). Fuente de la cabecera X-Hub-Signature-256, del hash HMAC y de la comparación en tiempo constante.
  7. Stripe Docs, «Receive Stripe events in your webhook endpoint», sin fecha de actualización (en inglés). Fuente de los reintentos durante un máximo de tres días, los eventos duplicados, el orden no garantizado, la marca de tiempo con cinco minutos de tolerancia y la comparación en tiempo constante.
  8. H. Krawczyk, M. Bellare y R. Canetti, RFC 2104, «HMAC: Keyed-Hashing for Message Authentication», febrero de 1997 (en inglés). Fuente de HMAC como mecanismo de autenticación de mensajes con funciones hash.