Webhooks erklärt: Signierte Payloads und Retry-Strategien

Backend2026-11-07TryQuickToolBox

Sie haben gerade einen Webhook-Endpunkt erstellt, um Ereignisse von einem Drittanbieterdienst zu empfangen. In Tests funktioniert alles, aber in der Produktion stellen Sie fest, dass einige Ereignisse nie ankommen oder, schlimmer noch, Sie doppelte Ereignisse erhalten, die zu Dateninkonsistenzen führen. Dies sind klassische Webhook-Fallstricke, die auf zwei kritische Aspekte zurückzuführen sind: die Authentizität der Payload und die Zuverlässigkeit der Zustellung.

Webhooks sind HTTP-Callbacks, die durch Ereignisse ausgelöst werden und Daten in Echtzeit an Ihre Anwendung pushen. Im Gegensatz zum Polling sind sie effizient und nahezu sofort. Sie bringen jedoch Herausforderungen mit sich: Woher wissen Sie, dass die Anfrage wirklich vom erwarteten Absender stammt, und wie gehen Sie mit Fehlern um, wenn der Empfänger vorübergehend nicht erreichbar ist? Dieser Artikel befasst sich mit signierten Payloads und Retry-Mechanismen und gibt Ihnen praktische Muster an die Hand, um widerstandsfähige Webhook-Integrationen aufzubauen.

Warum Webhooks Signaturen benötigen

Webhook-Endpunkte sind öffentlich zugängliche URLs. Ohne Verifizierung kann jeder gefälschte Anfragen an Ihren Endpunkt senden und möglicherweise unbefugte Aktionen auslösen oder Daten beschädigen. Signierte Payloads lösen dieses Problem, indem sie jeder Anfrage eine kryptografische Signatur hinzufügen, mit der Sie die Identität des Absenders überprüfen und sicherstellen können, dass die Payload nicht manipuliert wurde.

Die meisten Anbieter verwenden HMAC (Hash-based Message Authentication Code) mit einem gemeinsamen Geheimnis. Der Absender berechnet einen Hash der Payload mit dem Geheimnis und fügt ihn in einen Header ein. Sie berechnen den Hash auf Ihrer Seite neu und vergleichen ihn. Wenn sie übereinstimmen, ist die Anfrage legitim.

Implementierung der HMAC-Verifizierung

Gehen wir eine typische Implementierung in Node.js durch. Angenommen, der Anbieter sendet eine Signatur im Header X-Signature, die als HMAC-SHA256 des rohen Request-Bodys mit Ihrem Geheimnis berechnet wird.

const crypto = require('crypto');
const express = require('express');
const app = express();

// Verwenden Sie einen Raw-Body-Parser, um die exakte Payload zu erhalten
app.use(express.raw({ type: 'application/json' }));

app.post('/webhook', (req, res) => {
  const signature = req.headers['x-signature'];
  const secret = process.env.WEBHOOK_SECRET;
  
  const expected = crypto
    .createHmac('sha256', secret)
    .update(req.body)
    .digest('hex');
  
  if (!crypto.timingSafeEqual(Buffer.from(signature), Buffer.from(expected))) {
    return res.status(401).send('Invalid signature');
  }
  
  // Ereignis verarbeiten
  const event = JSON.parse(req.body);
  // ... Ereignis behandeln
  
  res.status(200).send('OK');
});

Wichtige Punkte:

Entwurf einer Retry-Strategie

Auch mit Signaturen können Zustellungen aufgrund von Netzwerkproblemen, Serverausfällen oder Timeouts fehlschlagen. Eine robuste Retry-Strategie stellt die eventuelle Zustellung sicher, ohne Ihr System oder den Absender zu überlasten.

1. Schnell bestätigen, asynchron verarbeiten

Ihr Webhook-Endpunkt sollte so schnell wie möglich mit einem 2xx-Status antworten, idealerweise innerhalb weniger Sekunden. Wenn die Verarbeitung länger dauert, stellen Sie das Ereignis in eine Warteschlange für die Hintergrundverarbeitung. Dies verhindert Timeouts und ermöglicht es dem Absender, die Zustellung als erfolgreich zu betrachten.

