Cross-Origin Resource Sharing, або CORS, це механізм безпеки, реалізований у сучасних веббраузерах, який регулює доступ вебсценаріїв до ресурсів, розташованих на іншому джерелі. Джерело визначається як унікальне поєднання схеми передачі даних, хоста та порту. Цей механізм працює на основі спеціальних HTTP-заголовків відповіді сервера, які вказують браузеру, чи має право завантажений скрипт читати отримані дані.
Важливо розуміти, що обмеження стосуються саме доступу до вмісту відповіді в браузері, а не самого виконання запитів. Простий крос-доменний запит, наприклад метод POST з типом вмісту text/plain, може успішно досягти сервера та виконатися на ньому. Браузер заблокує лише можливість читання результату через JavaScript, якщо сервер не надіслав відповідні дозволи. Через це CORS не може слугувати захистом від підробки міжсайтових запитів.
Для складніших запитів, які використовують методи на кшталт PUT або передають дані у форматі JSON, браузер автоматично застосовує механізм попередньої перевірки. Перед основним запитом надсилається швидкий запит OPTIONS, щоб дізнатися, чи дозволяє сервер такі дії з іншого джерела.
Приклад взаємодії з публічними даними
javascriptfetch("http://localhost:3000/api/public-stats")
.then(response => response.json())
.then(data => console.log(data));У цьому сценарії скрипт, запущений на сторінці з адресою http://localhost:8080, намагається отримати дані з іншого порту. Оскільки це простий GET-запит без передачі файлів cookie чи авторизаційних заголовків, браузер дозволить скрипту прочитати дані, якщо сервер на порту 3000 поверне у відповіді заголовок Access-Control-Allow-Origin зі значенням http://localhost:8080 або із символом зірочки.
Безпечне використання та конфігурація
Для захисту конфіденційних даних ніколи не використовуйте символ зірочки у заголовку дозволу, якщо вашому додатку потрібна автентифікація. Запити з обліковими даними вимагають точного зазначення джерела у відповіді та наявності заголовка Access-Control-Allow-Credentials зі значенням true. Використання зірочки у такому випадку призведе до того, що браузер заблокує доступ до відповіді.
Якщо вашому серверу доводиться динамічно формувати список дозволених джерел на основі заголовка Origin, обов'язково додавайте до відповіді заголовок Vary зі значенням Origin. Це запобігає ситуації, коли проміжний кеш або проксі-сервер повертає збережену відповідь з неправильним дозволеним доменом для іншого користувача.
Пам'ятайте, що CORS є виключно клієнтською технологією захисту. Зловмисники можуть легко обійти ці обмеження, надіславши запит до вашого сервера безпосередньо через консольні утиліти або власні серверні скрипти, тому надійний захист даних завжди повинен реалізовуватися на рівні авторизації самого API.
