[Nginx, CORS] Nginx и CORS

ЦЕЛЬ

Кратко: Обойти CORS с помощью Nginx.

Более развернуто: Сконфигурировать Nginx таким образом, чтобы к определенному endpoint-у были разрешены запросы от стороннего клиентского кода, работающего на другом домене.

ЧТО ТАКОЕ CORS

В целях безопасности браузер старается запрещать клиентскому коду обращаться к ресурсам, расположенным на других доменах.

Это ограничивает возможности мошеннических сайтов, пытающихся отправлять запросы на сайты банков, с целью переслать наши с вами денюжки в свой кошелек.

Такая защита осуществляется при помощи механизма, называемого CORS.

CORS = Cross-Origin Resource Sharing

CORS - это механизм, позволяющий устанавливать правила для кроссдоменных запросов. А именно, позволяющий задавать, с каких доменов/портов (отличных от своего собственного) запросы к ресурсу разрешены, а какие запрещены.

КАК CORS БЛОКИРУЕТ ЗАПРОСЫ

Следит за нашей с вами безопасностью браузер.

Если браузер видит, что клиентский код сделал запрос к ресурсу другого домена, браузер запрещает клиентскому коду прочитать ответ, кидая ему вместо ответа ошибку.

Как же сделать, чтобы браузер разрешил клиентскому коду прочитать ответ? Для этого есть простой механизм, опирающийся на HTTP/HTTPS заголовки.

Если браузер видит в ответе кросдоменного запроса, заголовок

Access-Control-Allow-Origin my.client.domain

где my.client.domain - родной домен клиента, то браузер расслабляет булки, и позволяет клиенту прочитать ответ.

Или, например

Access-Control-Allow-Origin *

означает, что ресурс разрешает запросы с любых доменов.

Установить такой заголовок должен сервер ресурса, к которому происходит запрос. Это логично с точки зрения безопасности: если ресурс специально устанавливает заголовок, указывающий, что он не против обращений со сторонних доменов, значит он (ресурс) не переживает за последствия и к нему обращаться можно.

Стоит заметить, что использование

Access-Control-Allow-Origin *

является плохой практикой. Более того, ряд фреймворков (например, в том числе Spring Boot) вообще запретят так выстрелить себе в ногу и подвергнуть свое приложение опасности.

ОБХОД CORS НА УРОВНЕ NGINX

Продемонстрируем на примере, как можно с помощью nginx разрешить кросдоменные запросы к определенному endpoint-у:

Делается это просто: при помощи директивы add_header, которая добавляет в ответ нужный заголовок.

location /api/my/enabled/endpoint {
    add_header Access-Control-Allow-Origin *;
}

Теперь во все ответы на запросы к URN /api/my/enabled/endpoint будут добавляться заголовки Access-Control-Allow-Origin **, что позволит сторонним сервисам или клиентскому коду беспрепятственно обращаться к ендпоинту /api/my/enabled/endpoint*

Цель достигнута. Наши поздравления!