HackproofHacks Logo
HacksproofHacks
Security Assessment • Training • Research
Backend Security

Practical API Security Checklist for Modern Backends

Battle-tested checklist to harden REST and GraphQL APIs against common injection, authentication, and access control vulnerabilities with actionable implementation guidance.

View Training Request Assessment
API Security Layers: Authentication, Authorization, Encryption, and Monitoring
Multi-layered API security approach: encryption in transit, robust authentication, granular authorization, and comprehensive monitoring.

Why APIs Are the New Security Battleground

APIs power modern applications. They're the connective tissue between frontend and backend, between microservices, and between your platform and third-party integrations.

However, APIs are also a prime attack surface. According to recent security research, nearly 33% of API services in production have at least one critical vulnerability. The stakes are high: a single compromised API can expose customer data, enable lateral movement into internal systems, or allow attackers to manipulate business logic.

Unlike traditional web application security, API threats are often silent. There's no user interface to tamper with—just malicious requests that slip past weak authentication, find authorization gaps, and execute unintended actions. This guide provides a battle-tested, actionable checklist to harden both REST and GraphQL APIs before threats find your weaknesses.

1. Authentication & Credential Management

Authentication is the first gate. If attackers bypass it, everything downstream falls.

Enforce OAuth 2.0 and OpenID Connect

OAuth 2.0 is the industry standard for delegated access. It eliminates password sharing and provides granular scope-based permissions. Use OpenID Connect on top of OAuth 2.0 for identity verification. For user-facing applications, this prevents account takeover; for third-party integrations, it prevents wholesale credential exposure.

API Key Management & Rotation

For service-to-service communication, API keys are simpler than OAuth but demand rigorous rotation and revocation policies. Never hardcode keys in source code; use environment variables or secrets management systems.

Real-World Lesson
A major fintech API leaked 4,400 secrets in public GraphQL endpoints. The attack: simple field enumeration combined with missing authentication checks. Verify no sensitive credentials appear in responses.

2. Authorization & Access Control

Authentication answers "Who are you?" Authorization answers "What can you do?" Weak authorization is the top attack vector on APIs.

Implement Role-Based Access Control (RBAC)

Assign permissions based on roles (admin, user, moderator). Define granular permissions: read, write, delete per resource type. Enforce the principle of least privilege—grant only what's necessary.

Prevent Broken Object Level Authorization (BOLA)

BOLA occurs when users can access resources belonging to other users by manipulating IDs. For example, GET /api/users/123 returning data for user 123 when you're logged in as user 456.

❌ Vulnerable code:
@app.get("/api/invoices/{invoice_id}")
def get_invoice(invoice_id: int):
return db.query(Invoice).filter_by(id=invoice_id).first()
✅ Secure code:
@app.get("/api/invoices/{invoice_id}")
def get_invoice(invoice_id: int, user=Depends(get_current_user)):
invoice = db.query(Invoice).filter_by(id=invoice_id, owner_id=user.id).first()
if not invoice: raise HTTPException(status_code=404)
return invoice

3. Input Validation & Injection Prevention

Injection attacks remain the #1 API vulnerability. SQL injection, NoSQL injection, command injection, XML injection—all start with unvalidated input.

Validate All Inputs

Define strict input schemas using libraries like Pydantic (Python), Joi (Node.js), or Zod (TypeScript). Reject unexpected data types, lengths, and formats outright.

Use Parameterized Queries

Never concatenate user input into SQL strings. Use parameterized queries or ORM frameworks that prevent injection by design.

❌ Vulnerable:
query = f"SELECT * FROM users WHERE email = '{email}'"
✅ Secure:
query = "SELECT * FROM users WHERE email = %s"
cursor.execute(query, (email,))

Sanitize & Escape Output

Even with input validation, sanitize output to prevent stored XSS and injection attacks in downstream systems.

4. Transport Security (HTTPS/TLS)

If API traffic is unencrypted, every credential and data payload can be intercepted.

5. Rate Limiting & Denial-of-Service Prevention

Without rate limiting, attackers can brute-force credentials, scrape data, or overwhelm your backend.

Protect GraphQL from Query Bombs

GraphQL's flexibility enables complex queries that can exhaust backend resources. Implement query complexity analysis and depth limits.

6. Sensitive Data Protection

APIs often return sensitive information. Minimize exposure through field masking, encryption, and strict filtering.

7. Logging, Monitoring & Incident Response

You can't defend what you can't see. Comprehensive logging enables detection and forensic analysis.

8. GraphQL-Specific Security

GraphQL introduces unique attack vectors beyond REST. The single endpoint and flexible query structure require specialized defenses.

Disable Introspection in Production

Introspection allows attackers to query the API schema, revealing all available fields and operations. Disable it for production APIs.

Example (Apollo Server):
const server = new ApolloServer({
typeDefs,
resolvers,
introspection: process.env.NODE_ENV !== 'production',
});

Validate Queries Against Schema & Whitelist

Use persistent query whitelisting to allow only pre-approved queries, eliminating ad-hoc attack queries.

Prevent Field-Level Authorization Bypass

Authorization must be enforced at the resolver level, not just at the query entry point. An attacker could request fields they shouldn't access within an authorized query.

✅ Secure resolver pattern:
const user = {
email: async (parent, args, { user }) => {
if (user.id !== parent.id) throw new Error('Unauthorized');
return parent.email;
}
}

9. API Versioning & Deprecation

APIs evolve. Secure versioning prevents breaking changes and ensures legacy endpoints are properly retired.

Quick Reference: API Security Checklist

Category Control Effort Priority
Authentication OAuth 2.0 / JWT with expiry Medium Critical
Authentication API key rotation (90 days) Low Critical
Authorization RBAC + BOLA prevention High Critical
Input Validation Schema validation (Pydantic, Joi) Medium Critical
Input Validation Parameterized queries Low Critical
Transport HTTPS + TLS 1.2+ Low Critical
Transport HSTS header Low High
Abuse Prevention Rate limiting Medium High
Data Protection PII masking & encryption Medium High
Monitoring Centralized logging High High
GraphQL Disable introspection Low High
GraphQL Query complexity limits Medium High

Implementation Strategy: Phase It Right

Don't try to implement everything at once. Prioritize by risk and effort.

Phase 1: Critical (Week 1-2)

  • Enforce HTTPS + HSTS headers
  • Implement JWT authentication with expiry
  • Add input validation schemas
  • Use parameterized queries

Phase 2: High (Week 3-4)

  • Implement role-based authorization
  • Add BOLA checks (resource ownership)
  • Enforce rate limiting
  • Set up centralized logging

Phase 3: Enhanced (Months 2-3)

  • Rotate API keys and implement key management vault
  • Add GraphQL-specific controls (if applicable)
  • Deploy SIEM and anomaly detection
  • Conduct penetration testing

Secure Your APIs Today

Download our API Security Audit Template and run your first security assessment this week. Identify gaps, prioritize fixes, and harden your backend.

Explore Security Training Book API Security Review More Security Guides

References & Further Reading

Deepen your API security knowledge with these authoritative resources.