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

Существует два типа запросов CORS:
Простые запросы должны соответствовать следующим условиям:
В заголовке простого запроса браузеры автоматически добавляют Origin поле, указывающее источник (включая протокол, домен и порт) запроса. После получения такого запроса целевой сервер определяет, безопасен ли запрос и может ли он быть принят на основании источника. Если сервер отправляет ответ, содержащий Access-Control-Allow-Origin поле, сервер принимает запрос.
Запросы, не соответствующие условиям простых запросов, являются непростыми запросами.
Перед отправкой непростого запроса браузеры посылают HTTP preflight‑запрос целевому серверу, чтобы подтвердить, находится ли источник, из которого загружается веб‑страница, в списке разрешённых источников, и чтобы уточнить, какие HTTP‑методы запросов и поля заголовков могут использоваться. Если preflight‑запрос успешен, браузеры отправляют простые запросы на сервер.
CORS отключён по умолчанию. Чтобы включить CORS для API, выполните операции, описанные в этом разделе. Чтобы настроить заголовки запросов, методы запросов и разрешённые источники для доступа с разных доменов, создайте политику плагина CORS, ссылаясь на CORS.
При создании API включите CORS в Конфигурация безопасности разделе Создать API странице. Для получения дополнительной информации см. Простой запрос.

Не совсем простые запросы CORS могут быть реализованы одним из следующих способов:
Figure 2 Defining the API 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.
При создании API, который будет получать непростые запросы, включите CORS для API, следуя инструкциям в Configuring CORS, а затем создайте другой API, который будет доступен с использованием метода OPTIONS.
Параметры запроса API, доступного с использованием метода OPTIONS, должны быть заданы следующим образом:
Ниже приведены примерные запросы и ответы, отправленные к имитационному бэкенду или от него.
Запрос, отправленный из браузера к 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
Ответ, отправленный бэкендом: нет
Ответ, отправленный 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
Запрос, отправленный браузером и содержащий заголовок 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"}