Rate Limiting مکانیزمی برای محدود کردن تعداد Requestهایی است که یک Client یا User میتواند در یک بازه زمانی مشخص به API ارسال کند.
هدف اصلی آن محافظت از API در برابر بار زیاد، جلوگیری از Abuse، Brute Force Attack، DoS و مصرف ناعادلانه منابع سیستم است.
مثلاً اگر Contract بگوید:
هر Client حداکثر 100 Request در دقیقه مجاز است.
بعد از درخواست شماره 100، API باید درخواستهای بعدی را تا پایان بازه زمانی رد کند.
Throttling مکانیزمی است که سرعت پردازش Requestها را کنترل میکند. برخلاف Rate Limiting که معمولاً درخواست اضافی را رد میکند، Throttling ممکن است:
درخواست را با تأخیر پردازش کند.
سرعت پاسخ را کاهش دهد.
یا بعد از رسیدن به حد مجاز، درخواست را Reject کند.
بنابراین:
Rate Limiting → محدود کردن تعداد Request
Throttling → کنترل نرخ یا سرعت پردازش Request

اگر Rate Limiting وجود نداشته باشد ممکن است:
یک Client هزاران Request ارسال کند.
منابع Server مصرف شوند.
کاربران عادی نتوانند از سرویس استفاده کنند.
حملات Brute Force روی Login انجام شود.
حملات DoS یا API Abuse رخ دهد.
مهمترین Status Code این سرفصل است.
اگر تعداد Requestها از حد مجاز بیشتر شود، API معمولاً پاسخ زیر را برمیگرداند:
HTTP/1.1 429 Too Many Requests
این Status Code نشان میدهد Client باید مدتی صبر کند و سپس دوباره درخواست ارسال کند.
معمولاً همراه 429 ارسال میشود.
مثال:
Retry-After: 60
یعنی Client باید 60 ثانیه صبر کند.
در تست باید بررسی شود:
Header وجود دارد؟
مقدار آن صحیح است؟
بعد از پایان زمان، API دوباره درخواست را قبول میکند؟
هر IP تعداد مشخصی Request مجاز دارد.
مثال:
100 Requests / Minute / IP
هر کاربر محدودیت جداگانه دارد.
مثلاً:
1000 Requests / Hour / User
هر API Key سهمیه مشخصی دارد.
مثلاً:
5000 Requests / Day / API Key
در APIهای مبتنی بر OAuth2 معمولاً محدودیت بر اساس Access Token اعمال میشود.
در آزمون لازم نیست الگوریتمها را عمیق بدانید، اما نام آنها مهم است.
رایجترین الگوریتمها:
Fixed Window
Sliding Window
Sliding Log
Token Bucket
Leaky Bucket
در سطح آزمون کافی است بدانید:
Token Bucket برای کنترل Burst مناسب است.
Leaky Bucket نرخ خروج Requestها را یکنواخت نگه میدارد.
Backend Tester باید بررسی کند:
قبل از رسیدن به Limit همه Requestها موفق باشند.
دقیقاً بعد از رسیدن به Limit پاسخ 429 برگردد.
Headerهای Rate Limit درست باشند.
بعد از پایان بازه زمانی دوباره Request پذیرفته شود.
Rate Limit فقط روی Client مربوطه اعمال شود.
سایر کاربران تحت تأثیر قرار نگیرند.
بعضی APIها این Headerها را برمیگردانند:
X-RateLimit-Limit: 100 X-RateLimit-Remaining: 5 X-RateLimit-Reset: 1710000123
حداکثر تعداد Request مجاز.
تعداد Request باقیمانده.
زمان Reset شدن محدودیت.
در تست باید بررسی شود این مقادیر درست کاهش پیدا میکنند.
باید تست شوند:
ارسال Request کمتر از Limit
ارسال دقیقاً برابر Limit
ارسال بیشتر از Limit
Reset شدن Limit
چند User همزمان
چند API Key
چند Access Token
Retry بعد از Retry-After
Parallel Requests
Burst Requests
Rate Limiting یکی از کنترلهای مهم امنیتی است.
کاربردها:
جلوگیری از Brute Force Login
جلوگیری از Credential Stuffing
جلوگیری از API Abuse
جلوگیری از DoS
جلوگیری از مصرف بیش از حد منابع
Backend Tester باید بتواند:
رفتار API بعد از رسیدن به Limit را بررسی کند.
429 Too Many Requests را تست کند.
Headerهای مربوط به Rate Limit را اعتبارسنجی کند.
عملکرد Retry-After را بررسی کند.
تفاوت Rate Limiting و Throttling را بداند.
تستهای همزمان (Concurrency) و Burst Traffic طراحی کند.
بررسی کند Rate Limit روی User، Token، API Key یا IP درست اعمال شده است.
در پاسخ امتحانی فقط نگویید:
Rate Limiting یعنی محدود کردن تعداد Requestها.
پاسخ کامل باید این کلیدواژهها را داشته باشد:
429 Too Many Requests, Retry-After, Burst Traffic, API Abuse, Brute Force, DoS, Concurrency, Rate Limit Headers, IP-based Limiting, User-based Limiting, API Key Limiting, Token Bucket, Leaky Bucket
Rate Limiting مکانیزمی برای محدود کردن تعداد Requestهای مجاز در یک بازه زمانی است تا از API Abuse، Brute Force و مصرف بیش از حد منابع جلوگیری شود. در صورت عبور از حد مجاز، API معمولاً 429 Too Many Requests همراه با Retry-After برمیگرداند. Throttling علاوه بر محدودسازی، نرخ پردازش Requestها را نیز کنترل میکند و ممکن است بهجای Reject کردن، درخواستها را با تأخیر پردازش کند. Backend Tester باید رفتار API قبل و بعد از رسیدن به Limit، Headerهای Rate Limit، Reset شدن محدودیت، درخواستهای همزمان و سناریوهای امنیتی را بررسی کند.
Rate Limiting Throttling 429 Too Many Requests Retry-After Rate Limit Burst Traffic API Abuse Brute Force Credential Stuffing DoS Concurrency Rate Limit Headers X-RateLimit-Limit X-RateLimit-Remaining X-RateLimit-Reset Fixed Window Sliding Window Token Bucket Leaky Bucket IP-based Limiting User-based Limiting API Key Limiting Access Token Limiting
Rate Limiting (محدود کردن تعداد Requestهای مجاز در یک بازه زمانی): برای محافظت از API در برابر استفاده بیش از حد، حملات و مصرف ناعادلانه منابع استفاده میشود.
Throttling (کنترل سرعت پردازش Requestها): برای کاهش فشار روی سیستم، درخواستها را با تأخیر پردازش یا در صورت نیاز Reject میکند.
429 Too Many Requests (کد وضعیت عبور از حد مجاز درخواست): زمانی برمیگردد که Client از Rate Limit تعیینشده عبور کرده باشد.
Retry-After (Header تعیینکننده زمان مجاز برای ارسال مجدد Request): معمولاً همراه پاسخ 429 ارسال میشود.
Rate Limit (حداکثر تعداد Request مجاز): مقدار مجاز Requestها در یک بازه زمانی مشخص را تعیین میکند.
Burst Traffic (ارسال ناگهانی تعداد زیادی Request): برای بررسی رفتار API در بار لحظهای و تست Throttling استفاده میشود.
API Abuse (استفاده غیرمجاز یا بیش از حد از API): یکی از اهداف اصلی پیادهسازی Rate Limiting جلوگیری از این رفتار است.
Brute Force (حمله حدس زدن مکرر رمز عبور): Rate Limiting یکی از راهکارهای کاهش این حمله است.
Credential Stuffing (استفاده از نام کاربری و رمزهای افشاشده برای ورود): با محدودسازی تعداد درخواستهای Login کنترل میشود.
DoS (حمله محرومسازی از سرویس): با محدود کردن نرخ درخواستها اثر آن کاهش مییابد.
Concurrency (ارسال همزمان چند Request): برای بررسی عملکرد صحیح Rate Limiting و جلوگیری از Race Condition تست میشود.
Rate Limit Headers (Headerهای نمایش وضعیت سهمیه درخواست): اطلاعات مربوط به Limit، تعداد باقیمانده و زمان Reset را به Client میدهند.
X-RateLimit-Limit (حداکثر Request مجاز): مقدار کل سهمیه Requestها را نشان میدهد.
X-RateLimit-Remaining (تعداد Request باقیمانده): تعداد درخواستهای قابل استفاده تا پایان بازه را نشان میدهد.
X-RateLimit-Reset (زمان Reset شدن سهمیه): زمان شروع مجدد سهمیه Requestها را مشخص میکند.
Fixed Window (الگوریتم محدودسازی با بازه زمانی ثابت): تعداد Requestها را در بازههای زمانی مشخص کنترل میکند.
Sliding Window (الگوریتم محدودسازی با پنجره متحرک): نسبت به Fixed Window دقت بیشتری در محاسبه تعداد Requestها دارد.
Token Bucket (الگوریتم مبتنی بر سطل توکن): امکان Burst محدود را فراهم میکند و برای کنترل نرخ Request بسیار رایج است.
Leaky Bucket (الگوریتم خروج یکنواخت Requestها): نرخ پردازش Requestها را ثابت نگه میدارد.
IP-based Limiting (اعمال Rate Limit بر اساس IP): برای کنترل مصرف هر IP استفاده میشود.
User-based Limiting (اعمال Rate Limit بر اساس کاربر): سهمیه Requestها را برای هر User بهصورت مستقل مدیریت میکند.
API Key Limiting (اعمال Rate Limit بر اساس API Key): برای سرویسهای عمومی و Partner APIها استفاده میشود.
Access Token Limiting (اعمال Rate Limit بر اساس Access Token): در APIهای مبتنی بر OAuth2 برای کنترل مصرف هر Token استفاده میشود.
#APITesting
#RateLimiting
#BackendTesting
#RESTAPI
#SecurityTesting