Rate Limiting یا محدود کردن تعداد درخواستها، یکی از تکنیکهای امنیتی و مدیریتی مهم در توسعه APIها است. این تکنیک به شما این امکان را میدهد که تعداد درخواستهایی که یک کاربر یا کلاینت میتواند به سرور ارسال کند را محدود کنید تا از حملات احتمالی مانند Denial of Service (DoS) یا Brute Force Attacks جلوگیری شود. همچنین، Rate Limiting باعث میشود که منابع سرور به طور بهینه استفاده شوند و بار زیادی روی سرور وارد نگردد.
در لاراول، برای پیادهسازی Rate Limiting از سیستمهای پیشفرض و قدرتمندی مانند Throttle Requests استفاده میشود.
1. Rate Limiting در لاراول
لاراول برای مدیریت Rate Limiting از کلاس ThrottleRequests استفاده میکند که به شما این امکان را میدهد که تعداد درخواستها را در یک بازه زمانی مشخص محدود کنید. شما میتوانید این محدودیتها را به راحتی برای تمام APIها یا برخی از مسیرها (Routes) پیادهسازی کنید.
2. محدود کردن درخواستها در مسیرها (Routes)
2.1 Rate Limiting برای تمام درخواستها
لاراول به طور پیشفرض یک سیستم محدودیت نرخ برای تمام درخواستهای API در فایل app/Http/Kernel.php فراهم کرده است. این تنظیمات در قسمت $routeMiddleware قرار دارد.
برای محدود کردن تعداد درخواستها، میتوانید از middleware throttle استفاده کنید:
در اینجا، throttle:60,1 به این معنی است که کاربر میتواند 60 درخواست را در 1 دقیقه ارسال کند. اگر تعداد درخواستها بیشتر از 60 باشد، درخواستهای اضافی رد میشوند.
2.2 Rate Limiting برای گروههای خاص مسیرها
اگر بخواهید محدودیت نرخ را فقط برای یک گروه از مسیرها اعمال کنید، میتوانید از middleware throttle به طور مشابه استفاده کنید، اما به صورت گروهی:
در اینجا، تمام درخواستهای داخل این گروه محدود به 30 درخواست در 1 دقیقه خواهند بود.
3. تعریف Rate Limiting در Kernel.php
برای تنظیم Rate Limiting پیشرفتهتر، میتوانید تنظیمات مربوط به Rate Limiting را در فایل app/Http/Kernel.php در بخش api انجام دهید. به طور پیشفرض، لاراول یک محدودیت برای درخواستهای API در این فایل قرار داده است که در مسیر api اعمال میشود.
تنظیمات پیشفرض:
در فایل app/Http/Kernel.php، میتوانید مقدار پیشفرض تعداد درخواستها و زمان محدودیت را تنظیم کنید:
در اینجا، برای تمام درخواستهای API، تعداد درخواستها به 60 درخواست در دقیقه محدود شده است. برای تغییر این مقدار، باید مقدار 'throttle' را تغییر دهید.
4. Rate Limiting سفارشی با استفاده از RateLimiter
لاراول به شما این امکان را میدهد که Rate Limiting را به طور سفارشی پیادهسازی کنید. برای انجام این کار، میتوانید از کلاس RateLimiter استفاده کنید که در Illuminate\Cache\RateLimiter قرار دارد.
4.1 تعریف Rate Limiting سفارشی
برای پیادهسازی محدودیت سفارشی، ابتدا باید کلاس RateLimiter را در فایل routes/api.php یا در فایل app/Providers/RouteServiceProvider.php استفاده کنید.
مثال پیادهسازی Rate Limiting سفارشی برای مسیرهای خاص:
سپس، این محدودیت را میتوانید برای مسیرهای خاص با استفاده از middleware throttle به کار ببرید:
4.2 Rate Limiting بهصورت داینامیک
در صورتی که بخواهید محدودیت را بهطور داینامیک بر اساس اطلاعات کاربر یا آدرس IP تنظیم کنید، میتوانید از کد زیر استفاده کنید:
در اینجا، تعداد درخواستها به 30 درخواست در دقیقه برای هر آدرس IP محدود میشود.
5. پاسخ به درخواستهای بیش از حد مجاز
زمانی که کاربر بیش از حد مجاز درخواست ارسال کند، لاراول بهطور خودکار یک پاسخ با وضعیت 429 (Too Many Requests) ارسال میکند. شما میتوانید این پاسخها را سفارشیسازی کنید.
5.1 سفارشیسازی پیامهای خطا
برای سفارشیسازی پاسخهای خطا، میتوانید از متد failed در کلاس ThrottleRequests استفاده کنید. به عنوان مثال:
6. Rate Limiting در APIها با Laravel Passport یا Sanctum
اگر از Laravel Passport یا Sanctum برای احراز هویت API استفاده میکنید، میتوانید به راحتی از امکانات Rate Limiting برای کنترل تعداد درخواستهای کاربران API استفاده کنید. این ابزارها به طور خودکار از محدودیت نرخ برای درخواستها پشتیبانی میکنند.
در Passport، برای هر توکن، تعداد درخواستهای مجاز در یک دوره زمانی مشخص تنظیم میشود. میتوانید این تنظیمات را در مسیرهای API با استفاده از middleware throttle مشخص کنید.
7. نتیجهگیری
محدود کردن تعداد درخواستها یا Rate Limiting یکی از روشهای مهم برای حفظ امنیت و عملکرد بهتر APIها است. لاراول ابزارهای پیشفرض و قدرتمندی برای اعمال محدودیت روی درخواستها فراهم کرده است، از جمله middleware throttle و قابلیتهای RateLimiter. با استفاده از این ابزارها میتوانید حملات DoS و درخواستهای مخرب را به راحتی مدیریت کنید و منابع سرور را بهینهسازی کنید.
با پیادهسازی Rate Limiting در پروژههای خود میتوانید از بار زیاد روی سرور جلوگیری کرده و تجربه کاربری بهتری فراهم کنید.