Ana içeriğe atla

Güvenli API İstek İmzalama ve Idempotency Mekanizması

Genel Bakış

Genel Bakış Bu API, HMAC tabanlı istek imzalama, zaman damgası, benzersiz istek tanımlama (nonce) ve idempotency anahtarları içeren sağlam bir güvenlik mekanizmasından yararlanır. Bu mekanizmalar toplu olarak, istemci isteklerinin bütünlüğünü, gerçekliğini ve tekrarlanamazlığını ve ayrıca yinelenen gönderimlerin güvenli bir şekilde ele alınmasını sağlar. Bu belgede her bir mekanizma, amaçları ve gerekli istemci mantığının nasıl uygulanacağı (örneğin Postman veya özel API istemcilerinde) açıklanmaktadır.

1. HMAC İmzası (X-Signature Başlığı)

Nedir?

Bir HMAC (Karma Tabanlı Mesaj Kimlik Doğrulama Kodu), paylaşılan bir sır ve istek verileri kullanılarak oluşturulan bir kriptografik imzadır. Talebin değiştirilememesini ve gönderenin kimliğinin doğrulanabilmesini sağlar.

Amacı

  • Bütünlük: İsteğin herhangi bir kısmının (yöntem, URI, gövde, zaman damgası) değiştirilip değiştirilmediğini tespit eder.
  • Kimlik Doğrulama: İsteğin gizli anahtarı bilen güvenilir bir istemciden geldiğini doğrular.
  • Yeniden Oynatma Önleme: Bir zaman damgasına ve benzersiz değerlere bağlı olarak yeniden oynatma saldırılarını tespit edilebilir hale getirir.

Nasıl Kullanılır?

  • İstemci imzalamak için HTTP yöntemini, tam istek yolunu (sorgu dahil), milisaniye cinsinden geçerli zaman damgasını ve çözümlenmiş istek gövdesini birleştiren bir dize oluşturur:
dataToSign = HTTP_METHOD + "|" + PATH_WITH_QUERY + "|" + TIMESTAMP + "|" + BODY
  • İstemci, paylaşılan anahtarı (güvenli bir kasada tutulur, asla ifşa edilmez) kullanarak HMAC SHA256 imzasını oluşturur:
X-Signature = HMAC_SHA256(secret, dataToSign)
  • Bu imza X-Signature istek başlığında gönderilir.
İlk API çağrınızı yapmadan önce lütfen bizden HMAC Anahtarını isteyin

Kullanılmazsa ne olur?

  • İstemci http durumu 400 - Hatalı İstek ile bir hata mesajı alacaktır
{
  "timestamp": "2025-04-14T16:58:10.414972912",
  "status": 400,
  "error": "Hatalı İstek",
  "message": "Eksik imza, zaman damgası veya nonce başlıkları",
  "path": "/auth/login"
}

İmza geçerli değilse ne olur?

  • İstemci, http durumu 401 - Yetkisiz olan bir hata mesajı alacaktır.
{
  "timestamp": "2025-04-14T16:57:50.083970026",
  "status": 401,
  "error": "Yetkisiz",
  "message": "Geçersiz istek imzası",
  "path": "/auth/login"
}

2. Zaman Damgası (X-Timestamp Başlığı)

Nedir?

İsteğin oluşturulduğu andaki Unix zaman damgası (milisaniye cinsinden).

Amaç

  • Tekrar Oynatma Önleme: Sunucu geçerli istekler için katı zaman pencereleri uygulayabildiğinden, bir saldırganın daha önce geçerli olan bir isteği tekrar kullanmasını önler.

Nasıl Kullanılır?

  • İstemci, isteği göndermeden hemen önce zaman damgasını oluşturur ve bunu X-Timestamp başlığı olarak ekler.

Kullanılmazsa ne olur?

  • İstemci, http durumu 400 - Hatalı İstek olan bir hata mesajı alacaktır
{
  "timestamp": "2025-04-14T16:58:10.414972912",
  "status": 400,
  "error": "Hatalı İstek",
  "message": "Eksik imza, zaman damgası veya nonce başlıkları",
  "path": "/auth/login"
}