2. Exponentielles Backoff mit Jitter implementieren

Wenn eine Zustellung fehlschlägt (Nicht-2xx-Antwort oder Timeout), sollte der Absender mit zunehmenden Verzögerungen erneut versuchen. Exponentielles Backoff (z. B. 1s, 2s, 4s, 8s...) verhindert, dass Ihr Endpunkt überlastet wird. Das Hinzufügen von zufälligem Jitter vermeidet Thundering-Herd-Probleme, wenn viele Webhooks gleichzeitig fehlschlagen.

Beispiel für einen Retry-Zeitplan:

Nach einer maximalen Anzahl von Wiederholungen (z. B. 5) sollte der Absender aufhören und Sie benachrichtigen (z. B. per E-Mail oder Dashboard).

3. Duplikate mit Idempotenz behandeln

Wiederholungen können zu doppelten Zustellungen führen. Ihr Endpunkt muss idempotent sein: Die mehrfache Verarbeitung desselben Ereignisses sollte dieselbe Wirkung haben wie die einmalige Verarbeitung. Verwenden Sie eine eindeutige Ereignis-ID aus der Payload und speichern Sie diese. Überprüfen Sie vor der Verarbeitung, ob die ID bereits gesehen wurde; wenn ja, geben Sie 200 zurück, ohne erneut zu verarbeiten.

Gängige Ansätze:

Vergleich: Signierte Payloads vs. andere Sicherheitsmaßnahmen

Methode Vorteile Nachteile
HMAC-Signatur Verifiziert Authentizität und Integrität; zustandslos Erfordert Verwaltung gemeinsamer Geheimnisse
IP-Allowlisting Einfach zu implementieren IPs können sich ändern; nicht für dynamische Umgebungen geeignet
Basic Auth Einfach hinzuzufügen Anmeldeinformationen werden bei jeder Anfrage gesendet; weniger sicher
JWT im Header Kann Ansprüche und Ablaufdatum enthalten Overhead durch Token-Ausstellung/-Validierung

HMAC-Signaturen sind der De-facto-Standard, da sie zustandslos, effizient und bei korrekter Implementierung sehr sicher sind.

Best Practices für Webhook-Konsumenten

Best Practices für Webhook-Produzenten

Testen Ihrer Webhook-Implementierung

Verwenden Sie Tools wie ngrok, um Ihren lokalen Server verfügbar zu machen und Webhook-Zustellungen zu simulieren. Schreiben Sie Unit-Tests für die Signaturverifizierung und die Idempotenzlogik. Für Lasttests ziehen Sie Tools in Betracht, die signierte Anfragen in großem Umfang senden können.

Beim Debuggen inspizieren Sie die rohe Payload und die Header. Ein JSON-Formatierer kann helfen, die Struktur der Payload zu visualisieren. Probieren Sie unseren JSON Formatter, um Webhook-Payloads schnell hübsch zu formatieren und zu validieren.

FAQ

Was ist eine signierte Webhook-Payload?

Eine signierte Payload enthält eine kryptografische Signatur (normalerweise HMAC), die es dem Empfänger ermöglicht, die Identität des Absenders zu überprüfen und sicherzustellen, dass die Payload nicht verändert wurde. Sie wird mit einem gemeinsamen Geheimnis und dem Request-Body berechnet.

Wie oft sollte ein Webhook wiederholt werden?

Es gibt keine universelle Zahl, aber üblich sind 3–5 Wiederholungen mit exponentiellem Backoff. Danach gilt das Ereignis als fehlgeschlagen und der Konsument sollte benachrichtigt werden, um zu untersuchen oder manuell erneut abzuspielen.

Kann ich JWT anstelle von HMAC für Webhook-Signaturen verwenden?

Ja, JWT kann funktionieren, fügt aber Komplexität hinzu (Token-Ausstellung, Ablauf). HMAC ist einfacher und für die meisten Anwendungsfälle ausreichend. Wählen Sie basierend auf Ihrer vorhandenen Infrastruktur und Ihren Anforderungen.

Bereit, Webhook-Payloads zu inspizieren und zu debuggen? Verwenden Sie unseren kostenlosen JSON Formatter, um JSON sofort zu formatieren und zu validieren.