İstek Limiti
Bu teknik analizde, uygulamanızın kamuya açık (public) endpoint’lerine yönelik istekleri sınırlamak için önerilen rate limiting çözümünü detaylandıracağım. Bu çözüm, Spring Boot, Bucket4j ve Guava kütüphanelerini kullanarak IP adresi bazlı rate limiting sağlar.
1. Problem Tanımı
Kamuya Açık Endpoint’lerin Korunması
Uygulamanızdaki kamuya açık endpoint’lere aşırı istek gönderilmesi, sunucunuzun performansını olumsuz etkileyebilir ve hizmet kesintilerine neden olabilir.
Kötüye Kullanımın Önlenmesi
Kötü niyetli kullanıcıların veya botların kamuya açık endpoint’lere aşırı yük bindirmesi engellenmelidir.
2. Önerilen Çözüm
IP Bazlı Rate Limiting
Kamuya açık endpoint’lere yapılan istekleri, istemcinin IP adresine göre belirli bir zaman diliminde sınırlamak.
Bucket4j Kütüphanesi Kullanımı
Rate limiting mekanizmasını uygulamak için performanslı ve esnek bir kütüphane olan Bucket4j’yi kullanmak.
Spring Boot Filter Entegrasyonu
Rate limiting işlemini uygulamak için bir Spring Boot filtresi oluşturmak.
3. Teknik Detaylar
3.1. Kullanılan Teknolojiler ve Kütüphaneler
Spring Boot
Uygulamanın ana çatısını oluşturur ve filtrelerin entegrasyonunu sağlar.
Bucket4j
Token bucket algoritmasını kullanarak rate limiting sağlar.
Yüksek performanslı ve esnektir.
Guava Cache
Kullanıcıların Bucket’larını bellekte saklamak ve kullanılmayanları otomatik olarak temizlemek için kullanılır.
Bellek yönetimini kolaylaştırır.
3.2. Rate Limiting Mantığı
Örnektir.
Bucket Oluşturma
Her IP adresi için bir Bucket oluşturulur.
Eğer token varsa ve valid ise;
Maksimum istek sayısı 20
Zaman dilimi 1 dakika
Eğer token yok ise;
Maksimum istek sayısı 10
Zaman dilimi 1 dakika
İsteklerin Kontrolü
Eğer bucket var ise ve sayısı 1’den fazla ise
429 Too Many Requests
yanıtı döndürülür.
4. Avantajlar
Performans
Bucket4j yüksek performanslıdır ve uygulamanın hızını olumsuz etkilemez.
Esneklik
Limitler ve zaman dilimleri kolayca ayarlanabilir.
Kamuya açık endpoint’ler kolayca yönetilebilir.
Kolay Entegrasyon
Spring Boot ile sorunsuz bir şekilde entegre edilebilir.
Bellek Yönetimi
Guava Cache kullanımı ile bellek tüketimi optimize edilir.
5. Dikkat Edilmesi Gerekenler
IP Adresinin Doğruluğu
Reverse proxy veya load balancer kullanırsak, gerçek istemci IP adresini doğru bir şekilde almak için ayarlarınızı kontrol etmeliyiz.
X-Forwarded-For başlığı manipüle edilebilir; güvenilirliği sağlamak için güvenlik önlemleri almalıyız.
Paylaşımlı IP Adresleri
Aynı IP adresini paylaşan kullanıcılar (örneğin, kurumsal ağlar) etkilenebilir.
Bu durum, bazı kullanıcıların beklenmedik şekilde sınırlanmasına yol açabilir.
Dağıtık Sistemler
Uygulamamız birden fazla sunucuda çalışıyorsa, rate limiting mekanizmasının tutarlı olması için Redis gibi bir dağıtık cache kullanmayı düşünebiliriz.
6. Gelecekteki İyileştirmeler
Kullanıcı Kimliği ile Rate Limiting
Yetkilendirme gerektiren endpoint’ler için kullanıcı kimliğine dayalı rate limiting uygulayabiliriz.
Dağıtık Cache Kullanımı
Redis veya benzeri bir cache sistemi ile rate limiting verilerini paylaşarak tutarlılık sağlayabiliriz.
Detaylı Loglama ve İzleme
Rate limiting olaylarını loglayarak sistemin kullanımını ve potansiyel saldırıları izleyebiliriz.
Esnek Limitler
Farklı endpoint’ler veya kullanıcı grupları için farklı rate limiting kuralları tanımlayabiliriz.
Özet
Bu teknik analizde, kamuya açık endpoint’lere yönelik istekleri sınırlamak için önerilen rate limiting çözümünü detaylandırdım. Önerilen yapı, uygulamanızın performansını ve güvenliğini artırırken, kötüye kullanımları engellemeye yardımcı olacak.
IP Bazlı Rate Limiting
Kamuya açık endpoint’lere gelen istekler IP adresine göre sınırlandırılır.
Kamuya Açık Endpoint’lerin Belirlenmesi
Esnek ve kolay yönetilebilir bir yapı sunar.
Kolay Entegrasyon ve Performans
Spring Boot ve Bucket4j ile sorunsuz entegrasyon ve yüksek performans.