Cómo Proteger tu API del Acceso No Autorizado

Las APIs gestionan el 71% de todo el tráfico web actual, sin embargo, el 78% de los ataques tienen éxito después de la autenticación. Si dependes únicamente de claves API o autenticación básica, tu API permanece vulnerable al acceso no autorizado, filtraciones de datos e interrupciones del servicio.
Este artículo cubre las prácticas de seguridad esenciales que todo desarrollador necesita: métodos de autenticación adecuados (JWT, OAuth 2.0), controles de autorización (RBAC), limitación de tasa, validación de entrada, cifrado e implementación de gateway API. Aprenderás cómo construir defensas en capas que funcionan juntas para prevenir el acceso no autorizado, incluso cuando los atacantes tienen credenciales válidas.
Puntos Clave
- Implementa JWT u OAuth 2.0 para una autenticación robusta más allá de simples claves API
- Utiliza Control de Acceso Basado en Roles (RBAC) para gestionar permisos eficientemente
- Aplica limitación de tasa para prevenir abusos y ataques DoS
- Valida todos los datos de entrada contra esquemas estrictos para bloquear ataques de inyección
- Exige cifrado HTTPS/TLS para todos los endpoints de la API
- Despliega un gateway API para gestión centralizada de seguridad
Autenticación: Tu Primera Línea de Defensa
Autenticación JWT para Seguridad Sin Estado
Los JSON Web Tokens (JWT) proporcionan autenticación sin estado ideal para sistemas distribuidos y microservicios. A diferencia de la autenticación basada en sesiones, los JWT contienen toda la información necesaria dentro del propio token.
// Generate JWT with proper security claims
const jwt = require('jsonwebtoken');
function generateToken(user) {
return jwt.sign(
{
sub: user.id,
scope: user.permissions,
exp: Math.floor(Date.now() / 1000) + (15 * 60) // 15 minutes
},
process.env.JWT_SECRET,
{ algorithm: 'HS256' }
);
}
Prácticas críticas de seguridad JWT:
- Establece tiempos de expiración cortos (15-30 minutos)
- Usa secretos fuertes generados aleatoriamente
- Valida el algoritmo explícitamente para prevenir ataques de confusión de algoritmos
- Implementa rotación de tokens de actualización para sesiones de larga duración
OAuth 2.0 para Acceso de Terceros
OAuth 2.0 sobresale cuando necesitas autorización delegada, permitiendo que aplicaciones de terceros accedan a tu API sin compartir credenciales. Usa OAuth 2.0 con la extensión PKCE (Proof Key for Code Exchange) para aplicaciones móviles y SPAs para prevenir la interceptación del código de autorización.
Autorización: Controlando Qué Pueden Hacer los Usuarios
Implementar Control de Acceso Basado en Roles (RBAC)
La autenticación verifica la identidad; la autorización determina los permisos. RBAC asigna permisos a roles en lugar de usuarios individuales, simplificando la gestión de acceso.
const permissions = {
admin: ['read', 'write', 'delete'],
editor: ['read', 'write'],
viewer: ['read']
};
function authorize(requiredPermission) {
return (req, res, next) => {
const userPermissions = permissions[req.user.role];
if (!userPermissions?.includes(requiredPermission)) {
return res.status(403).json({ error: 'Insufficient permissions' });
}
next();
};
}
Aplica el principio de mínimo privilegio: otorga solo el acceso mínimo necesario para cada rol.
Discover how at OpenReplay.com.
Limitación de Tasa: Previniendo Abusos y Ataques DoS
La limitación de tasa protege contra ataques de fuerza bruta, intentos de DoS y agotamiento de recursos. Implementa límites escalonados basados en roles de usuario o niveles de suscripción.
const rateLimit = require('express-rate-limit');
const limiter = rateLimit({
windowMs: 60 * 1000, // 1 minute
max: 100, // requests per window
standardHeaders: true, // Return rate limit info in headers
handler: (req, res) => {
res.status(429).json({
error: 'Too many requests',
retryAfter: req.rateLimit.resetTime
});
}
});
Para sistemas distribuidos, usa Redis para compartir contadores de límite de tasa entre instancias.
Validación de Entrada: Deteniendo Ataques de Inyección
Nunca confíes en la entrada del cliente. Valida todos los datos entrantes contra esquemas estrictos para prevenir inyección SQL, XSS y ataques de inyección de comandos.
const Ajv = require('ajv');
const ajv = new Ajv();
const userSchema = {
type: 'object',
properties: {
email: { type: 'string', format: 'email' },
age: { type: 'integer', minimum: 18, maximum: 120 }
},
required: ['email'],
additionalProperties: false // Prevent mass assignment
};
const validate = ajv.compile(userSchema);
if (!validate(req.body)) {
return res.status(400).json({ errors: validate.errors });
}
Cifrado: Protegiendo Datos en Tránsito
Usa Siempre HTTPS/TLS
Exige HTTPS para todos los endpoints de la API, sin excepciones. Usa TLS 1.3 cuando sea posible e implementa encabezados HTTP Strict Transport Security (HSTS) para prevenir ataques de degradación.
app.use((req, res, next) => {
res.setHeader('Strict-Transport-Security', 'max-age=31536000; includeSubDomains');
next();
});
Seguridad del Gateway API: Protección Centralizada
Un gateway API como Kong, AWS API Gateway o Tyk proporciona un punto de control único para políticas de seguridad. Los gateways gestionan:
- Autenticación y autorización
- Limitación de tasa y throttling
- Transformación de peticiones/respuestas
- Registro y monitoreo
- Protección DDoS
Este enfoque centralizado simplifica la gestión de seguridad y asegura la aplicación consistente de políticas en todos los endpoints.
Errores Comunes de Seguridad a Evitar
Nunca almacenes secretos en código frontend. Las claves API, tokens y credenciales en JavaScript del lado del cliente son visibles para cualquiera que inspeccione el código.
No dependas únicamente de CORS para seguridad. CORS previene que los navegadores hagan peticiones no autorizadas, pero no protege contra llamadas API directas desde herramientas como Postman o curl.
Evita exponer servicios internos directamente. Siempre enruta el tráfico externo a través de un gateway API o proxy inverso que aplique políticas de seguridad.
No uses tokens de larga duración sin rotación. Implementa mecanismos de actualización de tokens e invalida tokens al cerrar sesión o ante actividad sospechosa.
Construyendo Seguridad API en Capas
Ninguna medida de seguridad única proporciona protección completa. La seguridad API efectiva requiere múltiples capas trabajando juntas:
- Autenticación verifica la identidad
- Autorización controla el acceso
- Limitación de tasa previene abusos
- Validación de entrada bloquea datos maliciosos
- Cifrado protege datos en tránsito
- Gateways API centralizan controles de seguridad
Cada capa compensa posibles debilidades en las demás. Cuando un atacante supera una defensa, la siguiente capa lo detiene.
Conclusión
Proteger tu API del acceso no autorizado requiere más que simplemente agregar autenticación. Al implementar autenticación JWT u OAuth 2.0, autorización RBAC, limitación de tasa, validación de entrada, cifrado HTTPS y seguridad de gateway API, creas un sistema de defensa robusto que protege contra amenazas externas y riesgos internos.
Comienza con lo básico: HTTPS, autenticación y limitación de tasa, luego agrega progresivamente capas según tu perfil de riesgo. Recuerda: la seguridad no es una implementación única, sino un proceso continuo que evoluciona con tu API y el panorama de amenazas.
Preguntas Frecuentes
La autenticación verifica quién es un usuario comprobando credenciales como contraseñas o tokens. La autorización determina qué puede hacer ese usuario autenticado verificando sus permisos. Ambas son esenciales pero sirven propósitos diferentes en la seguridad API.
Los tokens JWT deben expirar entre 15 y 30 minutos para aplicaciones de alta seguridad. Tiempos de expiración más cortos limitan el daño si los tokens se ven comprometidos. Usa tokens de actualización que duren más pero puedan revocarse para mantener sesiones de usuario sin reautenticación frecuente.
Sí, límites de tasa excesivamente restrictivos pueden bloquear usuarios legítimos durante picos de tráfico. Implementa límites escalonados basados en roles de usuario o niveles de suscripción. Monitorea patrones de uso para establecer umbrales apropiados y proporciona mensajes de error claros con información de reintento cuando se alcancen los límites.
No, HTTPS solo cifra datos en tránsito entre cliente y servidor. Aún necesitas autenticación, autorización, validación de entrada y limitación de tasa. HTTPS es esencial pero representa solo una capa en una estrategia integral de seguridad API.
Understand every bug
Uncover frustrations, understand bugs and fix slowdowns like never before with OpenReplay — the open-source session replay tool for developers. Self-host it in minutes, and have complete control over your customer data. Check our GitHub repo and join the thousands of developers in our community.