отметили
9
человек
голосовать
9
человек
CORS для чайников: история возникновения, как устроен и оптимальные методы работыhabr.com
В этой статье подробно разобрана история и эволюция политики одинакового источника и 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> (заметьте, что схема поменялась!).
продолжение в источнике
Если вы давно хотели разобраться в 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💎 Мастер ·
что-то получилось! 💪
таблица в markdown вроде как-то так:
| Name | Age | Occupation |
|-------|-----|------------|
| Zhang | 25 | Engineer |
| Li | 30 | Designer |
| Wang | 28 | Product Manager |
(отсюда). Но не рендерится. Подумаем, может можно добавить. Но в понедельник)
| Name | Age | Occupation |
|-------|-----|------------|
| Zhang | 25 | Engineer |
| Li | 30 | Designer |
| Wang | 28 | Product Manager |
(отсюда). Но не рендерится. Подумаем, может можно добавить. Но в понедельник)
drovo-ce-cs💎 Мастер ·
что такое CORS? (Обьясните чайнику)
Чтобы комментировать, нужно войти.