Slide 5 of 28
Part 1 · What Is It?Slide 5
Slide 5 · Why It Keeps Happening
Rate limits feel like a problem for "later."
Three developer assumptions that leave APIs wide open.
Assumption 1: "We'll add rate limiting before launch"

Rate limiting is infrastructure work. It requires deciding on appropriate limits, implementing a counter store (usually Redis), and testing the behavior under load. Developers building features under deadline pressure defer it. Then the API launches without it, and the deferral becomes permanent.

Assumption 2: "Only real users will call this"

When an API is designed, the mental model is human users clicking buttons at human speeds. An attacker with a script can send thousands of requests per second. The gap between "designed for" and "actually receivable" is enormous. No limit means the API must handle whatever rate an attacker chooses to send.

Assumption 3: "The UI has limits, so the API is fine"

The mobile app only lets you search for 20 results at a time. The web interface has pagination. But the API the app calls — the one an attacker calls directly — has no such constraints. The UI limits only apply to users who use the UI. The API itself accepts any parameters.

The result

APIs that worked fine in testing — where a QA team ran normal usage patterns — collapse under attacker-scale load because the load was never part of the threat model. The API was designed to serve users; it was never designed to defend against bulk consumption.

← Back What's the actual damage? →