SMS OTP ile İki Faktörlü Doğrulama: 2026 Güvenlik Rehberi
SMS ile gönderilen tek kullanımlık kodlar (OTP), Türkiye'de en yaygın ikinci faktör doğrulama yöntemi. Bu rehberde OTP'nin nasıl çalıştığını, güvenli tasarımın kurallarını, SIM swap ve OTP bot gibi tehditleri, rate limit stratejisini ve OTP mesajlarının KVKK karşısındaki konumunu kod örnekleriyle ele alıyoruz.
Bir kullanıcı parolasını doğru girdi — ama bu parolayı gerçekten o kullanıcının kendisi mi girdi? Parola çalınmış, sızdırılmış veya tahmin edilmiş olabilir. İşte iki faktörlü doğrulama (2FA) tam bu boşluğu kapatmak için var: kullanıcının bildiği bir şeyin (parola) üstüne, sahip olduğu bir şeyi (telefon) ekliyor.
Türkiye'de bu ikinci faktörün en yaygın biçimi SMS ile gönderilen tek kullanımlık kod — yani OTP (One-Time Password). Bankacılıktan e-ticarete, kargo takibinden devlet uygulamalarına kadar neredeyse her dijital servis, kritik bir işlemden önce telefona altı haneli bir kod gönderiyor. Yaygınlığının nedeni basit: ek bir uygulama indirmeyi gerektirmiyor, her telefonda çalışıyor ve kullanıcı için tanıdık.
Ama "yaygın" ile "doğru kurulmuş" aynı şey değil. Bu rehberde SMS OTP'nin nasıl çalıştığını, güvenli bir OTP akışının tasarım kararlarını, gerçek dünyadaki saldırı vektörlerini ve OTP mesajlarının KVKK karşısındaki konumunu — geliştirici gözüyle, kod örnekleriyle ele alıyoruz.
OTP Nedir ve Nasıl Çalışır?
OTP, yalnızca bir kez ve kısa bir süre için geçerli olan, rastgele üretilmiş bir koddur. SMS OTP akışının tipik adımları şöyle:
- Kullanıcı bir işlem başlatır (giriş, ödeme, telefon numarası doğrulama).
- Sunucu kriptografik olarak güvenli bir rastgele kod üretir — örneğin 6 haneli.
- Kodun hash'i (düz hâli değil), bir son kullanma zamanı ve deneme sayacıyla birlikte sunucu tarafında saklanır.
- Kod, SMS API üzerinden kullanıcının telefonuna gönderilir.
- Kullanıcı kodu girer; sunucu girilen kodun hash'ini saklanan hash ile karşılaştırır.
- Doğruysa işlem onaylanır ve kod derhal geçersiz kılınır.
Kritik nokta 3. ve 6. adımlarda gizli: Kod sunucuda düz metin olarak tutulmaz, doğrulamadan sonra anında silinir. Bu iki kural ihmal edildiğinde, OTP'nin sağladığı güvenlik büyük ölçüde buharlaşır.
HOTP, TOTP ve "Sunucu Tarafı Rastgele Kod" Farkı
OTP üretiminin üç yaygın yaklaşımı var ve SMS bağlamında genellikle üçüncüsü kullanılır:
- HOTP (sayaç tabanlı): RFC 4226. Bir sayaç değerinden kod üretir; donanım token'larında görülür.
- TOTP (zaman tabanlı): RFC 6238. Google Authenticator, Microsoft Authenticator gibi uygulamaların temeli. 30 saniyede bir değişen kod.
- Sunucu tarafı rastgele kod: SMS OTP'de en yaygın yöntem. Sunucu her istekte kriptografik rastgele bir kod üretir, saklar ve SMS ile yollar. Paylaşılan bir gizli anahtar (shared secret) gerektirmez.
SMS OTP'de paylaşılan bir secret yoktur; güvenlik tamamen kodun üretimi, saklanması, teslimi ve geçersiz kılınması üzerine kuruludur.
SMS OTP Ne Kadar Güvenli? Yöntemlerin Karşılaştırması
SMS OTP'yi tartışırken dürüst olmak gerekir: ikinci faktör yöntemleri arasında en güçlüsü değildir. Ama "hiç 2FA yok" durumuyla karşılaştırıldığında devasa bir iyileşme sağlar. Karşılaştırma:
| Yöntem | Güvenlik Seviyesi | Kullanıcı Sürtünmesi | Temel Zayıflık |
|---|---|---|---|
| SMS OTP | Orta | Düşük (ek uygulama yok) | SIM swap, phishing, şebeke gecikmesi |
| Authenticator uygulaması (TOTP) | Yüksek | Orta (uygulama kurulumu gerekir) | Cihaz kaybı, phishing'e karşı hâlâ kırılgan |
| E-posta OTP | Düşük-Orta | Düşük | E-posta hesabı ele geçirilirse çöker |
| Push bildirimi onayı | Yüksek | Çok düşük | "Onay yorgunluğu" (MFA fatigue) saldırıları |
| Donanım anahtarı (FIDO2 / passkey) | Çok yüksek | Orta-yüksek | Maliyet, kurulum, kullanıcı alışkanlığı |
Pratik sonuç: Yüksek riskli işlemler (büyük tutarlı ödemeler, hesap kurtarma) için passkey veya authenticator uygulamasına yönelmek; gündelik giriş ve telefon doğrulama gibi senaryolarda SMS OTP'yi kullanmak dengeli bir yaklaşımdır. SMS OTP'nin en büyük avantajı, kapsama alanı: ek uygulama gerektirmediği için kullanıcıların neredeyse tamamına ulaşır.
NIST, 2017'den bu yana SMS OTP'yi "kullanımdan kaldırılacak" (restricted) kategorisinde değerlendiriyor — ancak yasaklamıyor. Mesaj şu: SMS OTP, hiç 2FA olmamasından kat kat iyidir, fakat tek başına en hassas işlemler için yeterli kabul edilmemelidir.
Güvenli Bir OTP Akışının Tasarım Kararları
OTP'yi "çalışır" hâle getirmek kolay; "güvenli" hâle getirmek tasarım disiplini ister. Dört temel parametre:
| Parametre | Önerilen Değer | Gerekçe |
|---|---|---|
| Kod uzunluğu | 6 hane | 1 milyon olasılık; kullanıcı için akılda tutulabilir. 4 hane brute force'a fazla açık. |
| Geçerlilik süresi | 2–5 dakika | SMS teslim gecikmesine yer bırakacak kadar uzun, saldırı penceresini daraltacak kadar kısa. |
| Deneme limiti | 3–5 yanlış deneme | Limit aşılınca kod tümüyle geçersiz; yeni kod istemek zorunlu. |
| Yeniden gönderim bekleme süresi | 30–60 saniye | "Tekrar gönder" butonunun istismarını ve maliyet patlamasını önler. |
Kodu Doğru Üretmek
Kod üretiminde Math.random() gibi tahmin edilebilir kaynaklar kullanılmamalı. Kriptografik olarak güvenli bir üreteç şart:
// Node.js — kriptografik güvenli 6 haneli OTP
import { randomInt } from 'node:crypto';
function generateOtp() {
// 0–999999 aralığı, baştaki sıfırlar korunur
return randomInt(0, 1_000_000).toString().padStart(6, '0');
}
Kodu Doğru Saklamak
OTP veritabanına ya da önbelleğe asla düz metin yazılmamalı. Kod hash'lenir, son kullanma süresi ve deneme sayacı yanına eklenir:
import { createHash } from 'node:crypto';
const hash = createHash('sha256').update(otp).digest('hex');
// Redis'te 5 dakika TTL ile sakla
await redis.set(
`otp:${userId}`,
JSON.stringify({ hash, attempts: 0 }),
'EX', 300
);
Doğrulama sırasında karşılaştırma sabit zamanlı (constant-time) olmalı; aksi halde zamanlama saldırılarına (timing attack) kapı aralanır. Node.js'te crypto.timingSafeEqual, bu iş için tasarlanmıştır. Doğru kod girildiğinde kayıt anında silinmeli — aksi halde aynı kod ikinci kez kullanılabilir hâle gelir.
SMS OTP'ye Yönelik Gerçek Tehditler
Bir OTP akışını saldırgan gözüyle incelemek, savunmanın en iyi yoludur. Başlıca vektörler:
SIM Swap (SIM Değiştirme) Saldırısı
Saldırgan, sosyal mühendislikle operatörü kandırarak kurbanın numarasını kendi SIM kartına taşıtır. Bu noktadan sonra OTP'ler doğrudan saldırganın telefonuna düşer. SIM swap, SMS OTP'nin en ciddi yapısal zayıflığıdır çünkü saldırı SMS katmanının altında gerçekleşir. Savunma: yüksek riskli işlemlerde yalnızca SMS OTP'ye güvenmemek, son SIM değişim tarihini (operatör API'leri bazı pazarlarda sunar) risk skoruna katmak.
Phishing ve Gerçek Zamanlı Aktarım (Real-Time Relay)
Sahte bir giriş sayfası kullanıcının parolasını ve OTP'sini toplar, saldırgan da bunları saniyeler içinde gerçek siteye aktarır. SMS OTP phishing'e karşı kendiliğinden dayanıklı değildir. Hafifletme: OTP mesajının içine işlem bağlamını yazmak — "ABC Market'e giriş kodunuz" gibi — kullanıcının yanlış siteye kod vermesini zorlaştırır.
OTP Bot'ları ve Sosyal Mühendislik
"OTP bot" denen otomatik sistemler, kurbanı arayıp banka/servis temsilcisi gibi davranarak telefona gelen kodu sözlü olarak ister. Teknik bir açık değil, insan açığıdır. Tek savunma: OTP mesajının içine "Bu kodu kimseyle paylaşmayın" uyarısını koymak ve kullanıcıyı eğitmek.
OTP Pompalama (SMS Pumping / Traffic Pumping Fraud)
Saldırgan, kontrol ettiği premium numaralara binlerce OTP isteği tetikler; her gönderim işletmeye maliyet çıkarır, gelirin bir kısmı sahtekâra döner. Bu, doğrudan finansal bir saldırıdır. Savunma: IP ve numara bazlı rate limit, şüpheli numara aralıklarını filtreleme, anormal coğrafi dağılım tespiti.
Brute Force
Saldırgan, geçerlilik süresi içinde tüm kod kombinasyonlarını dener. 6 haneli kod + 5 deneme limiti + kısa TTL üçlüsü bu saldırıyı pratikte imkânsız hâle getirir. Deneme limiti olmayan bir OTP akışı, kaç hane olursa olsun kırılgandır.
Rate Limit: OTP Güvenliğinin Görünmez Omurgası
Doğru kurulmuş bir rate limit, hem brute force'u hem de SMS pumping'i aynı anda engeller. Çok katmanlı bir yaklaşım önerilir:
- Numara başına gönderim limiti: Aynı telefon numarasına saatte en fazla 5, günde en fazla 10 OTP.
- IP başına limit: Tek bir IP'den dakikada en fazla 3 OTP isteği — bot trafiğini erken keser.
- Doğrulama denemesi limiti: Kod başına en fazla 5 yanlış giriş; aşılınca kod ölür.
- Yeniden gönderim soğuma süresi: "Tekrar gönder" iki istek arasında en az 30–60 saniye beklemeli.
// Redis ile basit numara başına saatlik limit
const key = `otp_rate:${phone}`;
const count = await redis.incr(key);
if (count === 1) await redis.expire(key, 3600);
if (count > 5) {
throw new Error('Çok fazla OTP isteği. Lütfen daha sonra deneyin.');
}
Rate limit aşıldığında kullanıcıya net ama saldırgana bilgi sızdırmayan bir mesaj döndürmek önemli: "Çok fazla deneme yaptınız" yeterli; kalan deneme sayısını veya iç sayaç değerini ifşa etmeyin.
Teslim Hızı ve Maliyet: OTP'de Pazarlama SMS'inden Farklı Öncelikler
Pazarlama SMS'inde birkaç dakikalık gecikme tolere edilebilir. OTP'de edilemez — kullanıcı kodu beklerken ekrana bakıyor. Geç gelen OTP, doğrudan terk edilmiş giriş ve tamamlanmamış ödeme demektir.
Bu yüzden OTP trafiği için birkaç teknik tercih kritik:
- OTP-öncelikli yönlendirme (routing): OTP mesajları, pazarlama trafiğinden ayrı ve yüksek öncelikli kuyruktan gönderilmeli.
- Teslim raporu (DLR) takibi: Webhook ile teslim durumunu izleyip, belirli bir sürede teslim edilmeyen koda alternatif kanal denemek.
- Sesli arama yedeği (voice fallback): SMS belirli saniye içinde teslim olmazsa, kodu sesli aramayla okutmak.
- Operatör çeşitliliği: Tek bir operatör/rotanın sorununda otomatik alternatif rotaya geçiş.
Maliyet tarafında, SMS pumping dışında en büyük gizli gider gereksiz tekrar gönderimlerdir. Net bir geri sayım arayüzü ("Yeni kod 45 sn sonra istenebilir") ve sunucu tarafı soğuma süresi, hem maliyeti hem de kötüye kullanımı aynı anda düşürür.
OTP Mesajları ve KVKK / İYS: Önemli Bir Ayrım
Geliştiricilerin sıkça karıştırdığı bir konu: OTP mesajı ticari elektronik ileti değildir. 6563 sayılı Elektronik Ticaret Kanunu ve İYS (İleti Yönetim Sistemi) çerçevesinde ticari ileti; pazarlama, tanıtım veya promosyon amacı taşıyan mesajları kapsar. Kullanıcının kendi başlattığı bir işlemi doğrulayan OTP ise işlemsel (transactional) bir mesajdır.
Pratik sonuçları:
- İYS izni gerekmez: OTP göndermek için kullanıcının İYS'de "onaylı" olması şartı yoktur — çünkü ticari ileti değildir.
- Reddetme (ret) hakkı uygulanmaz: Kullanıcı pazarlama mesajlarını reddetmiş olsa bile, başlattığı işlemin OTP'sini almaya devam eder.
- Sınırı aşmayın: OTP mesajının içine kampanya, indirim veya tanıtım cümlesi eklediğiniz an, o mesaj melez bir niteliğe bürünür ve ticari ileti kurallarına tabi hâle gelebilir. OTP mesajını yalnızca kod, bağlam ve güvenlik uyarısıyla sınırlı tutun.
KVKK tarafında ise telefon numarası kişisel veridir: OTP akışında numarayı hangi amaçla işlediğinizi aydınlatma metninde belirtmek, OTP kayıtlarını gereğinden uzun saklamamak (kod doğrulandıktan sonra silmek) ve erişim loglarını korumak yükümlülükleriniz arasındadır.
Özet kural: OTP'yi "doğrulama" amacının dışına çıkardığınız an yasal kategorisi değişir. Temiz bir OTP mesajı hem güvenlik hem uyum açısından en doğru tercihtir.
İletiniz ile OTP Gönderimi
İletiniz'in SMS API'si, OTP senaryosu için gereken yapı taşlarını sağlar: işlemsel mesajları ayrı bir öncelikli kuyruktan gönderme, webhook ile HMAC imzalı teslim raporu (DLR) takibi ve numara bazlı gönderim verilerini izleme imkânı. OTP üretimi, hash'leme, rate limit ve kod yaşam döngüsü gibi güvenlik mantığı sizin uygulamanızda kalır — İletiniz teslim katmanını üstlenir.
Tipik bir akış şöyle kurulur: uygulamanız kodu üretip hash'ler ve TTL ile saklar, İletiniz API'si üzerinden OTP mesajını gönderir, teslim durumunu webhook ile alır; geç teslim olan durumlarda alternatif kanal veya sesli arama yedeğini tetikler. Çift gönderim önleme, retry/backoff ve HMAC doğrulama desenleri için SMS API entegrasyon rehberimize göz atabilirsiniz.
İlk 1.000 SMS ücretsiz — kart bilgisi gerekmeden başlayın ve OTP akışınızı gerçek teslim verisiyle test edin.
Sık Sorulan Sorular
SMS OTP güvenli mi?
SMS OTP, hiç iki faktörlü doğrulama olmamasına kıyasla güvenliği ciddi biçimde artırır ve çalınmış parolaların tek başına işe yaramasını engeller. Ancak SIM swap, phishing ve OTP bot saldırılarına karşı yapısal olarak kırılgandır. En hassas işlemler (yüksek tutarlı ödeme, hesap kurtarma) için authenticator uygulaması veya passkey gibi daha güçlü yöntemlerle desteklenmesi önerilir.
OTP kodu kaç haneli ve ne kadar süre geçerli olmalı?
6 hane yaygın ve dengeli bir tercihtir: 1 milyon olasılık sunar ve kullanıcı için akılda tutulabilir. Geçerlilik süresi olarak 2–5 dakika önerilir — SMS teslim gecikmesine yer bırakacak kadar uzun, saldırı penceresini daraltacak kadar kısa. Bu süreyle birlikte kod başına 3–5 yanlış deneme limiti uygulanmalıdır.
SIM swap saldırısı nedir ve OTP'yi nasıl etkiler?
SIM swap, saldırganın sosyal mühendislikle operatörü kandırıp kurbanın telefon numarasını kendi SIM kartına taşıttığı bir saldırıdır. Bu noktadan sonra SMS ile gelen tüm OTP'ler saldırganın telefonuna düşer. Saldırı SMS katmanının altında gerçekleştiği için SMS OTP'nin en ciddi yapısal zayıflığıdır; yüksek riskli işlemlerde ek bir doğrulama katmanı kullanılması gerekir.
SMS pumping (OTP pumping) nedir?
SMS pumping, saldırganın kontrol ettiği premium numaralara binlerce sahte OTP isteği tetikleyerek işletmeye maliyet çıkardığı ve gelirin bir kısmını sahtekâra aktardığı bir dolandırıcılık türüdür. Numara ve IP bazlı rate limit, yeniden gönderim soğuma süresi ve şüpheli numara aralıklarının filtrelenmesi temel savunmalardır.
OTP mesajı göndermek için İYS izni gerekir mi?
Hayır. OTP, kullanıcının kendi başlattığı bir işlemi doğrulayan işlemsel (transactional) bir mesajdır; 6563 sayılı kanun kapsamındaki ticari elektronik ileti tanımına girmez. Bu nedenle İYS onayı gerekmez ve kullanıcı pazarlama mesajlarını reddetmiş olsa bile OTP almaya devam eder. Ancak OTP mesajına kampanya veya tanıtım içeriği eklenirse mesaj ticari ileti kurallarına tabi hâle gelebilir.
OTP kodu sunucuda nasıl saklanmalı?
OTP kodu asla düz metin olarak saklanmamalıdır. Kod SHA-256 gibi bir algoritmayla hash'lenip son kullanma süresi (TTL) ve deneme sayacıyla birlikte tutulmalıdır. Doğrulama sabit zamanlı karşılaştırmayla yapılmalı ve kod doğrulandığı anda kayıt silinmelidir — aksi halde aynı kod ikinci kez kullanılabilir.
OTP doğrulamasında rate limit nasıl kurulmalı?
Çok katmanlı bir yaklaşım önerilir: numara başına saatte 5 / günde 10 gönderim, IP başına dakikada 3 istek, kod başına en fazla 5 yanlış doğrulama denemesi ve yeniden gönderimler arasında 30–60 saniye soğuma süresi. Bu katmanlar brute force ve SMS pumping saldırılarını aynı anda engeller.
OTP SMS'i neden geç geliyor ve nasıl hızlandırılır?
Gecikmenin başlıca nedenleri operatör şebeke yoğunluğu, düşük öncelikli yönlendirme ve rota sorunlarıdır. Hızlandırmak için OTP trafiğini pazarlama mesajlarından ayrı yüksek öncelikli bir kuyruktan göndermek, teslim raporlarını (DLR) webhook ile izlemek, operatör/rota çeşitliliği sağlamak ve belirli bir sürede teslim olmayan kod için sesli arama yedeği kurmak etkili yöntemlerdir.

