Коротка відповідь
juniorCross-Origin Resource Sharing (CORS) — це механізм, що дозволяє веб‑сторінці запитувати ресурси з іншого домену, коли сервер відповідає заголовками Access‑Control-Allow-Origin. Під час розробки часто виникають помилки 403/401, коли браузер блокує запит; їх усуває налаштування сервера або проксі, що додають потрібні заголовки. У Node.js це робиться через middleware cors або ручним додаванням заголовків.
Повне пояснення
Що це і навіщо CORS – протокол, що розширює політику безпеки браузера, дозволяючи обмін даними між різними доменами. Без CORS запити з іншого origin блокуються, що обмежує інтеграцію API.
Ключові принципи/терміни
Access-Control-Allow-Origin– визначає, які домени мають доступ.preflight(OPTIONS) – запит, що перевіряє дозволи перед реальним.credentials– включає cookie/HTTP‑auth у запитах.
Як це працює
- Браузер надсилає запит.
- Якщо origin не відповідає заголовкам, браузер блокує відповідь.
- Сервер додає потрібні заголовки, після чого браузер приймає дані.
Практика і реалізація (Node.js/Express)
const cors = require('cors');
app.use(cors({ origin: 'https://example.com', credentials: true }));
app.get('/data', (req, res) => {
res.setHeader('Access-Control-Allow-Origin', '*');
res.json({ msg: 'ok' });
});
Тестування
- Unit: перевірити, що сервер повертає правильний заголовок.
test('CORS header present', async () => {
const res = await request(app).get('/data');
expect(res.headers['access-control-allow-origin']).toBe('*');
});
Безпека
- Не використовуйте
*у production, обмежуйте конкретні домени. - Якщо потрібен доступ з cookie, встановіть
Access-Control-Allow-Credentials: trueі вказуйте конкретний origin.
Оптимізація
- Кешуйте preflight‑запити за допомогою
Access-Control-Max-Age. - Уникайте надмірних заголовків, що збільшують розмір відповіді.
Часті помилки
- Відсутність заголовка
Access-Control-Allow-Origin→ 403. - Невірний формат заголовка (наприклад,
Access-Control-Allow-Origin: https://example.com/) → блокування. - Забудьте про
OPTIONSpreflight, коли використовуєте нестандартні методи.
Cheatsheet
Access-Control-Allow-Origin: *– відкритий доступ.Access-Control-Allow-Credentials: true+ конкретний origin – доступ з cookie.Access-Control-Max-Age: 86400– кеш preflight на 24 години.
Follow‑up питання
- Як обмежити CORS лише для певних маршрутів?
- Які ризики пов’язані з використанням
*у production?