CORS для API
CORS обеспечивает контролируемый доступ к ресурсам через границы доменов, но требует правильной конфигурации, чтобы избежать рисков безопасности.
Краткое описание
CORS (Cross-Origin Resource Sharing) - это механизм, который позволяет браузерам запрашивать ресурсы с домена, отличного от того, с которого была загружена текущая веб-страница. По умолчанию браузер блокирует такие кросс-оригинальные запросы для защиты от несанкционированного доступа к данным. CORS дает серверам возможность явно указать допустимые источники, методы и заголовки. Правильная конфигурация CORS критически важна для API, используемых браузерными приложениями. Вместе с тем слишком либеральная конфигурация создает уязвимость, позволяя осуществлять кросс-оригинальные атаки. Ключевые концепции включают заголовок Origin, Preflight-запросы, Access-Control-заголовки и различие между простыми и сложными запросами.
Основные компоненты
Same-Origin Policy
Same-Origin Policy - это фундаментальный механизм безопасности браузера. Он предотвращает доступ веб-страницы с одного домена к данным другого домена. Источник определяется протоколом, доменом и портом. Разные поддомены или порты считаются разными источниками.
Origin Header
При кросс-оригинальных запросах браузер отправляет заголовок Origin, указывающий исходный домен. Сервер, основываясь на этом заголовке, решает, разрешить ли запрос. Сервер отвечает заголовком Access-Control-Allow-Origin и другими CORS-заголовками.
Access-Control-Allow-Origin
Этот заголовок определяет, какие источники могут получать доступ к ресурсу. Он может содержать конкретный домен вроде https://app.example.com или * для всех доменов. Подстановочные знаки следует избегать для API с аутентификацией или конфиденциальными данными.
Access-Control-Allow-Methods
Этот заголовок перечисляет разрешенные HTTP-методы для кросс-оригинальных запросов: GET, POST, PUT, DELETE. Браузер может использовать только явно разрешенные методы.
Access-Control-Allow-Headers
Этот заголовок указывает, какие дополнительные заголовки клиент может отправлять в запросе. Стандартные заголовки вроде Content-Type, Accept или Authorization нужно явно разрешить, если они пользовательские.
Access-Control-Allow-Credentials
Этот заголовок разрешает передачу cookies, HTTP-аутентификации или клиентских сертификатов при кросс-оригинальных запросах. Если установлен на true, Access-Control-Allow-Origin не может быть *, а должен указывать конкретный домен.
Preflight Request
При сложных кросс-оригинальных запросах браузер предварительно отправляет OPTIONS-запрос (Preflight). Сервер отвечает разрешенными методами, заголовками и источниками. Только после этого браузер отправляет реальный запрос. Preflight-запросы инициируются методами вроде PUT, DELETE или при использовании пользовательских заголовков.
Простые и сложные запросы
Простые запросы используют GET, HEAD или POST с определенными Content-Types и стандартными заголовками. Они не требуют Preflight. Сложные запросы используют другие методы, пользовательские заголовки или Content-Types и инициируют Preflight.
CORS и риски безопасности
Неправильная конфигурация CORS может привести к несанкционированному доступу. Особенно опасны Access-Control-Allow-Origin: * для API с credentials, динамическое отражение заголовка Origin без валидации и разрешение небезопасных методов. Злоумышленники могут использовать такие ошибки для кражи данных в браузере.
CORS в конфигурации API
CORS обычно конфигурируется в API Gateway, веб-сервере или коде приложения. В Node.js часто используется пакет middleware cors, в Spring Boot есть @CrossOrigin, в ASP.NET Core - UseCors. Независимо от технологии конфигурация должна быть ограничивающей и явной.
Отладка CORS
Ошибки CORS в браузере часто не показывают подробную информацию. Инструменты разработчика браузера и сетевые логи помогают изучить Preflight и основные запросы. Логи на сервере должны регистрировать заголовки Origin и ответы.
Практический пример
Веб-приложение на https://app.example.com получает доступ к API на https://api.example.com. API должен разрешить CORS для этого источника.
Браузер отправляет запрос:
GET /api/v1/profile
Host: api.example.com
Origin: https://app.example.com
Authorization: Bearer TOKEN
Сервер отвечает CORS-заголовками:
HTTP/1.1 200 OK
Access-Control-Allow-Origin: https://app.example.com
Access-Control-Allow-Credentials: true
Access-Control-Allow-Methods: GET, POST, PUT, DELETE
Access-Control-Allow-Headers: Content-Type, Authorization
{
"name": "Max Mustermann",
"email": "max@example.com"
}
При PUT-запросе браузер предварительно отправляет Preflight:
OPTIONS /api/v1/profile
Host: api.example.com
Origin: https://app.example.com
Access-Control-Request-Method: PUT
Access-Control-Request-Headers: Content-Type, Authorization
Сервер отвечает на Preflight:
HTTP/1.1 204 No Content
Access-Control-Allow-Origin: https://app.example.com
Access-Control-Allow-Methods: GET, POST, PUT, DELETE
Access-Control-Allow-Headers: Content-Type, Authorization
Access-Control-Max-Age: 86400
Только потом браузер отправляет реальный PUT-запрос. Таким образом CORS гарантирует, что к API могут обращаться только авторизованные источники.
FAQ: CORS для API
1. Что такое CORS?
2. Что такое Same-Origin Policy?
3. Что такое Preflight Request?
4. Что такое Access-Control-Allow-Origin?
5. Что такое Access-Control-Allow-Credentials?
6. Что такое Origin Header?
7. Какие запросы инициируют Preflight?
8. Почему Access-Control-Allow-Origin: * опасен?
9. Что такое Access-Control-Allow-Methods?
10. Что такое Access-Control-Allow-Headers?
11. Может ли CORS предотвратить атаки на серверы?
12. Что такое Access-Control-Max-Age?
13. Почему CORS работает в Postman, но не в браузере?
14. Что такое динамическое отражение Origin?
15. Как правильно тестировать CORS?
Источники
- https://developer.mozilla.org/docs/Web/HTTP/CORS
- https://owasp.org/www-project-web-security-testing-guide/latest/4-Web_Application_Security_Testing/11-Client-side_Testing/07-Testing_Cross_Origin_Resource_Sharing
- https://fetch.spec.whatwg.org/#cors-protocol
Рекомендуемые книги по безопасности веб-приложений
Если ты хочешь углубить знания о CORS, безопасности веб-приложений и защите API, вот несколько полезных книг:
Keine Bücher für Kategorie "security" gefunden.



