Guide 08 / Webhook Signature

Webhook imza uyumsuzlugunu raw body, secret ve HMAC katmanlarina ayir.

Webhook signature mismatch hatasi genelde tek bir sebepten cikmaz. Ham body'nin degismesi, secret'in yanlis encoding ile okunmasi, header prefix'i veya signed timestamp toleransi ayni hata mesajina donusebilir. Bu guide, Hash / HMAC araci etrafinda en kisa debug akisina odaklanir.

Body
Raw
parse edilmis JSON degil, gelen ham byte dizisi
Secret
Encoding
utf8, hex veya base64 secimi imzayi dogrudan etkiler
Header
Prefix
sha256= benzeri formatlar sadece digest degildir
Workflow

4 adimli webhook verify triage

  1. 1. Ham body'yi oldugu gibi ayir

    Webhook saglayicilari cogu zaman imzayi parse edilmis obje uzerinden degil, gelen raw request body uzerinden hesaplar. Pretty print, bosluk temizligi veya key sirasi degisimi ayni event icin farkli HMAC uretir.

  2. 2. Signature header formatini parcala

    Bazi sistemler `sha256=...`, bazilari `t=...,v1=...` veya birden fazla versiyon gonderir. Header icindeki prefix, timestamp ve digest parcasi ayrilmadan yalnizca tek bir hex degerle karsilastirma yapmak yanlis negatif verir.

  3. 3. Secret ve message encoding secimini eslestir

    Hash / HMAC aracinda key icin utf8, hex veya base64; message icin utf8, hex veya base64 secimi ayri ayarlanir. Uretici taraf hangi encoding ile calisiyorsa ayni kombinasyon debug tarafinda da korunmalidir.

  4. 4. Timestamp toleransi varsa ayri test et

    Stripe benzeri saglayicilarda replay korumasi icin timestamp da signed string'e dahil olabilir. Bu durumda dogru HMAC uretilse bile eski timestamp veya clock drift sebebiyle verify yine reddedilebilir.

Common Checks

En sik 3 mismatch sebebi

1. JSON'u yeniden serialize etmek

Framework body parser'i veya debug icin yapilan pretty print, gelen byte siralamasini degistirebilir. Sign edilecek veri her zaman ham request body olmalidir.

2. Secret'i yanlis formatta okumak

Environment degiskeni base64 saklaniyorsa ama debug tarafinda utf8 gibi kullaniliyorsa ayni body icin bambaska digest uretilir.

3. Header prefix veya zaman toleransini atlamak

`sha256=` prefix'ini, `v1` alanini veya timestamp tolerance kontrolunu yok saymak verify sonucunu eksik yorumlatir.

Example

Webhook signature okurken mini checklist

Elinizdeki veri
X-Signature: sha256=9c4a...
X-Timestamp: 1716207000

{"event":"invoice.paid","id":"evt_42"}
Sorulacak 4 soru
  • Body tam olarak gelen raw byte dizisi mi?
  • Header icinde prefix veya version parcasi var mi?
  • Secret utf8 mi, hex mi, base64 mu saklaniyor?
  • Timestamp toleransi veya clock drift var mi?
Tool Stack

Bu use-case'te hangi araci ne zaman acarsin?

FAQ

Sik sorulanlar

JSON Formatter ile duzelttigim body'yi imza icin kullanabilir miyim?

Genelde hayir. Debug icin okunur hale getirebilirsiniz ama verify icin imzalanan tam ham body'yi korumaniz gerekir.

HMAC sonucu neden provider ile farkli gorunuyor?

Algoritma, secret encoding, message encoding veya cikis formati farkli olabilir. Ayrica provider header icinde prefix ya da version etiketi kullaniyor olabilir.

Timestamp kontrolu neden signature guide icinde?

Cunku bazi verify akislari HMAC esit olsa bile eski timestamp sebebiyle request'i reddeder. Replay korumasi imza sonucundan ayri bir katmandir.

CTA

Webhook verify akisini simdi dene

Rehberdeki kontrol noktalarini ayni request uzerinde denemek, webhook mismatch'ini satir satir log okumaktan daha hizli cozer. Once raw body'yi ayir, sonra header ve secret encoding'i Hash / HMAC ile dogrula.