Bloga Dön
Özel Yazılım

SMS OTP Doğrulama Entegrasyonu Nasıl Yapılır?

SMS OTP doğrulama entegrasyonu nasıl yapılır? Kodun sunucuda üretilmesi, hash'lenerek saklanması, ömür-deneme-gönderim sayaçları, teslimat, maliyet ve yedek kanal.

EntegrasyonGüvenlikÖzel YazılımMobil Uygulama

Kısa cevap: SMS OTP doğrulama entegrasyonu "SMS gönderen bir servis bağlamak" değildir. İşin SMS kısmı en kolay ve en son kısmıdır; asıl iş sunucu tarafındaki üç kuraldır: kodu sunucu üretir ve istemciye asla dönmez, kodun kısa bir ömrü vardır, hem deneme hem gönderim sayısı sınırlanır. Bu üçü yoksa entegrasyon çalışıyor görünür ama güvenlik sağlamaz.

SMS OTP nerede kullanılır, nerede kullanılmaz?

OTP (tek kullanımlık kod), kullanıcının o numaraya gerçekten erişebildiğini kanıtlar. Bu yüzden üç yerde işe yarar: telefon numarasının doğrulanmasında, şifresiz girişte ve riskli bir işlemin onayında (para transferi, IBAN değişikliği, yönetici yetkisi verme). Bunların hepsinde soru aynıdır: "bu numaranın sahibi şu anda burada mı?"

Kullanılmaması gereken yer ise kayıt formunun tamamını yavaşlatmaktır. Her adımda kod isteyen bir akış dönüşümü düşürür; kodu yalnızca numaranın gerçekten gerektiği anda isteyin. Numara zaten doğrulanmışsa ikinci kez sormanın güvenlik değeri yoktur.

Doğrulama kodu istemcide üretilmez, istemciye dönmez

Entegrasyonlarda gördüğümüz en ciddi hata şudur: kod, mobil uygulamada ya da tarayıcıda üretilip SMS servisine gönderilir; ya da sunucu kodu üretir ama API yanıtında "debug" amacıyla geri döner. İkisi de doğrulamayı tamamen anlamsız kılar, çünkü saldırganın SMS almasına gerek kalmaz.

Doğru akış tek yönlüdür: sunucu kodu üretir, kodun kendisini değil özetini (hash) saklar, SMS sağlayıcısına gönderir ve istemciye yalnızca "kod gönderildi" bilgisini döner. Doğrulama isteği geldiğinde girilen kodun özeti kayıtla karşılaştırılır.

// Doğrulama kodu sunucuda üretilir, sunucuda saklanır, istemciye ASLA dönmez.
import { createHash, randomInt } from 'node:crypto';

const KOD_OMRU_MS = 3 * 60 * 1000; // 3 dakika
const MAX_DENEME = 5;

type OtpKaydi = {
  telefon: string;
  kodHash: string;
  sonGecerlilik: number;
  denemeSayisi: number;
  kullanildi: boolean;
};

function kodUret(): string {
  // Math.random() kriptografik değildir; tahmin edilebilir kod üretir.
  return String(randomInt(0, 1_000_000)).padStart(6, '0');
}

function hashle(kod: string, telefon: string): string {
  // Telefonu da karıştır: aynı kodun başka numarada işe yaramasını engeller.
  return createHash('sha256').update(kod + '|' + telefon).digest('hex');
}

function dogrula(kayit: OtpKaydi, girilenKod: string, simdi: number) {
  if (kayit.kullanildi) return { ok: false, sebep: 'kod_kullanildi' };
  if (simdi > kayit.sonGecerlilik) return { ok: false, sebep: 'sure_doldu' };
  if (kayit.denemeSayisi >= MAX_DENEME) return { ok: false, sebep: 'deneme_asildi' };

  kayit.denemeSayisi += 1; // Yanlış denemede de artar — asıl koruma budur.

  if (hashle(girilenKod, kayit.telefon) !== kayit.kodHash) {
    return { ok: false, sebep: 'kod_hatali' };
  }

  kayit.kullanildi = true; // Tek kullanımlık: doğru kod ikinci kez geçmez.
  return { ok: true };
}

Bu fonksiyonda dikkat edilecek dört ayrıntı var: kod kriptografik rastgelelikle üretilir, telefon numarası hash'e karıştırılır, yanlış denemede de sayaç artar ve doğru kod tek kullanımlıktır. Dördüncüsü çoğu projede eksiktir; tek kullanımlık olmayan kod, SMS'i gören herkes için açık kapıdır.

Üç sayaç: ömür, deneme ve gönderim

OTP güvenliği tek bir mekanizmadan değil, üç ayrı sayaçtan gelir. Üçü de sunucuda tutulur; istemciden gelen hiçbir değere güvenilmez.

  • Kod ömrü: 2-5 dakika arası bir süre çoğu senaryo için yeterlidir. Uzun ömür, ele geçirilmiş bir SMS'in kullanım penceresini büyütür.
  • Deneme sayısı: aynı koda 4-6 yanlış denemeden sonra kayıt kapatılır ve yeni kod istenmesi gerekir. Sayaç doğrulama isteğinde artar, cevaptan bağımsız olarak.
  • Gönderim sayısı: aynı numaraya ve aynı IP'ye dakikada/saatte kaç kod gönderilebileceği sınırlanır. Bu sınır güvenlikten çok fatura içindir: sınırsız "tekrar gönder" düğmesi hem maliyeti hem operatör itibarınızı yakar.
  • Bekleme süresi: "tekrar gönder" düğmesi en az 30-60 saniye kilitli kalır ve bu kilit sunucuda doğrulanır; yalnızca arayüzde sayaç göstermek koruma değildir.
