🎨 Sysprovider Code
Sysprovider LogoWiki
🇪🇸Hosting español para ecommerce

Seguridad en APIs REST y GraphQL: Protección de Microservicios

Actualizado el 25 de marzo de 2026

El Nuevo Campo de Batalla: APIs y Microservicios

La arquitectura de microservicios ha transformado la forma en que construimos software, permitiendo escalabilidad, agilidad y despliegues independientes. Sin embargo, esta descentralización trae consigo una superficie de ataque masiva. Cada microservicio expone uno o varios puntos finales (endpoints) a través de APIs, ya sean RESTful o GraphQL. Proteger estas puertas de enlace no es una opción; es una necesidad crítica de ciberseguridad. Un fallo en la seguridad APIs puede exponer datos sensibles, permitir la ejecución remota de código o desencadenar un ataque de denegación de servicio (DoS) que paralice todo el ecosistema.

En este artículo, profundizaremos en las vulnerabilidades específicas de REST y GraphQL, y en las estrategias de defensa para microservicios. Abordaremos desde la autenticación descentralizada hasta la limitación de consultas, pasando por la gestión de secretos y el monitoreo continuo.

Diferencias Clave en la Superficie de Ataque: REST vs. GraphQL

Antes de aplicar defensas, debemos entender cómo atacan los adversarios a cada protocolo.

REST: El Riesgo de la Verbosidad y el Estado

REST es el estándar más extendido. Su principal vulnerabilidad radica en la sobreexposición de datos y la gestión de estados.

  • Exposición de IDs secuenciales: Es común que los endpoints REST expongan IDs autoincrementales (/users/1234). Esto facilita ataques de enumeración de recursos.
  • Verbose Errors: Los mensajes de error detallados (stack traces, nombres de tablas) son una mina de oro para un atacante.
  • Falta de control granular: Un endpoint GET /api/user puede devolver 50 campos, aunque el frontend solo necesite 5. Esto sobrecarga la red y expone datos innecesarios.
  • Inyecciones (SQL, NoSQL, OS Command): Los parámetros de consulta y los cuerpos de las peticiones son vectores clásicos de inyección si no se sanearan.

GraphQL: El Riesgo de la Flexibilidad Ilimitada

GraphQL permite al cliente solicitar exactamente los datos que necesita. Esta flexibilidad es su mayor fortaleza y, a la vez, su mayor debilidad.

  • Ataques de Complejidad de Consultas: Un atacante puede enviar una consulta anidada y recursiva (ej: friends { friends { friends { ... } } }) que consuma toda la CPU y memoria del servidor. Esto es un ataque de denegación de servicio (DoS) específico de GraphQL.
  • Exposición de Datos a través del Schema: El schema de GraphQL es introspectable. Si no se deshabilita en producción, un atacante puede conocer toda la estructura de datos disponible.
  • Autorización a nivel de campo: En REST, la autorización suele hacerse a nivel de endpoint. En GraphQL, un resolver puede devolver datos de un campo que el usuario no debería ver, si la lógica de autorización no es granular.
  • Ataques de Batch GraphQL: Enviar múltiples consultas en una sola petición puede eludir los rate limiters tradicionales.

[WARNING] No asumas que tu API es segura solo porque usas HTTPS. El cifrado en tránsito es solo la primera capa. La mayoría de los ataques ocurren a nivel de aplicación.

Estrategias de Defensa para Microservicios

La protección de microservicios requiere un enfoque en capas, desde la puerta de enlace hasta el servicio individual.

1. Autenticación y Autorización Descentralizada (API Gateway + JWT)

En un ecosistema de microservicios, la autenticación no debe replicarse en cada servicio. La solución es un API Gateway que actúe como punto único de entrada.

  • Autenticación: El Gateway valida las credenciales (OAuth2, OpenID Connect) y emite un JSON Web Token (JWT).
  • Autorización: El JWT contiene claims (reclamaciones) como user_id, role y permissions. Cada microservicio extrae estos claims del token para decidir si el usuario puede realizar la acción.
  • Beneficio: Los microservicios no necesitan almacenar sesiones ni consultar una base de datos de usuarios constantemente.

Ejemplo de configuración de un middleware JWT en Node.js (Express):

const jwt = require('jsonwebtoken');

function authenticateToken(req, res, next) {
  const authHeader = req.headers['authorization'];
  const token = authHeader && authHeader.split(' ')[1]; // Bearer TOKEN

  if (token == null) return res.sendStatus(401);

  jwt.verify(token, process.env.ACCESS_TOKEN_SECRET, (err, user) => {
    if (err) return res.sendStatus(403);
    req.user = user;
    next();
  });
}

2. Rate Limiting y Throttling Inteligente

No todos los endpoints son iguales. Un endpoint POST /api/login debe tener un límite mucho más restrictivo que un GET /api/public/info.

  • Rate Limiting por IP y por Usuario: Limita el número de peticiones por segundo/minuto.
  • Rate Limiting por Endpoint: Diferencia entre operaciones costosas (ej: búsquedas complejas) y operaciones ligeras.
  • Para GraphQL: Usa límites de profundidad de consulta (query depth) y límites de complejidad (query cost). Herramientas como graphql-cost-analysis o graphql-query-complexity te permiten asignar un costo a cada campo y rechazar consultas que superen un umbral.

