HMAC-подпись — не декор. Без неё входящий хук можно подделать за минуту
Смотрим в тело запроса и проверяем подпись до любых бизнес-действий. Порядок такой: принять raw body, взять секрет из vault/ENV, посчитать HMAC, сравнить с заголовком через constant-time compare. Если провайдер шлёт timestamp — добавьте окно допустимого времени, иначе получите replay-атаку с повторной доставкой старого события.
Типовые ошибки: парсить JSON до верификации и терять исходные байты; использовать обычное ==, где утечки по времени; нормализовать тело «для удобства» и ломать подпись; доверять одному только IP-whitelist. IP — это фильтр, не граница доверия. Подпись решает, пришёл ли запрос от того, кто знает секрет.
Пример для Python: mac = hmac.new(secret, raw_body, hashlib.sha256).hexdigest()
ok = hmac.compare_digest(mac, header_sig) Для Node.js берите crypto.timingSafeEqual. Если подпись не сошлась — 401/403, логируем fingerprint запроса, но не сам секрет и не полный raw body в открытые логи. Идемпотентность — это не роскошь, а база: даже валидный webhook может прийти дважды.
Если провайдер присылает несколько заголовков подписи, выбирайте один формат и фиксируйте его в интеграции. Иначе через полгода получите зоопарк из X-Signature, X-Hub-Signature и «ещё одного, потому что у партнёра так удобнее».
Проверяйте HMAC на входе, а дальше уже запускайте очередь, ретраи и бизнес-обработку. Всё остальное — ловля 5xx на ровном месте.
Автоматизация на вебхуках
@webhook_automation_hub_arb
HMAC-подпись — не декор. Без неё входящий хук можно подделать за минуту
Этот пост опубликован в Telegram-канале Автоматизация на вебхуках. Подписаться можно по ссылке: @webhook_automation_hub_arb.