vott2.ru
отметили
9
человек
голосовать
CORS для чайников: история возникновения, как устроен и оптимальные методы работыhabr.com
sant, · ред. · Технологии
В этой статье подробно разобрана история и эволюция политики одинакового источника и CORS, а также расписаны разные типы доступа между различными источниками, а также несколько оптимальных решений работы с ними.

Если вы давно хотели разобраться в CORS и вас достали постоянные ошибки, добро пожаловать под кат.

Ошибка в консоли вашего браузера

No ‘Access-Control-Allow-Origin’ header is present on the requested resource.



Cross-Origin Request Blocked: The Same Origin Policy disallows reading the remote resource at https://example.com/



Access to fetch at ‘https://example.com’ from origin ‘https://localhost:3000’ has been blocked by CORS policy.

Я уверен, вам уже доводилось видеть похожие сообщения об ошибках в консоли вашего браузера. Если нет, не волнуйтесь, скоро увидите. Все программисты достаточно часто натыкаются на CORS-ошибки.

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

Но давайте-ка пойдем к истокам…

В начале был первый субресурс

Субресурс — это HTML элемент, который требуется вставить в документ или выполнить в контексте этого документа. В 1993 году был введен первый тег <img>. С появлением веб стал более красивым, но заодно и стал сложнее.

изображение

Как вы поняли, если ваш браузер отображает страницу с <img>, он должен запросить этот тег из источника. Если браузер запрашивает тег из источника, который отличается от получателя по схеме, в полностью определенному имени хоста или порту, то это и есть запрос между различными источниками (cross-origin request).

Источники & cross-origin

Источник идентифицируется следующей тройкой параметров: схема, полностью определенное имя хоста и порт. Например, <https://example.com> и <https://example.com> имеют разные источники: первый использует схему http, а второй https. Вдобавок, портом для http по умолчанию является 80, тогда как для https — 443. Следовательно, в данном примере 2 источника отличаются схемой и портом, тогда как хост один и тот же (example.com).

Таким образом, если хотя бы один из трех элементов у двух ресурсов отличается, то источник ресурсов также считается разным.

Если, к примеру, мы будем сравнивать источник <https://blog.example.com/posts/foo.html> с другими источниками, то мы получим следующие результаты:

URL Результат Причина

https://blog.example.com/posts/bar.html
Объяснить с


Тот же Отличается только путь

https://blog.example.com/contact.html
Объяснить с


Тот же Отличается только путь

https://blog.example.com/posts/bar.html
Объяснить с


Отличен Разные протоколы

https://blog.example.com:8080/posts/bar.html
Объяснить с


Отличен Отличается порт (https:// порт является по умолчанию 443)

https://example.com/posts/bar.html
Объяснить с


Отличен Разный хост

Пример запроса между различными источниками: когда ресурс (то есть, страница) типа <https://example.com/posts/bar.html> попробует отобразить тег из источника <https://example.com> (заметьте, что схема поменялась!).

продолжение в источнике

Комментарии (4)

sant💎 Мастер ·
что-то получилось! 💪
sant💎 Мастер · ↑ ответ
а таблица не получилась! 😂
admin💎 Мастер · ↑ ответ
таблица в markdown вроде как-то так:

| Name | Age | Occupation |
|-------|-----|------------|
| Zhang | 25 | Engineer |
| Li | 30 | Designer |
| Wang | 28 | Product Manager |

(отсюда). Но не рендерится. Подумаем, может можно добавить. Но в понедельник)
drovo-ce-cs💎 Мастер ·
что такое CORS? (Обьясните чайнику)
Чтобы комментировать, нужно войти.