Ejemplo de configuración de rate limiting con Nginx:

http {
    limit_req_zone $binary_remote_addr zone=login:10m rate=5r/m;

    server {
        location /api/login {
            limit_req zone=login burst=2 nodelay;
            proxy_pass http://backend;
        }
    }
}

3. Validación de Entradas y Sanitización Estricta

Es la regla de oro de la seguridad: nunca confíes en la entrada del usuario.

  • Usa Schemas de Validación: Para REST, herramientas como Joi, Zod o Pydantic. Para GraphQL, el propio schema de GraphQL es un validador de tipos, pero debes añadir validación de negocio (ej: una fecha no puede ser anterior al año 2000).
  • Deshabilita la Introspección en Producción: En GraphQL, la introspección permite a los clientes explorar el schema. Desactívala en entornos de producción.
# Ejemplo de una consulta maliciosa que la introspección permite descubrir
query MaliciousIntrospection {
  __schema {
    types {
      name
      fields {
        name
        type {
          name
        }
      }
    }
  }
}

[TIP] En GraphQL, nunca expongas campos que contengan contraseñas, tokens o datos internos en el schema. Usa directivas personalizadas como @auth(requires: ADMIN) para ocultar campos según el rol.

4. Gestión de Secretos y Configuración Segura

Los microservicios necesitan credenciales para conectarse a bases de datos, colas de mensajes y otros servicios. Almacenar estas credenciales en el código fuente o en variables de entorno sin cifrar es un error catastrófico.

  • Usa un Vault: Herramientas como HashiCorp Vault, AWS Secrets Manager o Azure Key Vault permiten almacenar, rotar y auditar el acceso a secretos.
  • Principio de Mínimo Privilegio: Cada microservicio debe tener acceso solo a los secretos que necesita. Un servicio de notificaciones no necesita acceso a la base de datos de usuarios.
  • Rotación Automática: Configura la rotación periódica de claves y tokens.

5. Monitoreo, Logging y Detección de Anomalías

No puedes proteger lo que no ves. Un sistema de monitoreo robusto es esencial para detectar ataques en curso.

  • Centraliza los Logs: Usa ELK Stack (Elasticsearch, Logstash, Kibana) o Loki para agregar logs de todos los microservicios.
  • Define Alertas: Crea alertas para patrones sospechosos:
    • Múltiples intentos de autenticación fallidos desde una misma IP.
    • Consultas GraphQL con alta complejidad.
    • Picos inusuales de tráfico en un endpoint específico.
    • Errores 4xx y 5xx elevados.
  • Auditoría de Cambios: Registra quién y cuándo modificó la configuración de la API o los permisos de acceso.

Lista de Verificación Rápida para Asegurar tus APIs

Para finalizar, aquí tienes una lista de verificación práctica que puedes aplicar hoy mismo:

  • Autenticación: ¿Usas JWT con corta duración y refresh tokens?
  • Autorización: ¿Cada microservicio verifica los claims del token antes de ejecutar una acción?
  • Rate Limiting: ¿Has configurado límites por endpoint y por usuario?
  • GraphQL: ¿Has deshabilitado la introspección en producción?
  • GraphQL: ¿Has implementado límites de profundidad y complejidad de consultas?
  • Validación: ¿Validas y sanearas todas las entradas del usuario?
  • Secretos: ¿Usas un vault para almacenar credenciales?
  • HTTPS: ¿Todo el tráfico entre microservicios está cifrado? (mTLS recomendado)
  • Monitoreo: ¿Tienes alertas configuradas para patrones anómalos?
  • Dependencias: ¿Escaneas regularmente tus librerías en busca de vulnerabilidades conocidas? (Usa Snyk, OWASP Dependency-Check)

[INFO] La seguridad en APIs no es un proyecto de una sola vez. Es un proceso continuo que debe integrarse en el ciclo de vida del desarrollo (DevSecOps). Realiza auditorías periódicas y pruebas de penetración (pentesting) para mantenerte un paso adelante de los atacantes.

Conclusión

Proteger APIs REST y GraphQL en un entorno de microservicios es un desafío complejo pero manejable. La clave está en adoptar un enfoque de defensa en profundidad: combinar un API Gateway robusto, autenticación descentralizada con JWT, rate limiting inteligente, validación estricta de entradas, gestión segura de secretos y monitoreo constante. Tanto REST como GraphQL tienen sus propios vectores de ataque, pero con las herramientas y estrategias adecuadas, puedes construir un ecosistema de microservicios resiliente y seguro. No esperes a que un ataque te obligue a actuar; la proactividad es tu mejor aliada en ciberseguridad.

¿Necesitas ayuda?Son dos de nuestros técnicos, Agustín y Mikel, y están disponibles para resolver cualquier problema.

Hablar con ellos ahora
Agustín y Mikel