OTP'yi kıran şey kodun tahmin edilmesi değil, sınırsız denemedir. Altı haneli bir kod milyonda bir ihtimaldir; ama beş deneme sınırı yoksa aynı kod binlerce kez denenebilir ve ihtimal matematiği tersine döner.

SMS bir ağ üzerinden gider: teslimat ve maliyet

SMS entegrasyonunda ikinci gerçek, mesajın sizin kontrolünüzden çıktığı andır. Operatör kuyruğu, numara taşıma, yurt dışı numaralar ve mesaj başlığı (gönderici adı) teslimatı doğrudan etkiler. Sağlayıcı seçerken fiyat listesinden önce şu üçünü sorun: teslimat raporu (DLR) API'den alınabiliyor mu, OTP trafiği pazarlama trafiğinden ayrı bir kuyrukta mı gidiyor, yurt dışı numaralara gönderim destekleniyor mu.

Türkiye'de mesaj başlığı ve ticari ileti mevzuatı ayrı bir konudur ve kurallar değişebilir; doğrulama mesajları ile pazarlama mesajlarının tabi olduğu yükümlülükler aynı değildir. Entegrasyona başlamadan önce başlık tescili ve izin gereksinimlerini sağlayıcınıza ve ilgili kuruma yazılı olarak teyit ettirin — bu bir hukuki tavsiye değil, proje planına yazılması gereken bir adımdır. Aynı mantık KVKK uyumlu web sitesi yazısındaki veri saklama kararları için de geçerlidir: doğrulanmış telefon numarası kişisel veridir, saklama süresi baştan belirlenir.

Maliyet tarafında dikkat edilecek nokta, SMS'in adet başı ücretlendirilmesi ve başarısız denemelerin de ücretlendirilmesidir. "Tekrar gönder" akışını sınırlamayan bir uygulamada aylık faturanın yarısı hiç kullanılmayan kodlardan oluşur.

Yedek kanal: sesli arama ve uygulama tabanlı kod

SMS her zaman ulaşmaz. Kapsama sorunu, yurt dışı roaming ve operatör filtreleri gerçek kullanıcıları dışarıda bırakır. Bu yüzden ciddi bir entegrasyon en az bir yedek kanal tanımlar: sesli arama ile kodun okunması ya da WhatsApp Business API üzerinden gönderim. Yedek kanal ilk denemede değil, ikinci "tekrar gönder" isteğinde devreye girmelidir.

Yüksek riskli işlemlerde ise SMS'in kendisi en zayıf halkadır: numara taşıma (SIM swap) yoluyla yapılan saldırılarda kod saldırganın telefonuna düşer. Bankacılık benzeri işlemler için uygulama tabanlı kod (TOTP) ya da cihaz onayı daha güçlüdür; SMS bu senaryoda numara doğrulaması olarak kalır, tek güvenlik katmanı olarak değil. Genel saldırı yüzeyi için web sitesi güvenliği yazısına da göz atın.

Entegrasyonda en sık yapılan beş hata

  • Kodu API yanıtında döndürmek (çoğunlukla test ortamından kalan bir satır olarak canlıya çıkar).
  • Kodu veritabanında düz metin saklamak; veritabanı sızıntısında tüm aktif kodlar okunur.
  • Deneme sayacını istemcide tutmak — mobil uygulamada tutulan sayaç, istek doğrudan API'ye gönderilerek atlanır.
  • Doğru kodu tek kullanımlık yapmamak; aynı kod süresi dolana kadar tekrar tekrar geçerli olur.
  • Hata mesajında "bu numara kayıtlı değil" demek; bu, saldırgana kullanıcı listesi çıkarma imkânı verir. Doğrulama sonucu her durumda aynı genel mesajı dönmelidir.

Kendi servisiniz mi, hazır kimlik doğrulama sağlayıcısı mı?

İki yol var. Hazır kimlik doğrulama sağlayıcıları (kullanıcı yönetimi + OTP birlikte) hızlı başlatır ve sayaçların çoğunu sizin yerinize yönetir; karşılığında kullanıcı başına ücret ve sağlayıcıya bağımlılık gelir. Kendi uygulamanızda OTP kurmak ise yukarıdaki üç sayacı ve SMS sağlayıcı entegrasyonunu sizin yazmanız demektir — birkaç günlük bir iştir, ama kullanıcı sayısı büyüdükçe maliyeti sabit kalır.

Karar kuralı basit: kullanıcı yönetimini (kayıt, rol, oturum) zaten kendiniz yazıyorsanız OTP'yi de kendiniz yazın; kimlik doğrulamanın tamamını dışarıdan alıyorsanız OTP'yi ondan ayırmayın. İki sistemi bölmek, aynı kullanıcının iki yerde tutulması demektir ve API entegrasyonu tarafında sürekli senkronizasyon işi çıkarır.

Sonuç

SMS OTP doğrulama entegrasyonu, sağlayıcı seçimiyle değil üç kararla başlar: kod nerede üretiliyor, ne kadar yaşıyor, kaç kez denenebiliyor. Bu üçü doğruysa sağlayıcı değiştirmek bir günlük iştir; yanlışsa en pahalı SMS paketi bile güvenlik sağlamaz. Mevcut uygulamanıza doğrulama eklemek ya da kimlik doğrulama akışınızı baştan kurmak istiyorsanız özel yazılım hizmetimizle akışı birlikte tasarlayabilir, teklif alarak başlayabilirsiniz.

Projenizi Hayata Geçirelim

Web sitesi, mobil uygulama veya kurumsal yazılım projeniz için ücretsiz danışmanlık alın.

Ücretsiz Teklif AlÖzel Yazılım hizmetimizi inceleyin