Marcio Cunha

¿CORS bloquea tu API? Cómo resolverlo con un proxy inverso

Desmitifica la política de misma origen del navegador y aprende a configurar un proxy inverso para evitar fallos de CORS en aplicaciones web.

Marcio Cunha•4 min
También disponible en:PortuguêsEnglish
Resumen
  • La política de misma origen impide que sitios maliciosos lean datos sensibles de otras aplicaciones sin autorización explícita.
  • Encabezados como Access-Control-Allow-Origin controlan qué dominios externos tienen permiso para acceder a los recursos de la API.
  • El uso de un proxy inverso centraliza las llamadas de red y enmascara el origen real para evitar bloqueos en el navegador.
  • Configurar redirecciones en Nginx elimina la dependencia de ajustes complejos en el código backend de microservicios.
  • Las herramientas de inspección de red ayudan a diagnosticar fallos de pre-vuelo y validar si los encabezados HTTP responden correctamente.

Qué es la política de misma origen y por qué bloquea peticiones

Cuando desarrollamos aplicaciones web modernas, es común separar el front-end, que se ejecuta en el navegador del usuario, de un back-end aislado en otra dirección. Sin embargo, los navegadores aplican una regla de seguridad estricta llamada Same-Origin Policy, o política de misma origen, que impide que un sitio acceda a recursos de un dominio diferente al que cargó la página original. En la práctica, esto significa que si tu panel está en 'misitio.com', el navegador bloqueará cualquier intento directo de buscar datos en 'api.otreservidor.com' a menos que el servidor de destino indique expresamente que está permitido. Esta barrera protege contra el robo de sesiones y ciberataques, pero frecuentemente frustra a desarrolladores legítimos durante la integración de sistemas.

Entendiendo el mecanismo de CORS y sus trampas

Para flexibilizar esta regla de seguridad sin abrir brechas peligrosas, se creó CORS, abreviatura de Cross-Origin Resource Sharing o compartición de recursos de origen cruzado. Cuando el navegador detecta una petición a otro dominio, envía primero un mensaje oculto de prueba llamado preflight, que utiliza el método HTTP OPTIONS para preguntar al servidor si el intercambio de datos es seguro. Si el servidor responde con los encabezados correctos, como Access-Control-Allow-Origin, la petición real se libera y el usuario puede ver la información en pantalla. El problema surge cuando la API de terceros no envía estos datos o cuando el servidor heredado no puede modificarse para incluir tales permisos, generando errores frustrantes en la consola.

Cómo el proxy inverso resuelve los fallos de CORS de raíz

Una estrategia elegante y muy utilizada por los ingenieros para sortear este bloqueo sin alterar el código de la API es el uso de un proxy inverso, un servidor intermediario que recibe las llamadas del front-end y las reenvía al destino final. En la práctica, el navegador del usuario pasa a ver tanto la aplicación como la API como si estuvieran alojadas bajo el mismo dominio principal, eliminando totalmente la restricción de origen. Dado que la comunicación entre servidores internos no sufre restricciones de los navegadores, el proxy consigue buscar los datos y devolverlos a la interfaz de forma transparente. Para entender mejor cómo proteger y filtrar el tráfico que pasa por esta capa intermedia, vale la pena consultar la guía sobre cómo bloquear IPs maliciosas en Nginx con Fail2Ban, garantizando estabilidad y seguridad.

Configurando una redirección práctica en Nginx

Para llevar esta solución a la práctica usando Nginx, un servidor web de alto rendimiento muy popular en el mercado, necesitamos configurar una regla que capture las llamadas de API y las redirija hacia el servidor real. El fragmento a continuación demuestra cómo interceptar cualquier petición realizada a la ruta '/api/' y reenviarla al backend real, enmascarando el origen y blindando la aplicación contra errores de restricción:

server {
listen 80;
server_name misitio.com;

location /api/ {
proxy_pass https://api.otreservidor.com/;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
}
}

Con esta simple modificación, el navegador cree que se está comunicando únicamente con 'misitio.com/api', mientras que Nginx asume el trabajo pesado de dialogar con el servidor externo y traer la respuesta.

Validando la solución y evitando problemas futuros

Después de aplicar la configuración del proxy inverso, es fundamental probar si la comunicación fluye sin cuellos de botella o fallos silenciosos de red. Abre las herramientas de desarrollo del navegador, accede a la pestaña de red y realiza una nueva petición para asegurarte de que el código de estado HTTP devuelto sea el esperado. Si surgen comportamientos inesperados o caídas de comunicación en tiempo real durante pruebas con flujos asíncronos, puedes consultar el material sobre cómo inspeccionar peticiones WebSocket en DevTools para monitorear el tráfico detalladamente. Mantener esta rutina de validación garantiza que futuros cambios en la infraestructura no rompan la integración entre el front-end y los microservicios.

Consideraciones finales sobre arquitectura y seguridad

Dominar el funcionamiento de la política de misma origen y utilizar proxies inversos de forma inteligente eleva drásticamente la madurez técnica de cualquier equipo de ingeniería de software. Aunque CORS es esencial para la seguridad de la web moderna, entender cómo sortearlo de manera estructurada evita soluciones improvisadas en el código y simplifica el ecosistema de microservicios. Al centralizar el enrutamiento y el manejo de encabezados en una única capa de proxy, se gana flexibilidad operacional y facilidad de mantenimiento a largo plazo, permitiendo que los desarrolladores se enfoquen en lo que realmente importa: entregar valor real al usuario final.