29.01.2026

Laravel’de Rate Limiting: API’yi DDoS Değil, “Nazik Trafik” Varsayımıyla Tasarlamak

Laravel Rate Limiting ile API trafiğini sınırlayın: kullanıcı, IP, endpoint bazlı throttle ve dinamik limit örnekleri.

API’ler büyüdükçe “performans” sorunu çoğu zaman koddan değil kontrolsüz trafikten gelir: botlar, hatalı client retry’ları, agresif mobil senkronizasyonlar… Laravel’in Rate Limiting (Throttle) altyapısı, bu riski uygulama seviyesinde yönetmenin en temiz yollarından biri.

1) Neyi sınırlamalıyız? (Körlemesine değil, hedefli)

Rate limit’i tek bir sayı gibi düşünmeyin. İyi bir strateji genelde üç katmandan oluşur:

  • Anonim istekler (IP bazlı): kayıt/oturum yokken en sık suistimal edilen alan.
  • Kimliği doğrulanmış kullanıcılar (user id bazlı): adil kullanım ve “noisy neighbor” etkisini azaltır.
  • Hassas endpoint’ler: giriş, parola sıfırlama, arama, OTP, dış servise çağrı yapan rotalar.

2) Laravel’de named limiter tanımlamak

App\Providers\RouteServiceProvider içinde limitörleri tanımlayabilirsiniz:

use Illuminate\Cache\RateLimiting\Limit;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\RateLimiter;

public function boot(): void
{
    RateLimiter::for('api-public', function (Request $request) {
        // Anonim: IP bazlı daha sıkı
        return Limit::perMinute(60)->by($request->ip());
    });

    RateLimiter::for('api-auth', function (Request $request) {
        // Auth: kullanıcı + IP kombinasyonu (paylaşımlı IP senaryolarında adil)
        $key = optional($request->user())->id.'|'.$request->ip();
        return Limit::perMinute(300)->by($key);
    });
}

Route tarafında kullanım:

Route::middleware(['throttle:api-public'])->group(function () {
    Route::get('/products', ...);
});

Route::middleware(['auth:sanctum', 'throttle:api-auth'])->group(function () {
    Route::post('/orders', ...);
});

3) Endpoint’e göre “dinamik limit”: arama ve raporlama gibi pahalı rotalar

Bazı rotalar CPU/DB için pahalıdır (örn. full-text search, rapor export). Bunlara ayrı limit verin.

RateLimiter::for('search', function (Request $request) {
    // Kullanıcı varsa kullanıcıya, yoksa IP’ye göre
    $identity = $request->user()?->id ?? $request->ip();

    // Search endpoint’i pahalı: dakikada 30
    return Limit::perMinute(30)->by('search:'.$identity);
});

Route::get('/search', ...)->middleware('throttle:search');

İpucu: Arama için ayrıca minimum query length (örn. 3 karakter) ve cache ile birlikte düşünün; rate limit tek başına mucize değildir.

4) Burst (ani yük) + sürdürülebilir limit birlikte

Kullanıcı davranışı bazen “kısa süreli patlama”dır: sayfa açılırken birden çok istek atılır. Laravel’de bunu iki limit ile modelleyebilirsiniz.

RateLimiter::for('orders', function (Request $request) {
    $id = $request->user()?->id ?? $request->ip();

    return [
        // Kısa burst: 10 istek / 10 saniye
        Limit::perSeconds(10, 10)->by('orders:burst:'.$id),
        // Uzun vadeli: 120 istek / dakika
        Limit::perMinute(120)->by('orders:sustained:'.$id),
    ];
});

Route::post('/orders', ...)
    ->middleware(['auth:sanctum', 'throttle:orders']);

Bu yaklaşım, hem “bir anda çökertme”yi azaltır hem de normal kullanıcıyı gereksiz yere cezalandırmaz.

5) Limit aşıldığında daha iyi geri bildirim: Retry-After

Laravel varsayılan olarak 429 döner. Client tarafının düzgün davranması için Retry-After header’ını anlamlı kullanmak önemlidir.

  • Mobil uygulamalarda exponential backoff
  • Frontend’de kullanıcıya “biraz bekleyin” mesajı
  • Bot trafiğinde agresif bloklama

Gerekiyorsa render() veya exception handler üzerinden 429 yanıtını standardize edin (ör. RFC7807 problem+json).

6) Uygulama notları (prod’da fark yaratan detaylar)

  • Store seçimi: Rate limit sayacı için cache driver önemlidir. Yük altında Redis, file/database’a göre çok daha sağlıklıdır.
  • Proxy arkasında IP: Cloudflare/Nginx gibi proxy’lerde gerçek IP için TrustProxies ayarlarını doğru yapın; yoksa herkes aynı IP gibi görünür.
  • Anahtar tasarımı: by() anahtarı, adalet ve izolasyon sağlar. Sadece ip() bazlı limit, NAT arkasındaki kurumsal ağları gereksiz kısıtlayabilir.

Sonuç

Rate Limiting, “kötü niyetli trafik” kadar iyi niyetli ama hatalı trafiği de yönetmenin anahtarı. Laravel’in named limiter yaklaşımıyla; kullanıcı/IP bazlı, endpoint özel, burst+sustained kombinasyonlu bir throttle stratejisi kurarak API’nizi daha dayanıklı hale getirebilirsiniz.