Idempotency Token: Tekrarlayan İstekleri Engelleme

Bir ödeme işlemi yolladınız. Ağ hızlı değilse, müşteri butona iki kez basıyor. Sunucu iki kez ödeme işlemi yapıyor. Hesaptan iki kez para çıkıyor. bu sorunu çözmek için idempotency token kullanılır.

Her istek için benzersiz bir kimlik (token) oluşturursunuz. Sunucu bu tokeni kaydeder. Aynı token gelirse, işlemi tekrar yapmaz, önceki sonucu döner.

Adım 1: Token Oluştur

İstek göndermeden önce müşteri tarafında benzersiz bir token üretin:

1const idempotencyToken = crypto.randomUUID();
2console.log(idempotencyToken);
3// Çıktı: 550e8400-e29b-41d4-a716-446655440000

Adım 2: Token ile İstek Gönder

Bu tokeni istek başlığında gönderin:

1fetch('/api/payment', {
2method: 'POST',
3headers: {
4'Content-Type': 'application/json',
5'Idempotency-Key': idempotencyToken
6},
7body: JSON.stringify({ amount: 100 })
8});

Adım 3: Sunucuda Token Kontrol Et

Reklam · TEST
AdSense Test ReklamıYazı arası (gönderi içi) · Yazı arası

Sunucu tarafında Node.js/Express örneği:

1const processedTokens = {}; // Gerçekte veritabanında tutulur
2
3app.post('/api/payment', (req, res) => {
4const token = req.headers['idempotency-key'];
5
6if (processedTokens[token]) {
7// Token daha önce işlendi, aynı sonucu döner
8return res.json(processedTokens[token]);
9}
10
11// İşlemi yap
12const result = { success: true, transactionId: 12345 };
13
14// Tokeni ve sonucu kaydet
15processedTokens[token] = result;
16
17res.json(result);
18});

Çıktı:

Birinci istek: { success: true, transactionId: 12345 }

İkinci istek (aynı token): { success: true, transactionId: 12345 } (işlem tekrar yapılmadı)

Bankaların, ödeme sistemlerinin, e-ticaret sitelerinin hepsi bunu kullanır. Stripe, PayPal gibi servisler de idempotency key istiyor.

  • Token benzersiz ve rasgele olmalı.
  • Sunucuda en az 24 saat saklanmalı.
  • Veritabanında tutmak daha güvenlidir.
  • Zaman aşımı sonrası tokeni silebilirsiniz.

bu şekilde aynı işlem hiçbir zaman iki kez yapılmaz.

Reklam · TEST
AdSense Test ReklamıGönderi altı · Görüntülü
konu hakkında tepkinizi verebilirsiniz