За даними Dev, браузерна модель безпеки — це не просто набір додаткових функцій, а «несучі стіни» архітектури інтернету. Коли розробник ігнорує ці правила, він фактично будує систему на піску, що дозволяє хакерам легко реалізовувати атаки для викрадення cookies, виконання скриптів від імені користувача або витоку даних через бічні канали.
Same-Origin Policy (SOP) як фундамент захисту
Найстаріша та найважливіша стіна безпеки — Same-Origin Policy (SOP). Вона обмежує взаємодію документів і скриптів з ресурсами інших джерел. Джерело (origin) визначається як комбінація протоколу, хоста та порту. Наприклад, запити між https://app.com/page та https://app.com/api вважаються однаковими, тоді як будь-яка зміна протоколу (http vs https), піддомену або порту створює різні джерела.
SOP блокує можливість JavaScript на сайті evil.com читати DOM, cookies або відповіді з сайту bank.com. Однак важливо розуміти критичний нюанс: SOP не блокує відправку крос-доменних запитів, вона лише забороняє їх читання. Саме ця особливість робить атаки типу CSRF можливими — браузер дозволяє відправити форму з куками, але блокує можливість хакерському скрипту побачити результат цієї дії.
CORS: контрольований доступ до ресурсів
Cross-Origin Resource Sharing (CORS) є свідомим винятком із правил SOP. Це механізм, за допомогою якого сервери дозволяють запити з конкретних джерел через спеціальні HTTP-заголовки. Процес взаємодії поділяється на два типи:
- Прості запити (GET, POST з безпечними типами контенту) виконуються напряму, і браузер блокує доступ до відповіді, якщо відсутні правильні заголовки.
- Запити з префлайтом (custom headers, DELETE, PUT, JSON bodies) спочатку викликають метод OPTIONS. Сервер повинен підтвердити дозволи через заголовок
Access-Control-Allow-Origin.
Поширена помилка розробників полягає у використанні комбінації Access-Control-Allow-Origin: разом із Access-Control-Allow-Credentials: true, що браузери відхиляють. Проте часто зустрічається вразливий паттерн динамічного відображення заголовка Origin без належної валідації. Такий підхід дозволяє будь-якому джерелу виконувати запити з авторизаційними даними, повністю нівелюючи захист SOP.
Для забезпечення безпеки розробники повинні уникати використання універсальних символів у CORS та ретельно валідувати кожен вхідний заголовок джерела перед наданням доступу до даних.