design

Laravel'de API Rate Limiting: Güvenli ve Kontrollü Erişim

March 24, 2025

Merhaba arkadaşlar, bugün sizlerle Laravel'de API Rate Limiting konusunu detaylı şekilde inceleyeceğiz. API'lerinizi kötü niyetli veya aşırı kullanımlardan korumak için rate limiting (erişim sınırlandırma) kritik bir önlemdir. Laravel, bu konuda bize harika araçlar sunuyor. Gelin birlikte bu güvenlik katmanını nasıl uygulayacağımızı öğrenelim.


Rate Limiting Nedir?


Rate limiting, API'nize yapılabilecek istek sayısını belirli bir zaman aralığında sınırlandırma işlemidir. Örneğin:

  • 1 dakikada 60 istek şeklinde sınır koyabilirsiniz
  • IP adresine göre farklı kurallar uygulayabilirsiniz
  • Kullanıcı bazında özel limitler tanımlayabilirsiniz


Temel Rate Limiting Kullanımı


Laravel'de rate limiting RouteServiceProvider içinde tanımlanır:

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

protected function configureRateLimiting()
{
    RateLimiter::for('api', function (Request $request) {
        return Limit::perMinute(60)->by($request->user()?->id ?: $request->ip());
    });
}

Bu örnekte:

  • Her kullanıcı dakikada maksimum 60 istek yapabilir
  • Giriş yapmamış kullanıcılar için IP adresi baz alınır


Özel Rate Limiting Kuralları

Farklı endpoint'ler için farklı kurallar tanımlayabilirsiniz:

RateLimiter::for('login', function (Request $request) {
    return [
        Limit::perMinute(3), // Genel limit
        Limit::perMinute(10)->by($request->ip()), // IP bazlı limit
    ];
});

Bu kural:

  • Login endpoint'ine dakikada 3 genel istek sınırı koyar
  • Aynı IP'den dakikada 10 istek yapılabilir


Route'larda Rate Limiting Uygulama

Tanımladığınız kuralları route'larda şu şekilde kullanabilirsiniz:

Route::middleware(['throttle:api'])->group(function () {
    Route::get('/profile', function () {
        // Kullanıcı profili endpoint'i
    });
    
    Route::get('/orders', function () {
        // Siparişler endpoint'i
    });
});

Özel tanımlı limitler için:


Route::post('/login', [AuthController::class, 'login'])
    ->middleware('throttle:login');

Dinamik Rate Limiting

Koşullara göre dinamik limitler belirleyebilirsiniz:


RateLimiter::for('api', function (Request $request) {
    if ($request->user() && $request->user()->isPremium()) {
        return Limit::none(); // Premium kullanıcılar için limit yok
    }
    
    return Limit::perMinute(100);
});

Rate Limiting Yanıtlarını Özelleştirme

Limit aşıldığında dönecek yanıtı özelleştirmek için:


RateLimiter::for('api', function (Request $request) {
    return Limit::perMinute(60)->response(function () {
        return response()->json([
            'message' => 'Çok fazla istek yaptınız',
            'retry_after' => 60, // Saniye cinsinden
        ], 429);
    });
});


Redis ile Gelişmiş Rate Limiting

Yüksek trafikli uygulamalar için Redis kullanabilirsiniz:


CACHE_DRIVER=redis


RateLimiter::for('api', function (Request $request) {
    return Limit::perMinute(1000)->by($request->ip());
});


Test Ortamında Rate Limiting

Testlerinizde rate limiting'i devre dışı bırakabilirsiniz:


public function test_api_endpoint()
{
    $this->withoutRateLimiting();
    
    $response = $this->get('/api/test');
    $response->assertStatus(200);
}


Laravel'de Rate Limiting Avantajları

  1. API Güvenliği: DDoS ve brute force saldırılarına karşı koruma
  2. Kaynak Kontrolü: Sunucu kaynaklarınızı koruma
  3. Adil Kullanım: Tüm kullanıcılar için eşit erişim
  4. Esneklik: Kullanıcı bazında özel kurallar
  5. Entegrasyon: Laravel'in diğer özellikleriyle uyum


Laravel'in rate limiting sistemi, API'lerinizi korumak için güçlü ve esnek bir çözüm sunar. Basit yapılandırmalarla profesyonel seviyede güvenlik sağlayabilirsiniz.Bir sonraki yazımızda Laravel'de GraphQL Kullanımı konusunu ele alacağız. Görüşmek üzere!

3 + 1 =