Modern Backend Sistemlerde API Güvenliği: Kimlik Doğrulama, Yetkilendirme ve Saldırı Yüzeyi Yönetimi
OAuth 2.0, JWT, rate limiting ve OWASP API güvenlik risklerinden yola çıkarak, üretime hazır bir backend'de API güvenliğini uçtan uca kurmanın kapsamlı rehberi.
İçindekiler 0
Bir API, bir uygulamanın dış dünyaya açılan kapısıdır ve bu kapı ne kadar güçlü görünürse görünsün, tek bir yanlış yapılandırılmış uç nokta tüm sistemin güvenliğini tehlikeye atabilir. Modern backend sistemlerde API güvenliği, artık sadece "kullanıcı adı ve şifre kontrolü" ile sınırlı bir konu değil; kimlik doğrulama, yetkilendirme, hız sınırlama, girdi doğrulama ve sürekli izleme gibi birden fazla katmanı kapsayan bütünsel bir mühendislik disiplinidir. Bu kapsamlı rehberde, üretime hazır bir API'yi güvenli hale getirirken göz önünde bulundurulması gereken temel prensipleri, OWASP API Security Top 10 listesindeki en kritik riskleri ve pratik uygulama yöntemlerini detaylı biçimde ele alıyoruz.
1. Kimlik Doğrulama: API Anahtarları, JWT ve OAuth 2.0
Kimlik doğrulama, "bu isteği kim gönderiyor?" sorusunun cevabıdır ve doğru yöntemi seçmek, kullanım senaryosuna göre değişir:
- API anahtarları: Sunucudan sunucuya (server-to-server) entegrasyonlarda basit ve etkilidir, ancak tek başına kullanıcı bazlı yetkilendirme sağlamaz.
- JWT (JSON Web Token): Durumsuz (stateless) kimlik doğrulama sağlar ve yatay ölçeklenebilirliği kolaylaştırır, ancak imzalama algoritmasının doğru seçilmesi (asimetrik RS256 tercih edilmesi) ve token süresinin kısa tutulması kritik önem taşır.
- OAuth 2.0 / OpenID Connect: Üçüncü parti entegrasyonlar ve kullanıcı adına yetkilendirme gerektiren senaryolarda (örneğin "Google ile giriş yap") endüstri standardıdır.
Kimlik doğrulama tek başına yeterli değildir. Bir kullanıcının kim olduğunu doğrulamak, o kullanıcının istediği işlemi yapmaya yetkili olduğu anlamına gelmez — bu ikisini birbirine karıştırmak, en sık görülen güvenlik açıklarından birinin kök nedenidir.
2. Yetkilendirme: RBAC, ABAC ve Nesne Seviyesi Kontroller
OWASP API Security Top 10 listesinin başında yer alan "Broken Object Level Authorization" (BOLA), bir kullanıcının kendisine ait olmayan bir kaynağa, sadece kaynağın kimliğini (ID) değiştirerek erişebilmesi anlamına gelir. Bunu önlemenin tek yolu, her API isteğinde kaynağın gerçekten o kullanıcıya ait olup olmadığını sunucu tarafında doğrulamaktır — bu kontrol asla istemciye (frontend'e) bırakılmamalıdır.
Rol bazlı erişim kontrolü (RBAC) çoğu uygulama için yeterliyken, daha karmaşık, bağlama duyarlı yetkilendirme senaryolarında (örneğin "bir kullanıcı sadece kendi departmanındaki kayıtları görebilir") öznitelik bazlı erişim kontrolü (ABAC) daha esnek bir çözüm sunar. Yetkilendirme mantığının dağınık şekilde her endpoint'e ayrı ayrı yazılması yerine merkezi bir politika katmanında (policy engine) toplanması, tutarlılığı ve denetlenebilirliği artırır.
3. Hız Sınırlama (Rate Limiting) ve Kaynak Tüketimi Kontrolü
Sınırsız istek hakkı tanıyan bir API, hem kötü niyetli aktörlere hem de yanlışlıkla yazılmış bir istemci koduna karşı savunmasızdır. Etkili bir rate limiting stratejisi şu katmanları içermelidir:
- IP bazlı sınırlama: Kimliği doğrulanmamış uç noktalarda temel bir koruma katmanıdır.
- Kullanıcı/API anahtarı bazlı sınırlama: Kimliği doğrulanmış isteklerde, kullanım planına göre farklılaştırılmış limitler uygulanabilir.
- Maliyetli işlemler için özel limitler: Arama, raporlama veya dosya yükleme gibi kaynak yoğun uç noktalara, diğer basit uç noktalardan daha sıkı limitler tanımlanmalıdır.
Ayrıca, aşırı büyük istek gövdelerini (payload) veya derinlemesine iç içe geçmiş JSON yapılarını reddeden limitler tanımlamak, "resource exhaustion" saldırılarına karşı ek bir koruma katmanı sağlar.
4. Girdi Doğrulama ve Enjeksiyon Saldırılarına Karşı Savunma
Her API girdisi, güvenilmez kabul edilmelidir. Şema tabanlı doğrulama kütüphaneleri (Zod, Joi gibi) kullanarak her isteğin beklenen tip, format ve uzunluk kısıtlarına uyduğunu doğrulamak, hem SQL enjeksiyonu hem de beklenmeyen veri tiplerinden kaynaklanan çökmelerin önüne geçer. Parametreli sorgular (prepared statements) kullanmak, ham SQL string birleştirmesi yerine, enjeksiyon saldırılarına karşı en temel ve en etkili savunmadır.
5. Aşırı Veri Sızıntısı (Excessive Data Exposure)
Birçok API, ihtiyaç duyulandan fazla veriyi döndürüp filtrelemeyi istemci tarafına bırakır — bu, hassas alanların (şifre hash'i, iç sistem kimlikleri gibi) yanlışlıkla ağ üzerinden sızmasına yol açabilir. Yanıt şemalarının (response DTO) her endpoint için açıkça tanımlanması ve sadece gerekli alanların serileştirilmesi, bu riski ortadan kaldırır.
6. Güvenlik Başlıkları ve Ulaşım Katmanı Güvenliği
API güvenliği sadece uygulama mantığıyla sınırlı değildir; ulaşım katmanı da en az onun kadar önemlidir. Tüm trafiğin TLS üzerinden şifrelenmesi, HSTS başlığının etkinleştirilmesi ve CORS politikalarının yalnızca güvenilen origin'lere izin verecek şekilde sıkı tutulması, saldırı yüzeyini önemli ölçüde daraltır.
7. Sürekli İzleme, Anomali Tespiti ve Denetim Kayıtları
Güvenlik, bir kerelik bir yapılandırma değil, sürekli bir süreçtir. Her kimlik doğrulama denemesi, yetkilendirme reddi ve hassas veri erişimi denetim kaydına (audit log) yazılmalı, bu kayıtlar değiştirilemez (immutable) bir depoda tutulmalıdır. Anormal erişim örüntülerini (örneğin bir hesabın kısa sürede farklı coğrafi bölgelerden giriş yapması) otomatik olarak tespit eden bir anomali izleme sistemi kurmak, bir sızıntı gerçekleşmeden önce erken uyarı sağlar.
Sıkça Sorulan Sorular
JWT token'lar ne kadar sürede geçersiz kılınmalı?
Erişim (access) token'ları genellikle 15-60 dakika gibi kısa ömürlü tutulmalı; uzun süreli oturumlar için ayrı, güvenli şekilde saklanan ve geri alınabilen (revoke edilebilen) bir refresh token mekanizması kullanılmalıdır.
API anahtarları veritabanında nasıl saklanmalı?
API anahtarları asla düz metin olarak saklanmamalı; şifreler gibi tek yönlü bir hash fonksiyonuyla (örneğin SHA-256) hashlenip veritabanında bu hash değeri tutulmalı, doğrulama sırasında gelen anahtar aynı fonksiyonla hashlenip karşılaştırılmalıdır.
Rate limiting hangi katmanda uygulanmalı: API Gateway mi, uygulama kodu mu?
Mümkün olduğunda API Gateway veya ters proxy (reverse proxy) katmanında uygulamak, isteğin uygulama sunucusuna ulaşmadan reddedilmesini sağlayarak kaynak tüketimini daha verimli önler; uygulama içi rate limiting ise kullanıcıya özel, iş mantığına bağlı senaryolar için tamamlayıcı olarak kullanılabilir.
Sonuç
API güvenliği, tek bir araç veya tek bir kontrol noktasıyla çözülebilecek bir problem değildir; kimlik doğrulama, yetkilendirme, hız sınırlama, girdi doğrulama ve sürekli izlemenin birlikte çalıştığı katmanlı bir savunma (defense in depth) yaklaşımı gerektirir. Bu katmanlardan biri eksik olduğunda, diğerleri ne kadar sağlam olursa olsun sistem savunmasız kalır. Güvenliği baştan mimariye entegre eden ekipler, hem kullanıcı güvenini korur hem de bir güvenlik olayının maliyetini — hem itibar hem de mühendislik açısından — en aza indirir.