Sevgili Turkhacks okurları,
Bir REST API geliştirirken çoğu geliştirici önce veritabanını, güvenlik katmanını ve kullanıcı yönetimini düşünür. Ancak sistem gerçek kullanıcılarla buluşmaya başladığında gözden kaçan başka bir konu ortaya çıkar: aşırı istek yükü.
Bir uygulama bazen binlerce gerçek kullanıcı tarafından yoğun şekilde kullanılabilir. Bazen de kötü niyetli kişiler belirli endpoint'lere saniyede yüzlerce hatta binlerce istek gönderebilir. Sonuç genellikle aynıdır; sistem yavaşlar, kaynak tüketimi artar ve bazı durumlarda servis tamamen erişilemez hale gelir.
İşte tam bu noktada rate limiting devreye girer.
Rate limiting, belirli bir kullanıcıya veya IP adresine belirli süre içerisinde gönderilebilecek maksimum istek sayısını tanımlayan bir koruma mekanizmasıdır.
Basit görünmesine rağmen modern uygulamaların güvenlik katmanında oldukça önemli bir yere sahiptir.
Rate Limiting Nedir?
En basit tanımıyla rate limiting, kullanıcıların belirli bir zaman aralığında yapabileceği istek sayısını sınırlandırır.Örneğin:
| İşlem | Limit |
|---|---|
| Login | Dakikada 5 istek |
| Şifre sıfırlama | Dakikada 3 istek |
| API sorgusu | Dakikada 100 istek |
| Kayıt oluşturma | Dakikada 20 istek |
Bu sayede hem kaynak tüketimi kontrol altında tutulur hem de birçok saldırı türü engellenebilir.
Rate Limiting Neden Gereklidir?
Yeni başlayan geliştiriciler bazen JWT kullandıkları için sistemlerinin tamamen güvenli olduğunu düşünebiliyor.Ancak JWT kullanıcıyı doğrular.
Rate limiting ise sistemi korur.
Aradaki fark oldukça önemlidir.
Örneğin bir saldırgan giriş ekranına saniyede yüzlerce deneme gönderebilir.
JWT burada bir çözüm sunmaz.
Rate limiting ise belirli bir noktadan sonra isteği reddeder.
Hangi Saldırılara Karşı Koruma Sağlar?
Sevgili Turkhacks okurları, burada önemli olan nokta rate limiting'in tek başına bir güvenlik sistemi olmadığıdır. Ancak doğru kullanıldığında saldırı yüzeyini ciddi şekilde küçültür.Koruma sağladığı başlıca senaryolar:
Tam koruma sağlamasa da saldırganın işini oldukça zorlaştırır.
Spring Boot'ta Rate Limiting Nasıl Çalışır?
Mantık aslında oldukça basittir.Her kullanıcı veya IP adresi için bir sayaç tutulur.
Örneğin:
192.168.1.15
↓
1 Dakika İçerisinde
↓
100 İstek
- istekte sistem yanıt döndürür:
Too Many Requests
Bu hata kodu istemciye limitin aşıldığını bildirir.
En Yaygın Rate Limiting Yaklaşımları
Farklı projelerde farklı yöntemler kullanılabilir.
| Yöntem | Açıklama |
| Fixed Window | Sabit zaman aralığı |
| Sliding Window | Kayan zaman aralığı |
| Token Bucket | En yaygın yöntem |
| Leaky Bucket | Trafik dengeleme |
Token Bucket Neden Bu Kadar Popüler?
Bu yaklaşımın mantığı oldukça anlaşılırdır.Sistemde belirli sayıda token bulunur.
Her gelen istek bir token tüketir.
Token kalmadığında yeni istekler reddedilir.
Örneğin:
| Durum | Sonuç |
| 10 token mevcut | İstek kabul edilir |
| 5 token kaldı | İstek kabul edilir |
| 0 token kaldı | İstek reddedilir |
Bu yöntem hem performanslı hem de esnek çalışır.
Spring Boot Projelerinde Hangi Kütüphaneler Kullanılır?
Rate limiting geliştirmek için sıfırdan sistem yazılabilir.Ancak çoğu projede hazır çözümler tercih edilir.
| Kütüphane | Kullanım Alanı |
| Bucket4j | En popüler seçenek |
| Resilience4j | Mikroservis projeleri |
| Redis | Dağıtık sistemler |
| Spring Cloud Gateway | Gateway seviyesinde koruma |
Özellikle Bucket4j son yıllarda Spring Boot geliştiricileri arasında oldukça yaygın hale gelmiştir.
Rate Limiting Nerede Uygulanmalı?
Bu soru gerçek projelerde sıkça sorulur.Her endpoint'e aynı limit uygulanmaz.
Örneğin:
| Endpoint | Önerilen Limit |
| Login | Dakikada 5 |
| Register | Dakikada 10 |
| Profil Görüntüleme | Dakikada 100 |
| Genel API | Dakikada 200 |
Mikroservis Mimarilerinde Rate Limiting
Mikroservis kullanan sistemlerde rate limiting genellikle servislerin içinde değil, API Gateway katmanında uygulanır.Yani süreç şu şekilde işler:
Kullanıcı
↓
API Gateway
↓
Rate Limit Kontrolü
↓
İlgili Mikroservis
Bu yaklaşım tüm sistem için merkezi bir koruma sağlar.
Yapılan Yaygın Hatalar
Rate limiting kullanırken bazı hatalar sıkça karşımıza çıkar.Limitleri Çok Düşük Belirlemek
Gerçek kullanıcılar da engellenmeye başlayabilir.Tüm Endpoint'lere Aynı Kuralı Uygulamak
Login ile ürün listeleme isteğinin aynı değerlendirilmesi doğru değildir.Sadece IP Adresine Güvenmek
Bazı kullanıcılar aynı ağ üzerinden çıkış yapabilir.Kurumsal yapılarda bu durum sorun oluşturabilir.
Dağıtık Sistemlerde Bellek Tabanlı Sayaç Kullanmak
Birden fazla sunucu varsa sayaçların merkezi yönetilmesi gerekir.Bu noktada Redis gibi çözümler tercih edilmelidir.
Rate Limiting ve JWT Birlikte Kullanılmalı mı?
Kesinlikle evet.Aslında en güçlü koruma katmanlarından biri bu ikilinin birlikte kullanılmasıdır.
| Sistem | Görevi |
| JWT | Kimlik doğrulama |
| Rate Limiting | İstek kontrolü |
Rate limiting ise o kullanıcının ne kadar istek gönderebileceğini kontrol eder.
Birbirlerini tamamlayan iki farklı güvenlik katmanıdır.
Spring Boot projelerinde rate limiting uygulamak yalnızca performans optimizasyonu değildir. Aynı zamanda sistem güvenliğinin önemli bir parçasıdır.Doğru yapılandırılmış bir rate limiting mekanizması; brute force saldırılarını zorlaştırır, gereksiz kaynak tüketimini azaltır ve API servislerinin daha stabil çalışmasına yardımcı olur. Özellikle JWT tabanlı modern REST API projelerinde, rate limiting artık ek bir özellik değil, temel güvenlik bileşenlerinden biri olarak değerlendirilmelidir.
Sevgili Turkhacks okurları, güçlü bir API yalnızca hızlı çalışan API değildir. Aynı zamanda kötü niyetli kullanımlara karşı kendisini koruyabilen API'dir. Güvenlik çoğu zaman büyük sistemlerle değil, doğru zamanda alınmış küçük önlemlerle başlar.
Bir dahaki makalemizde görüşene kadar mavi ekransız ve sorunsuz sistemlerle çalışmanız dileği ile Hoşçakalın


