Most Developers Don’t Understand Rate Limiting

Most Developers Don’t Understand Rate Limiting

Rate limiting is one of the most important parts of building a secure and scalable API—but many developers misunderstand or implement it incorrectly.

In this guide, you’ll learn what rate limiting is, why it matters, and how to implement it properly step by step.

Step 1: What is Rate Limiting?

Rate limiting is a technique used to control how many requests a user can send to your API within a specific time period.

Example:

  • 100 requests per minute per user

Step 2: Why Rate Limiting is Important

Without rate limiting, your system is vulnerable to:

  • 🚨 DDoS attacks
  • 🚨 Brute-force login attempts
  • 🚨 API abuse and spam
  • 🚨 Server overload

👉 Rate limiting helps keep your API stable, secure, and fair for all users.

Step 3: Common Mistakes Developers Make

1. No Rate Limiting at All

Your API becomes easy to abuse.

2. Only Global Limits

Example:

  • 1000 requests/minute for entire system

👉 One user can consume all resources.

3. Wrong Status Code

Returning:

200 OK ❌

Instead of:

429 Too Many Requests ✅

4. No Retry Information

Clients don’t know when to try again.

Step 4: Choose a Rate Limiting Strategy

There are 3 common approaches:

🥇 Fixed Window

  • Limit resets every time window (e.g., every minute)
  • Simple to implement

👉 Downside: traffic spikes at reset time

🥈 Sliding Window

  • Tracks requests continuously
  • More accurate and smoother

🥉 Token Bucket

  • Allows small bursts of traffic
  • Best for production systems

Step 5: Choose Storage (Critical Step)

You need fast storage to track request counts.

👉 Best choice: Redis

Why?

  • Extremely fast
  • Supports expiration (TTL)
  • Works across multiple servers

Step 6: Core Logic (How It Works)

Basic flow:

  1. Identify user (IP or user ID)
  2. Check request count
  3. Block if limit exceeded
  4. Otherwise allow request

Example (PHP Pseudo Code)

$key = "rate_limit:" . $userId;

$count = redis()->get($key);

if ($count >= 100) {
return response()->json([
'error' => 'Too many requests'
], 429);
}

redis()->incr($key);
redis()->expire($key, 60);

Step 7: Implement in Laravel

Laravel provides built-in rate limiting.

Simple Implementation

Route::middleware('throttle:100,1')->group(function () {
Route::get('/api/data', [ApiController::class, 'index']);
});

👉 100 requests per minute

Custom Rate Limiter

use Illuminate\Support\Facades\RateLimiter;
use Illuminate\Cache\RateLimiting\Limit;

RateLimiter::for('api', function ($request) {
return Limit::perMinute(100)->by(
$request->user()?->id ?: $request->ip()
);
});

Step 8: Return Proper Response

When limit is exceeded:

Status Code:

429 Too Many Requests

Response:

{
"error": "Too many requests",
"retry_after": 60
}

Step 9: Add Rate Limit Headers

These help frontend developers:

X-RateLimit-Limit: 100
X-RateLimit-Remaining: 0
Retry-After: 60

Step 10: Apply Different Limits

Not all users should have the same limits.

User TypeLimit
Guest50/min
User100/min
Admin500/min

Step 11: Protect Sensitive Endpoints

Apply stricter limits on:

  • Login
  • OTP verification
  • Password reset

Example:

Route::post('/login')->middleware('throttle:5,1');

Step 12: Use Server-Level Rate Limiting

Application-level protection is not enough.

Use tools like:

  • NGINX
  • Cloudflare
  • API Gateways

Step 13: Test Your Implementation

Use tools like:

  • Postman
  • cURL

Test:

  • Send many requests quickly
  • Confirm 429 response
  • Check headers and retry time

⚡ Step 14: Advanced Best Practices

✅ Combine Identifiers

Use:

  • IP + User ID + API Key

✅ Use Exponential Backoff

Retry strategy:

1s → 2s → 4s → 8s

✅ Monitor & Log

Track:

  • Blocked requests
  • Suspicious activity

✅ Use Distributed Systems

Store limits in Redis for multi-server setups.

Step 15: Real-World Mistake

“We added rate limiting, but attackers still spammed our API”

Why?

  • Only IP-based limit ❌
  • Attackers rotate IPs

👉 Solution:

  • Combine multiple identifiers

Final Thoughts

Rate limiting is not optional—it’s essential.

If done correctly:

  • ✅ Protects your API
  • ✅ Ensures fair usage
  • ✅ Prevents downtime

If ignored:

  • ❌ Your system will eventually fail
Souy Soeng

Souy Soeng

Hi there 👋, I’m Soeng Souy (StarCode Kh)
-------------------------------------------
🌱 I’m currently creating a sample Laravel and React Vue Livewire
👯 I’m looking to collaborate on open-source PHP & JavaScript projects
💬 Ask me about Laravel, MySQL, or Flutter
⚡ Fun fact: I love turning ☕️ into code!

Post a Comment

CAN FEEDBACK
close