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ı
- API Güvenliği: DDoS ve brute force saldırılarına karşı koruma
- Kaynak Kontrolü: Sunucu kaynaklarınızı koruma
- Adil Kullanım: Tüm kullanıcılar için eşit erişim
- Esneklik: Kullanıcı bazında özel kurallar
- 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!
+(30).png&w=320&q=50)


