Skip to content
IRC-CodingIRC-Coding
CORSCross-Origin Resource SharingБезопасность APIPreflightOrigin HeaderWeb Security

CORS для API: безопасная работа с Cross-Origin запросами

Изучите CORS для API: происхождение, Preflight, допустимые заголовки и методы, риски безопасности и best practices.

S

schutzgeist

5 min read
CORS для API: безопасная работа с Cross-Origin запросами

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?

CORS (Cross-Origin Resource Sharing) - это механизм браузера, который позволяет серверам указывать, какие другие домены могут получать доступ к их ресурсам.

2. Что такое Same-Origin Policy?

Same-Origin Policy ограничивает веб-страницы доступом только к ресурсам одного домена. Она защищает от несанкционированного доступа к данным между разными веб-сайтами.

3. Что такое Preflight Request?

Preflight Request - это OPTIONS-запрос, который браузер отправляет перед сложными кросс-оригинальными запросами. Сервер отвечает разрешенными источниками, методами и заголовками.

4. Что такое Access-Control-Allow-Origin?

Access-Control-Allow-Origin указывает, какие источники могут получать доступ к ресурсу. Может быть конкретный домен или подстановочный знак. Подстановочные знаки следует избегать при использовании credentials.

5. Что такое Access-Control-Allow-Credentials?

Access-Control-Allow-Credentials разрешает передачу cookies, HTTP-аутентификации или клиентских сертификатов при кросс-оригинальных запросах. Если установлен на true, Origin Header не может быть *.

6. Что такое Origin Header?

Origin Header отправляется браузером при кросс-оригинальных запросах. Он содержит исходный домен и помогает серверу решить, разрешить ли запрос.

7. Какие запросы инициируют Preflight?

Сложные запросы с методами вроде PUT, DELETE или PATCH, пользовательские заголовки и определенные Content-Types инициируют Preflight. Простые GET, HEAD и POST запросы обычно не инициируют.

8. Почему Access-Control-Allow-Origin: * опасен?

Подстановочный знак разрешает любой источник. Для API с credentials или конфиденциальными данными это может привести к несанкционированному доступу. Лучше использовать явный список разрешенных доменов.

9. Что такое Access-Control-Allow-Methods?

Access-Control-Allow-Methods перечисляет HTTP-методы, разрешенные для кросс-оригинальных запросов, такие как GET, POST, PUT, DELETE.

10. Что такое Access-Control-Allow-Headers?

Access-Control-Allow-Headers указывает, какие дополнительные заголовки клиент может отправлять в кросс-оригинальном запросе. Пользовательские заголовки вроде Authorization часто требуют явного разрешения.

11. Может ли CORS предотвратить атаки на серверы?

Нет, CORS - это механизм браузера, а не защита сервера. Аутентификация, авторизация и валидация входных данных по-прежнему должны обеспечиваться на сервере.

12. Что такое Access-Control-Max-Age?

Access-Control-Max-Age указывает, как долго браузер может кэшировать результат Preflight запроса. Это снижает количество повторных OPTIONS-запросов.

13. Почему CORS работает в Postman, но не в браузере?

Postman и подобные инструменты не применяют CORS, так как они не подчиняются Same-Origin Policy. CORS - это механизм безопасности браузера, который действует только там.

14. Что такое динамическое отражение Origin?

Динамическое отражение Origin означает, что сервер просто возвращает Origin Header клиента. Это небезопасно, так как разрешает любой источник и эквивалентно подстановочному знаку.

15. Как правильно тестировать CORS?

CORS лучше всего тестировать прямо в браузере с разными источниками. Инструменты разработчика показывают Preflight и основные запросы. Также проверьте, не комбинируются ли credentials с подстановочными знаками и правильно ли работает валидация Origin.

Источники

  1. https://developer.mozilla.org/docs/Web/HTTP/CORS
  2. 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
  3. https://fetch.spec.whatwg.org/#cors-protocol

Рекомендуемые книги по безопасности веб-приложений

Если ты хочешь углубить знания о CORS, безопасности веб-приложений и защите API, вот несколько полезных книг:

Keine Bücher für Kategorie "security" gefunden.

Назад к блогу
Share:

Nächster Artikel in Разработка API

Weiterlesen
gRPC, GraphQL и REST: Сравнение 2026

Похожие статьи