3. Nonce - Tek Seferlik (X-Nonce Başlığı)

Nedir?

Bir nonce, her istekte bulunan rastgele oluşturulmuş benzersiz bir tanımlayıcıdır (UUID v4).

Amaç

  • Yeniden Oynatma Önleme: Her isteği benzersiz bir şekilde tanımlayarak isteğin yeniden oynatılmasını daha da önler. Yöntem, URI ve gövde aynı olsa bile, nonce farklı olacaktır.

Nasıl Kullanılır?

  • İstemci her istek için yeni bir UUID v4 oluşturur ve bunu X-Nonce başlığı olarak ekler.

Kullanılmazsa ne olur?

  • İstemci, http durumu 400 - Hatalı İstek olan bir hata mesajı alacaktır
{
  "timestamp": "2025-04-14T16:58:10.414972912",
  "status": 400,
  "error": "Hatalı İstek",
  "message": "Eksik imza, zaman damgası veya nonce başlıkları",
  "path": "/auth/login"
}

Yeniden kullanılırsa ne olur?

  • İstemci http durumu 409 - Çakışma ile bir hata mesajı alacaktır
{
  "timestamp": "2025-04-14T16:57:21.168927321",
  "status": 409,
  "error": "Çakışma",
  "message": "Yeniden oynatma saldırısı tespit edildi (nonce yeniden kullanıldı)",
  "path": "/endpoint/uri/here"
}

4. Idempotency Anahtarı (X-Idempotency-Key Başlığı)

Nedir?

Her istek için bir tekil tanımlayıcı (UUID v4), sunucunun yinelenen gönderimleri tanımasını ve güvenli bir şekilde göz ardı etmesini sağlar (örneğin, bir POST isteğinin yeniden denenmesi).

Amaç

  • Idempotency: Ağ hataları nedeniyle bir isteğin yeniden denenmesinin yinelenen kaynak oluşturma veya yan etkilere neden olmayacağını garanti eder.

Nasıl Kullanılır?

  • İstemci her işlem için yeni bir UUID v4 oluşturur ve bunu X-Idempotency-Key başlığı olarak gönderir.

What if not used?

  • İstemci, http durumu 400 - Hatalı İstek olan bir hata mesajı alacaktır
{
  "timestamp": "2025-04-14T16:26:54.203118461",
  "status": 400,
  "error": "Hatalı İstek",
  "message": "Eksik X-Idempotency-Key başlığı",
  "path": "/endpoint/uri/here"
}

Yeniden kullanılırsa ne olur?

  • İstemci http durumu 409 - Çakışma ile bir hata mesajı alacaktır
{
  "timestamp": "2025-04-14T16:56:28.671809875",
  "status": 409,
  "error": "Çakışma",
  "message": "Yinelenen istek algılandı (X-Idempotency-Key)",
  "path": "/endpoint/uri/here"
}

Güvenlikle İlgili Hususlar

  • HMAC için kullanılan anahtar istemci kodunda veya belgelerinde asla paylaşılmamalı veya ifşa edilmemelidir.
  • Ortadaki adam saldırılarını önlemek için her zaman HTTPS kullanın.
  • Sunucular, X-Timestamp için izin verilen maksimum bir zaman eğriliği uygular ve belirli bir pencere içinde kullanılmış/tekrarlanmış X-Nonce veya X-Idempotency-Key değerlerini reddeder.

Örnek Başlıklar

X-Signature: 75c759570bbb5dfd40136cffd3dbaa51b28d4620e51359161686790adcc53bea
X-Timestamp: 1752751106704
X-Nonce: 684a0dca-bd6a-4056-a449-2567f9847f9c
X-Idempotency-Key: 777edc03-ad49-4c17-be6b-9baf05a1b9e0

Özet Tablo

BaşlıkDeğer/FormatAmaç
X-SignatureHexadecimal stringOrijinallik/bütünlük talebi
X-TimestampMilliseconds since epochYeniden oynatmayı önler
X-NonceUUID v4Teklik/tekrarı önleme
X-Idempotency-KeyUUID v4Yeniden denemeler için Idempotency