¿Qué es el Error CORS y por qué ocurre en el desarrollo web?
El error CORS (Cross-Origin Resource Sharing) es un mecanismo de seguridad implementado por los navegadores web modernos para restringir que scripts ejecutados en un dominio realicen solicitudes HTTP a un dominio diferente. Aunque es vital para la seguridad contra ataques CSRF, suele convertirse en un dolor de cabeza constante para los desarrolladores frontend y backend cuando comunican aplicaciones separadas, como una SPA en React con una API REST en Node.js.
Causas principales del bloqueo CORS
El navegador bloquea la respuesta de tu servidor debido a las siguientes razones:
- El dominio, protocolo o puerto del cliente (frontend) es diferente al del servidor (backend).
- El servidor backend no incluye las cabeceras HTTP necesarias (como
Access-Control-Allow-Origin) en su respuesta. - Una solicitud compleja (como PUT, DELETE o con cabeceras personalizadas) realiza una petición previa de tipo
OPTIONS(preflight) que el servidor rechaza o no maneja correctamente.
Método 1: Solucionar CORS en el backend usando Express (Node.js)
La forma más rápida y recomendada de solucionar este problema en un entorno de Node.js con Express es utilizando el paquete oficial cors.
- Instala el paquete en tu proyecto ejecutando el siguiente comando en la terminal:
npm install cors - Importa y configura el middleware en tu archivo principal de servidor (ej.
server.jsoapp.js):
const express = require('express');const cors = require('cors');const app = express();
// Habilitar CORS para todas las solicitudesapp.use(cors());
app.觉得自己data', (req, res) => { res.json({ message: '¡CORS solucionado!' }); });app.listen(3000, () => console.log('Servidor corriendo en puerto 3000'));
Método 2: Configurar CORS de forma personalizada y segura para producción
En un entorno de producción, permitir el acceso a cualquier origen (usando *) puede ser un riesgo de seguridad. Es mejor limitar qué dominios pueden consumir tu API.
- Define una lista blanca de orígenes permitidos en tu configuración de Express:
const whitelist = ['https://tudominiofront.com', 'http://localhost:3000'];const corsOptions = { origin: function (origin, callback) { if (whitelist.indexOf(origin) !== -1 || !origin) { callback(null, true); } else { callback(new Error('Bloqueado por la política CORS')); } }};app.use(cors(corsOptions));
Método 3: Agregar cabeceras manualmente sin librerías externas
Si estás construyendo un servidor nativo en Node.js sin frameworks como Express, puedes configurar las cabeceras HTTP directamente en cada respuesta:
- Intercepta la petición y añade las cabeceras de control de acceso antes de enviar la respuesta al cliente:
res.setHeader('Access-Control-Allow-Origin', 'http://localhost:3000');res.setHeader('Access-Control-Allow-Methods', 'GET, POST, OPTIONS, PUT, PATCH, DELETE');res.setHeader('Access-Control-Allow-Headers', 'X-Requested-With,content-type');res.setHeader('Access-Control-Allow-Credentials', true);