Fiecare livrare include un singur antet X-Praxium-Signature: t=<unix_ts>,sha256=<hmac_hex>, unde HMAC-SHA256 este calculat pe partea de server peste ${timestamp}.${rawBody} folosind secretul per-webhook. Secretul partajat nu traversează niciodată firul - doar ieșirea HMAC o face. Semnătura demonstrează două lucruri simultan: corpul nu a fost manipulat în tranzit (integritate), iar apelul a venit cu adevărat de la Praxium și nu de la un atacator care a ghicit punctul tău final URL (autenticitate). Toate livrările sunt expediate prin HTTPS — Praxium refuză să înregistreze URL-uri webhook care nu sunt HTTPS în mediile implementate.
În calitate de destinatar webhook, sunteți responsabil pentru verificarea fiecărei livrări — Praxium semne și expedieri, dar aplicarea are loc în operatorul dvs. Dacă utilizați @praxium/sdk, nu scrieți nimic din acestea manual: processWebhook() (agnostic de cadru) și createRevalidationHandler() (Next.js ISR) coaceți în toți cei patru pași plus protecție la reluare. Implementare manuală într-un alt timp de execuție? Cei patru pași sunt: (1) analizați marcajul de timp și semnătura din antet, (2) respingeți livrările mai vechi decât fereastra de reluare - 5 minute este standardul, (3) recalculați HMAC-ul pe ${timestamp}.${rawBody} cu secretul dvs. partajat, (4) comparați cu compararea în timp constant (de exemplu, crypto.timingSafeEqual).
Aceasta este aceeași schemă pe care o folosește Stripe pentru semnăturile webhook. Secretele per-webhook sunt returnate exact o dată - în răspunsul când creați webhook-ul și în fiecare răspuns de rotație - și nu reapar niciodată după aceea. Acest model cu o singură expunere înseamnă că nu există o suprafață de atac de lungă durată pentru secretul din partea platformei: nici măcar o sesiune de administrare compromisă nu o poate scoate din nou. Ai nevoie de unul proaspăt? Rotiți din portalul de administrare — noul secret sosește în răspunsul de rotație, cel anterior este invalidat imediat și alte abonamente nu sunt atinse.