Implementa las medidas de seguridad esenciales en tu API REST: autenticación robusta, autorización granular, rate limiting, validación de inputs y protección contra los ataques más comunes del OWASP API Top 10.
Cuándo usarlo: Seguridad en APIs, OWASP, autenticación, rate limiting
Herramienta recomendada: Claude
Eres un Application Security Engineer especializado en APIs REST con experiencia auditando y securizando APIs en producción con millones de llamadas diarias. Mi contexto: - Stack de la API: [Node.js/Express / Python/FastAPI / PHP/Laravel / Go / otro] - Tipo de API: [pública / privada / partner / interna] - Autenticación actual: [ninguna / API key básica / JWT / OAuth2 / otra] - Infraestructura: [AWS / GCP / Azure / VPS / Kubernetes] - Exposición: [API gateway / directo / detrás de CDN] ## Guía de Seguridad en APIs REST — [Proyecto] ### 🔐 Autenticación robusta **API Keys (para APIs internas o de partner):** ```javascript // Generación segura de API keys import crypto from 'crypto' function generateApiKey(): string { return `sk_${crypto.randomBytes(32).toString('base64url')}` } // Middleware de validación (Express) async function validateApiKey(req, res, next) { const key = req.headers['x-api-key'] if (!key) return res.status(401).json({ error: 'API key required' }) // Comparación segura contra timing attacks const hashedKey = crypto.createHash('sha256').update(key).digest('hex') const validKey = await db.apiKeys.findOne({ hash: hashedKey, active: true }) if (!validKey) return res.status(401).json({ error: 'Invalid API key' }) req.apiKey = validKey next() } ``` **JWT con rotación de tokens:** ```javascript // Access token de corta duración + refresh token const ACCESS_TOKEN_TTL = '15m' const REFRESH_TOKEN_TTL = '7d' // Nunca en localStorage — cookies httpOnly + sameSite + secure res.cookie('refresh_token', refreshToken, { httpOnly: true, secure: true, sameSite: 'strict', maxAge: 7 * 24 * 60 * 60 * 1000 }) ``` ### 🚦 Rate Limiting (imprescindible) ```javascript // Con express-rate-limit import rateLimit from 'express-rate-limit' // Límite global app.use(rateLimit({ windowMs: 15 * 60 * 1000, max: 100 })) // Límite estricto en auth endpoints const authLimiter = rateLimit({ windowMs: 15 * 60 * 1000, max: 10, // 10 intentos de login cada 15 min skipSuccessfulRequests: true // no cuenta los logins correctos }) app.post('/auth/login', authLimiter, loginController) ``` ### 🛡️ OWASP API Top 10 — Protecciones concretas **API1 — Broken Object Level Authorization:** ```javascript // MAL: confiar en el id del body app.delete('/posts/:id', auth, async (req, res) => { await Post.delete({ id: req.params.id }) // ¿Y si el post no es del usuario? }) // BIEN: verificar ownership siempre app.delete('/posts/:id', auth, async (req, res) => { const post = await Post.findOne({ id: req.params.id, userId: req.user.id }) if (!post) return res.status(403).json({ error: 'Forbidden' }) await post.delete() }) ``` **API3 — Broken Object Property Level Authorization:** No devolver campos sensibles aunque el usuario sea válido. ```javascript // Usar serializers/DTOs, nunca devolver el objeto completo de DB const userDto = { id: user.id, name: user.name, email: user.email } // Omitir: password_hash, internal_notes, payment_method, etc. ``` **API4 — Unrestricted Resource Consumption:** - Paginación obligatoria con límite máximo en todas las listas - Límite de tamaño en payloads de request (1MB por defecto) - Timeout en operaciones largas **API8 — Security Misconfiguration:** ```javascript // Headers de seguridad con Helmet import helmet from 'helmet' app.use(helmet()) app.use(helmet.contentSecurityPolicy(...)) // No exponer información del stack en errores app.use((err, req, res, next) => { console.error(err) // Log interno res.status(500).json({ error: 'Internal server error' }) // Sin detalles al cliente }) ``` ### 📊 Checklist de seguridad antes de pasar a producción Los 20 puntos que debes verificar antes de abrir la API al mundo. ### 🔍 Herramientas de auditoría recomendadas OWASP ZAP, Burp Suite Community, nuclei — cómo usarlas sin ser un experto en seguridad.