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, API'nize yapılabilecek istek sayısını belirli bir zaman aralığında sınırlandırma işlemidir. Örneğin:
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:
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:
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');
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); });
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); }); });
Yüksek trafikli uygulamalar için Redis kullanabilirsiniz:
CACHE_DRIVER=redis
RateLimiter::for('api', function (Request $request) { return Limit::perMinute(1000)->by($request->ip()); });
Testlerinizde rate limiting'i devre dışı bırakabilirsiniz:
public function test_api_endpoint() { $this->withoutRateLimiting(); $response = $this->get('/api/test'); $response->assertStatus(200); }
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!