По соображениям безопасности браузеры ограничивают кросс‑доменные запросы, инициируемые из скриптов. Это означает, что веб‑приложение может запрашивать ресурсы только со своего источника. Механизм CORS позволяет браузерам отправлять XMLHttpRequest на серверы в других доменах и запрашивать доступ к их ресурсам.
Рисунок 1 Поток процесса механизма CORS

Существует два типа запросов CORS:
- Простые запросы
Простые запросы должны соответствовать следующим условиям:
- Метод запроса — HEAD, GET или POST.
- Заголовок запроса содержит только следующие поля:
- Accept
- Accept-Language
- Content-Language
- Last-Event-ID
- Content-Type (application/x-www-form-urlencoded, multipart/form-data, or text/plain)
В заголовке простого запроса браузеры автоматически добавляют Origin поле, указывающее источник (включая протокол, домен и порт) запроса. После получения такого запроса целевой сервер определяет, безопасен ли запрос и может ли он быть принят на основании источника. Если сервер отправляет ответ, содержащий Access-Control-Allow-Origin поле, сервер принимает запрос.
- Непростые запросы
Запросы, не соответствующие условиям простых запросов, являются непростыми запросами.
Перед отправкой непростого запроса браузеры посылают HTTP preflight‑запрос целевому серверу, чтобы подтвердить, находится ли источник, из которого загружается веб‑страница, в списке разрешённых источников, и чтобы уточнить, какие HTTP‑методы запросов и поля заголовков могут использоваться. Если preflight‑запрос успешен, браузеры отправляют простые запросы на сервер.
Настройка CORS
CORS отключён по умолчанию. Чтобы включить CORS для API, выполните операции, описанные в этом разделе. Чтобы настроить заголовки запросов, методы запросов и разрешённые источники для доступа с разных доменов, создайте политику плагина CORS, ссылаясь на CORS.
- Простые запросы CORS
При создании API включите CORS в Конфигурация безопасности разделе Создать API странице. Для получения дополнительной информации см. Простой запрос.

- Не совсем простые запросы CORS
Не совсем простые запросы CORS могут быть реализованы одним из следующих способов:
- Метод 1: Создать API, который использует OPTIONS метод для предзапроса. Следуйте этой процедуре, чтобы определить API запроса предзапроса. Для подробностей смотрите Not-So-Simple Request.
- Метод 2: Настройте политику CORS и привяжите её к API. Для подробностей смотрите CORS.
- В Frontend Definition области, задайте следующие параметры:
- Метод: Выберите OPTIONS.
- Протокол: Тот же протокол, который используется API с включённым CORS.
- Путь: Введите слеш (/).
Figure 2 Defining the API request

