Webhook secret, bir webhook’un güvenliğini sağlamak için kullanılan gizli bir anahtar veya token’dır. Webhook’lar, bir uygulamanın başka bir uygulamaya gerçek zamanlı veri göndermesini sağlayan bir mekanizmadır. Ancak, bu veri alışverişinin güvenli olması ve yalnızca yetkili kaynaklardan gelen isteklerin kabul edilmesi için webhook secret kullanılır.
Webhook Secret’ın Amacı
- Kimlik Doğrulama: Webhook secret, gönderenin gerçekten beklenen kaynak (örneğin, bir API veya servis) olduğunu doğrulamak için kullanılır. Bu, sahte veya yetkisiz isteklerin engellenmesine yardımcı olur.
- Veri Bütünlüğü: Gönderilen verinin değiştirilmediğini ve güvenilir olduğunu teyit eder.
- Güvenlik: Webhook endpoint’inizin (hedef URL’nizin) kötü niyetli kişiler tarafından spam veya saldırılara maruz kalmasını önler.
Nasıl Çalışır?
- Oluşturma: Webhook’u tanımladığınız platformda (örneğin, GitHub, Stripe, Discord), bir “secret” (gizli anahtar) belirtebilirsiniz. Bu genellikle rastgele bir dizedir (örneğin, mysecret123).
- İstekle Gönderme: Webhook isteği gönderildiğinde, bu secret genellikle bir başlık (header) içinde (örneğin, X-Hub-Signature veya X-Webhook-Secret) eklenir veya isteğin gövdesiyle birlikte şifrelenmiş bir imza (hash) olarak gönderilir.
- Doğrulama: Alıcı taraf (yani sizin uygulamanız), bu secret’ı kullanarak isteğin geçerliliğini kontrol eder. Örneğin, gelen imza ile kendi secret’ınızı kullanarak hesapladığınız imza eşleşirse, istek güvenilir kabul edilir.
Örnek (GitHub Webhook):
GitHub’da bir webhook oluşturduğunuzda:
- Webhook ayarlarında bir “Secret” belirlersiniz (örneğin, abc123xyz).
- GitHub, her webhook isteğinde X-Hub-Signature-256 başlığıyla bir HMAC-SHA256 imzasını gönderir.
- Siz, kendi tarafınızda bu secret’ı kullanarak aynı imzayı hesaplar ve gelen imzayla karşılaştırırsınız.
Python ile Doğrulama Örneği:
python
import hmac
import hashlib
# Gelen istekten imza ve veri
gelen_imza = request.headers.get('X-Hub-Signature-256') # Örneğin: "sha256=abcde12345"
gelen_veri = request.get_data()
# Kendi secret'ınız
webhook_secret = "abc123xyz"
# İmzayı hesapla
hesaplanan_imza = "sha256=" + hmac.new(
webhook_secret.encode(),
gelen_veri,
hashlib.sha256
).hexdigest()
# Doğrula
if hmac.compare_digest(gelen_imza, hesaplanan_imza):
print("İstek güvenilir!")
else:
print("İstek geçersiz!")
Neden Önemli?
- Eğer webhook secret kullanmazsanız, herkes sizin webhook URL’nize rastgele istek gönderebilir ve uygulamanız bu sahte verileri işleyebilir.
- Özellikle ödeme sistemleri (Stripe gibi) veya hassas veri taşıyan webhook’larda güvenlik kritik öneme sahiptir.
Webhook Secret Nerede Kullanılır?
- GitHub: Repository olaylarını izlemek için.
- Stripe: Ödeme işlemlerini bildirmek için.
- Discord: Bot entegrasyonları için.
- Slack: Uygulama entegrasyonları için.