Key Takeaways
- Broken Object Level Authorization (BOLA) is the most exploited API vulnerability — always enforce server-side ownership checks.
- API keys alone are not authentication. Use OAuth 2.0 with scoped tokens and short expiration windows.
- Rate limiting is not optional. Without it, credential stuffing and enumeration attacks succeed at scale.
- Never return more data than the client needs. Over-fetching in API responses leads to data leakage.
- Log every API request with sufficient context for forensic analysis and anomaly detection.
Why API Security Matters
APIs have become the primary interface for data exchange in modern applications. From mobile backends to microservices communication, from third-party integrations to public developer platforms, APIs handle the most sensitive operations in your technology stack. According to industry research, API traffic now accounts for over 80% of all web traffic, and API-related breaches have increased year-over-year as organizations expose more functionality programmatically.
The OWASP API Security Top 10 was created specifically to address the unique threat model of APIs. Unlike traditional web applications where the server controls what the user sees, APIs expose raw data and operations directly to the client. This means security controls must be more rigorous, more granular, and more thoroughly tested.
BOLA / IDOR Attacks
Broken Object Level Authorization, also known as Insecure Direct Object Reference (IDOR), occurs when an API endpoint accepts an object identifier from the client and does not verify that the requesting user is authorized to access that specific object. An attacker simply changes the ID parameter to access or modify another user's data.
# Vulnerable: No ownership verification
GET /api/v1/orders/12345
Authorization: Bearer <attacker_token>
# The API returns order 12345 belonging to a different user
# because it only checks "is this a valid token?" not "does this
# user own order 12345?"Prevention strategies: Implement authorization checks at the data access layer, not just the controller. Use the authenticated user's identity to scope all database queries. Avoid exposing sequential numeric IDs — use UUIDs instead to make enumeration harder (though UUIDs alone are not a security control). Write automated tests that attempt cross-user data access.
BOLA is the #1 API threat
Broken Authentication
API authentication failures include weak token generation, missing token expiration, tokens transmitted over unencrypted channels, improper JWT validation (not checking the signature, accepting alg: none), and API keys used as the sole authentication mechanism. Many APIs also fail to implement proper token revocation, meaning compromised credentials remain valid indefinitely.
Best practices: Use OAuth 2.0 with appropriate grant types (authorization code for web apps, client credentials for service-to-service). Issue short-lived access tokens with refresh token rotation. Validate JWT signatures against a known public key. Never accept unsigned tokens. Implement token revocation endpoints and honor them at every service boundary.
Excessive Data Exposure
API developers often return entire database objects in responses, relying on the frontend to filter what gets displayed to the user. This is a dangerous pattern because attackers interact directly with the API, bypassing the frontend entirely. If your /api/users/me endpoint returns the full user record — including hashed passwords, internal roles, and billing information — an attacker gets all of it.
Best practices: Define explicit response schemas for every endpoint. Use serialization layers that whitelist fields rather than blacklist them. Never return sensitive fields like password hashes, internal identifiers, or raw database columns. Implement different response schemas for different authorization levels.
Rate Limiting and Resource Management
Without rate limiting, APIs are vulnerable to brute-force attacks, credential stuffing, enumeration, and denial-of-service. Rate limiting should be applied at multiple levels: per-IP, per-user, per-endpoint, and globally. Resource-intensive operations like file uploads, report generation, and search queries need additional constraints.
# Nginx rate limiting example
limit_req_zone $binary_remote_addr zone=api:10m rate=30r/m;
limit_req_zone $http_authorization zone=user:10m rate=100r/m;
location /api/ {
limit_req zone=api burst=5 nodelay;
limit_req zone=user burst=20 nodelay;
proxy_pass http://backend;
}Best practices: Return 429 Too Many Requests with Retry-After headers. Implement exponential backoff for authentication endpoints. Set maximum request body sizes. Apply timeouts for all external service calls. Use circuit breakers for downstream dependencies.
Function-Level Authorization
Function-level authorization failures occur when administrative or privileged API endpoints are accessible to regular users. This often happens when developers protect the admin UI but forget to protect the underlying API endpoints that the admin UI calls. An attacker discovers these endpoints through API documentation, JavaScript source code, or network traffic inspection.
Best practices: Deny access by default. Implement role-based access control (RBAC) middleware that runs before every handler. Separate admin API routes with distinct authentication requirements. Audit your API routes regularly to ensure every endpoint has explicit authorization rules.
Mass Assignment Prevention
Mass assignment (also called auto-binding) occurs when an API accepts client input and directly maps it to internal data models without filtering. An attacker adds extra fields to a request — like role: admin or verified: true — and the server applies them because the ORM binds all incoming fields automatically.
// Vulnerable: Directly spreading user input into the model
const user = await User.create(req.body);
// Safe: Explicitly pick allowed fields
const { name, email } = req.body;
const user = await User.create({ name, email });Best practices: Define explicit allowlists for writable fields on every endpoint. Use Data Transfer Objects (DTOs) that map request payloads to a constrained set of properties. Never bind request bodies directly to database models. Write tests that attempt to modify protected fields through the API.
Security Headers and Transport Security
API responses should include security headers even though they primarily serve machine clients. Enforce HTTPS everywhere with HSTS. Set appropriate CORS policies (covered in detail in our CORS misconfiguration guide). UseContent-Type validation to prevent content-type confusion attacks. Disable TRACE and other unnecessary HTTP methods.
API Monitoring and Logging
Every API request should be logged with the authenticated identity, IP address, endpoint, request parameters, response code, and response time. This data enables anomaly detection (sudden spikes in 403 responses, unusual data access patterns), forensic investigation after incidents, and compliance audit trails.
Never log sensitive data
API Security Checklist
Use this checklist to audit your API security posture:
- All endpoints enforce authentication and authorization server-side
- Object-level authorization checks verify resource ownership on every request
- Rate limiting is applied per-IP, per-user, and per-endpoint
- Response payloads use explicit field allowlists — no raw database objects
- Input validation rejects unexpected fields and enforces type constraints
- JWT tokens are validated (signature, expiration, audience, issuer)
- CORS policies are restrictive and do not use wildcards for credentialed requests
- All API traffic is encrypted with TLS 1.2+
- API documentation does not expose internal endpoints or deprecated versions
- Every request is logged with sufficient context for security analysis
Test your APIs automatically
Scan Your Applications for These Vulnerabilities
ShieldGraph continuously scans your web applications, APIs, and databases to detect these vulnerabilities before attackers do. Start your free scan today.
Start Free ScanRelated Articles
OWASP Top 10 (2026): The Complete Guide to Web Application Security
14 min read
Vulnerability ResearchCORS Misconfiguration: The Silent Vulnerability Lurking in Your Web Apps
9 min read
Industry ReportsSOC 2 vs PCI DSS: Which Compliance Framework Does Your Business Need?
11 min read