- В Security Configuration area, select None and enable CORS.
- Select the Mock backend type.
Simple Request
When creating an API that will receive simple requests, enable CORS for the API.
Scenario 1: If CORS is enabled and the response from the backend does not contain a CORS header, APIG handles requests from any domain, and returns the Access-Control-Allow-Origin header. For example:
Request sent by a browser and containing the Origin header field:
GET /simple HTTP/1.1Host: www.test.comOrigin: http://www.cors.comContent-Type: application/x-www-form-urlencoded; charset=utf-8Accept: application/jsonDate: Tue, 15 Jan 2019 01:25:52 GMT
Origin: Это поле обязательно для указания источника (http://www.cors.com в этом примере) запроса. APIG и служба бэкэнда определяют на основе origin, безопасен ли запрос и может ли он быть принят.
Ответ, отправленный службой бэкэнда:
HTTP/1.1 200 OKDate: Tue, 15 Jan 2019 01:25:52 GMTContent-Type: application/jsonContent-Length: 16Server: api-gateway{"status":"200"}
Ответ, отправленный APIG:
HTTP/1.1 200 OKDate: Tue, 15 Jan 2019 01:25:52 GMTContent-Type: application/jsonContent-Length: 16Server: api-gatewayX-Request-Id: 454d689fa69847610b3ca486458fb08bAccess-Control-Allow-Origin: *{"status":"200"}
Access-Control-Allow-Origin: Это поле обязательно. Звёздочка (*) означает, что APIG обрабатывает запросы, отправленные с любого домена.
Сценарий 2: Если CORS включён и ответ от бэкэнда содержит заголовок CORS, заголовок перезапишет добавленный APIG. Следующие сообщения использованы в качестве примеров:
Запрос, отправленный браузером и содержащий поле заголовка Origin:
GET /simple HTTP/1.1Host: www.test.comOrigin: http://www.cors.comContent-Type: application/x-www-form-urlencoded; charset=utf-8Accept: application/jsonDate: Tue, 15 Jan 2019 01:25:52 GMT
Origin: Это поле обязательно для указания источника (http://www.cors.com в этом примере) запроса. APIG и backend service определяют на основе источника, безопасен ли запрос и может быть принят.
Ответ, отправленный backend service:
HTTP/1.1 200 OKDate: Tue, 15 Jan 2019 01:25:52 GMTContent-Type: application/jsonContent-Length: 16Server: api-gatewayAccess-Control-Allow-Origin: http://www.cors.com{"status":"200"}
Access-Control-Allow-Origin: указывает, что backend service принимает запросы, отправленные от http://www.cors.com.
Ответ, отправленный APIG:
HTTP/1.1 200 OKDate: Tue, 15 Jan 2019 01:25:52 GMTContent-Type: application/jsonContent-Length: 16Server: api-gatewayX-Request-Id: 454d689fa69847610b3ca486458fb08bAccess-Control-Allow-Origin: http://www.cors.com{"status":"200"}
Заголовок CORS в ответе backend перезаписывает его в ответе APIG.
Not-So-Simple Request
При создании API, который будет получать непростые запросы, включите CORS для API, следуя инструкциям в Configuring CORS, а затем создайте другой API, который будет доступен с использованием метода OPTIONS.
Параметры запроса API, доступного с использованием метода OPTIONS, должны быть заданы следующим образом:
- Группа: Тот же набор, к которому относится API с включённым CORS.
- Метод: Выберите OPTIONS.
- Протокол: Тот же протокол используется API с включённым CORS.
- Путь: Введите слеш (/) или выберите путь, который был установлен для API или соответствует API с включённым CORS.
- Аутентификация безопасности: Выберите Нет. Не требуется аутентификация для запросов, получаемых новым API, независимо от выбранного режима аутентификации безопасности.
- CORS: Включите эту опцию.
Ниже приведены примерные запросы и ответы, отправленные к имитационному бэкенду или от него.
Запрос, отправленный из браузера к API, к которому обращаются с использованием метода OPTIONS:
OPTIONS /HTTP/1.1User-Agent: curl/7.29.0Host: localhostAccept: */*Origin: http://www.cors.comAccess-Control-Request-Method: PUTAccess-Control-Request-Headers: X-Sdk-Date
- Источник: Это поле обязательно для указания источника, откуда был отправлен запрос.
- Access-Control-Request-Method: Это поле обязательно для указания HTTP‑методов, которые будут использоваться последующими простыми запросами.
- Access-Control-Request-Headers: Это поле необязательно и используется для указания дополнительных полей заголовков в последующих простых запросах.
Ответ, отправленный бэкендом: нет
Ответ, отправленный APIG:
HTTP/1.1 200 OKDate: Tue, 15 Jan 2019 02:38:48 GMTContent-Type: application/jsonContent-Length: 1036Server: api-gatewayX-Request-Id: c9b8926888c356d6a9581c5c10bb4d11Access-Control-Allow-Origin: *Access-Control-Allow-Headers: X-Stage,X-Sdk-Date,X-Sdk-Nonce,X-Proxy-Signed-Headers,X-Sdk-Content-Sha256,X-Forwarded-For,Authorization,Content-Type,Accept,Accept-Ranges,Cache-Control,RangeAccess-Control-Expose-Headers: X-Request-Id,X-Apig-Latency,X-Apig-Upstream-Latency,X-Apig-RateLimit-Api,X-Apig-RateLimit-User,X-Apig-RateLimit-App,X-Apig-RateLimit-Ip,X-Apig-RateLimit-Api-AllenvAccess-Control-Allow-Methods: GET,POST,PUT,DELETE,HEAD,OPTIONS,PATCHAccess-Control-Max-Age: 172800
- Access-Control-Allow-Origin: Это поле обязательно. Звёздочка (*) означает, что APIG обрабатывает запросы, отправленные с любого домена.
- Access-Control-Allow-Headers: Это поле обязательно, если оно содержится в запросе. Оно указывает все поля заголовков, которые могут использоваться при кросс‑доменном доступе.
- Access-Control-Expose-Headers: Это поля заголовков ответа, которые могут быть просмотрены при кросс‑региональном доступе.
- Access-Control-Allow-Methods: Это поле необходимо для указания, какие HTTP‑запросы поддерживает APIG.
- Access-Control-Max-Age: Это поле необязательно и используется для указания продолжительности (в секундах), в течение которой результат предварительного запроса остаётся действительным. В течение указанного периода дополнительные предварительные запросы отправляться не будут.
Запрос, отправленный браузером и содержащий заголовок Origin:
PUT /simple HTTP/1.1Host: www.test.comOrigin: http://www.cors.comContent-Type: application/x-www-form-urlencoded; charset=utf-8Accept: application/jsonDate: Tue, 15 Jan 2019 01:25:52 GMT
Ответ, отправленный бэкендом:
HTTP/1.1 200 OKDate: Tue, 15 Jan 2019 01:25:52 GMTContent-Type: application/jsonContent-Length: 16Server: api-gateway{"status":"200"}
Ответ, отправленный APIG:
HTTP/1.1 200 OKDate: Tue, 15 Jan 2019 01:25:52 GMTContent-Type: application/jsonContent-Length: 16Server: api-gatewayX-Request-Id: 454d689fa69847610b3ca486458fb08bAccess-Control-Allow-Origin: *{"status":"200"}