İ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.

  1. Bucket Oluşturma

    1. Her IP adresi için bir Bucket oluşturulur.

  2. Eğer token varsa ve valid ise;

    1. Maksimum istek sayısı 20

    2. Zaman dilimi 1 dakika

  3. Eğer token yok ise;

    1. Maksimum istek sayısı 10

    2. Zaman dilimi 1 dakika

  4. İsteklerin Kontrolü

    1. 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.