In real enterprises:
APIs are reused far beyond their original scope
"Temporary" shortcuts become permanent contracts
Security decisions made early are multiplied across dozens of integrations
What starts as convenience slowly turns into exposure.
Let's walk through the most common security lapses I see in production — and why they matter.
1. "Internal API" Is Treated as a Security Strategy
An API is deployed behind a VPN or VPC. Authentication is minimal. Sometimes skipped entirely.
The reasoning is familiar:
"Only internal teams will use it."
Six months later, that same API:
- Is reused by a new frontend
- Is exposed through another experience API
- Is shared with a partner
The LEGO piece was never designed to be public but now it is.
Problem: network boundaries change, API contracts persist. Fix: every API must authenticate and authorize, regardless of where it lives.
2. One Client ID to Access Everything
To simplify onboarding, teams reuse the same credentials:
- One client ID
- Broad access
- Multiple APIs across layers
"It works beautifully until it doesn't"
One leaked token now provides access to:
- System APIs
- Process orchestration
- Business-critical data
This is not a breach scenario. It's a blast-radius problem.
One master key opens every storage box, including the restricted ones.
3. APIs Returning More Data Than Agreed
This is one of the most underestimated risks.
An API contract might say it returns:
- Name
- Status
- Summary
But the actual response includes:
- Internal IDs
- Flags
- Metadata
- Sometimes PII
The UI renders only a few fields.
"Everything else is invisible until someone opens the browser's network inspector."
No hacking required. No exploit needed.
The API simply over-shares by design.
Once data is in the response, you've already lost control of it.
4. Experience APIs Mirror Backend Reality
Instead, many simply forward backend responses.
"Experience APIs are meant to shape data for intent."
Why?
- Faster development
- Fewer transformations
- "We might need it later"
The result:
- Backend schemas leak outward
- Internal fields become external contracts
- Changes become risky and slow
Instead of handing over one piece, you give away the entire box.
5. Input Validation Is Delegated, Not Enforced
Schemas exist in RAML, in documentation, in someone's head.
At runtime?
- Payloads are trusted
- Headers go unchecked
- Query params pass through
The assumption:
"The UI will send correct data."
Production traffic always disproves this.
Security and stability begin with rejecting bad input early.
6. Rate Limiting Comes After the Outage
APIs perform well under expected load.
"Rate limiting is not about attackers. It's about protecting systems from misuse intentional or not."
Then
- A batch job loops
- A consumer retries aggressively
- A spike hits unexpectedly
Without rate limits:
- Backend systems take the hit
- Integration layers amplify the damage
7. Errors Reveal More Than They Should
Verbose error messages feel helpful during development. In production, they become documentation for attackers.
"Consumers don't need to know how something failed only that it failed."
Stack traces, backend messages, and internal identifiers expose:
- Technology choices
- Integration patterns
- Weak points