We use limits to control how many times someone can use an API. This helps keep the system safe and fair for everyone.
Per-user vs per-IP limits in Rest API
Start learning this pattern below
Jump into concepts and practice - no test required
Limit per user: Check user ID or token and count requests. Block or slow down if limit exceeded. Limit per IP: Check IP address of the request. Count requests from that IP. Block or slow down if limit exceeded.
Per-user limits require users to be logged in or identified.
Per-IP limits work even if users are not logged in but can affect many users behind one IP.
if requests_from_user > 1000: block_request()
if requests_from_ip > 5000: block_request()
if requests_from_user > 1000 or requests_from_ip > 5000: block_request()
This program counts requests per user and per IP. It blocks users who send more than 3 requests and blocks IPs with more than 7 requests total.
class RateLimiter: def __init__(self): self.user_counts = {} self.ip_counts = {} self.user_limit = 3 self.ip_limit = 7 def request(self, user_id, ip): self.user_counts[user_id] = self.user_counts.get(user_id, 0) + 1 self.ip_counts[ip] = self.ip_counts.get(ip, 0) + 1 if self.user_counts[user_id] > self.user_limit: return f"User {user_id} blocked: too many requests" if self.ip_counts[ip] > self.ip_limit: return f"IP {ip} blocked: too many requests" return "Request allowed" limiter = RateLimiter() # Simulate requests print(limiter.request('alice', '192.168.1.1')) print(limiter.request('alice', '192.168.1.1')) print(limiter.request('alice', '192.168.1.1')) print(limiter.request('alice', '192.168.1.1')) # Should block user print(limiter.request('bob', '192.168.1.1')) print(limiter.request('carol', '192.168.1.1')) print(limiter.request('dave', '192.168.1.1')) print(limiter.request('eve', '192.168.1.1')) # Should block IP
Per-user limits need a way to identify users, like login or API keys.
Per-IP limits can block many users if they share the same IP, like in offices or schools.
Combining both limits gives better protection and fairness.
Per-user limits control requests based on who is using the API.
Per-IP limits control requests based on where the requests come from.
Using both helps keep the API safe and fair for everyone.
Practice
per-user and per-IP rate limits in REST APIs?Solution
Step 1: Understand per-user limits
Per-user limits count how many requests each user (identified by login or token) makes.Step 2: Understand per-IP limits
Per-IP limits count requests based on the IP address making the request, regardless of user identity.Final Answer:
Per-user limits track requests by user identity; per-IP limits track requests by the requester's IP address. -> Option CQuick Check:
Per-user = user identity, Per-IP = IP address [OK]
- Confusing user identity with IP address
- Thinking per-IP limits block users
- Assuming per-user limits apply only to logged-out users
Solution
Step 1: Identify per-user check
Per-user limits check how many requests a user has made, so the condition should compare requests_from_user to the limit.Step 2: Verify correct syntax
The correct syntax is to compare requests_from_user > limit and block if true.Final Answer:
if requests_from_user > limit: block_request() -> Option AQuick Check:
Check user requests count > limit [OK]
- Using IP variable for per-user limit
- Comparing user or IP directly to limit
- Using equality instead of greater than
requests_per_user = {"alice": 5, "bob": 3}
requests_per_ip = {"192.168.1.1": 10, "10.0.0.2": 2}
user = "alice"
ip = "192.168.1.1"
user_limit = 5
ip_limit = 10
if requests_per_user[user] >= user_limit:
print("User limit reached")
elif requests_per_ip[ip] >= ip_limit:
print("IP limit reached")
else:
print("Request allowed")What will be printed?
Solution
Step 1: Check user request count
requests_per_user["alice"] is 5, which is equal to user_limit (5), so the first if condition is true.Step 2: Determine which print runs
Since the first condition is true, it prints "User limit reached" and skips the rest.Final Answer:
User limit reached -> Option BQuick Check:
5 >= 5 triggers user limit [OK]
- Thinking IP limit triggers first
- Ignoring >= condition
- Assuming else runs when equal
requests_per_ip = {"1.2.3.4": 8}
ip_limit = 10
ip = "1.2.3.4"
if requests_per_ip[ip] > ip_limit:
print("Limit exceeded")
else:
print("Allowed")What is the bug and how to fix it?
Solution
Step 1: Analyze condition logic
The code blocks requests only if requests_per_ip[ip] > ip_limit, so if requests equal ip_limit, it allows the request.Step 2: Fix condition to include equal case
Change > to >= so requests equal to ip_limit also get blocked.Final Answer:
Bug: Uses > instead of >=; fix by changing to >=. -> Option AQuick Check:
Use >= to block at limit [OK]
- Ignoring equal case in condition
- Assuming IP variable type is wrong
- Thinking missing keys cause this bug
Solution
Step 1: Understand combined blocking logic
The request should be blocked if either the user or the IP exceeds their limit, so the condition must use OR.Step 2: Check condition correctness
if requests_per_user[user] > user_limit or requests_per_ip[ip] > ip_limit: block_request() uses OR with > comparisons, correctly blocking if user or IP exceeds limits.Final Answer:
if requests_per_user[user] > user_limit or requests_per_ip[ip] > ip_limit: block_request() -> Option DQuick Check:
Block if user OR IP exceeds limit [OK]
- Using AND instead of OR
- Using < instead of >
- Checking equality only
