Darslik · 2026-01-18 · ~2 daqiqa o‘qiladi · o'rta
Rate limiting: API'ni suiiste'moldan himoyalash
API ochiq bo‘lsa, kimdir undan haddan tashqari foydalanadi — bilib yoki bilmay. Rate limiting har bir mijozga vaqt birligida nechta so‘rov yuborishni cheklaydi. Bu ham xavfsizlik (brute-force himoyasi), ham barqarorlik masalasi.
Nega kerak#
- Brute-force himoyasi — login sahifasiga soniyasiga 1000 urinish qila olmaydi
- Resurslarni himoyalash — bitta mijoz butun serverni band qilib qo‘ymaydi
- Adolatli taqsimot — hamma foydalanuvchiga barobar imkoniyat
Token bucket algoritmi#
Eng keng tarqalgan usul. Har mijozda "chelak" bor, unda tokenlar. Har so‘rov bitta token sarflaydi, tokenlar vaqt bilan to‘ldiriladi. Chelak bo‘shasa — so‘rov rad etiladi.
Redis bilan sodda amalga oshirish:
def is_allowed(user_id, limit=10, window=60):
key = f"rate:{user_id}"
current = redis.incr(key)
if current == 1:
redis.expire(key, window) # oynani boshla
return current <= limit
Bu — daqiqasiga (60s) 10 so‘rov. 11-so‘rov False qaytaradi.
HTTP javobda to‘g‘ri xabar berish#
Chegara oshganda 429 Too Many Requests qaytaring va qachon qayta urinish
mumkinligini ayting:
if not is_allowed(user_id):
return JsonResponse(
{"error": "Juda ko‘p so‘rov. Biroz kuting."},
status=429,
headers={"Retry-After": "60"},
)
Amaliy maslahatlar#
- Login va parol tiklash kabi sezgir endpointlarga qattiqroq chegara qo‘ying.
- Chegarani IP + foydalanuvchi bo‘yicha hisoblang — faqat IP yetarli emas (bitta NAT ortida ko‘p foydalanuvchi bo‘lishi mumkin).
- Production'da tayyor yechim ishlating: Nginx
limit_req, yoki Django uchundjango-ratelimit.
Rate limiting — kichik kod, katta himoya. Har bir ommaviy API'da bo‘lishi shart.