Что такое CORS в контексте веб-разработки?

Ответ

CORS (Cross-Origin Resource Sharing) — это механизм безопасности браузеров, который использует HTTP-заголовки, чтобы разрешить или запретить веб-приложению, работающему на одном источнике (origin), запрашивать ресурсы с другого источника.

Почему это важно? Браузеры по умолчанию блокируют межсайтовые HTTP-запросы (например, с https://client.com к https://api.example.com) в соответствии с политикой Same-Origin Policy. CORS позволяет серверу явно указать, какие внешние источники могут получать к нему доступ.

Как это работает? Сервер должен включать специальные заголовки в свои ответы:

Access-Control-Allow-Origin: https://client.com
Access-Control-Allow-Methods: GET, POST, PUT
Access-Control-Allow-Headers: Content-Type, Authorization

Пример ошибки в браузере: Access to fetch at 'https://api.example.com/data' from origin 'https://client.com' has been blocked by CORS policy: No 'Access-Control-Allow-Origin' header is present on the requested resource.

Ключевые моменты для тестирования:

  1. Preflight-запросы (OPTIONS): Для "непростых" запросов (например, с кастомными заголовками) браузер сначала отправляет запрос методом OPTIONS, чтобы проверить разрешённые сервером методы и заголовки.
  2. Учёт учётных данных: Запросы с куками или заголовками авторизации требуют дополнительного заголовка Access-Control-Allow-Credentials: true и конкретного указания Access-Control-Allow-Origin (нельзя использовать *).
  3. Кэширование preflight: Заголовок Access-Control-Max-Age позволяет браузеру кэшировать ответ на preflight-запрос.

Ответ 18+ 🔞

А, слушай, про CORS! Это ж та самая хуйня, из-за которой у половины разработчиков волосы на жопе встают дыбом. Представь себе: сидит твой фронтенд на client.com, такой весь из себя красивый, и вдруг решает: «А не сходить ли мне, сука, за данными на `api.example.com»? И тут его нахуй — бац! — браузер блокирует, как будто он воровать собрался.

А всё почему? Потому что браузер — он, блядь, как тот самый занудный охранник в пафосном клубе. У него есть своя политика — Same-Origin Policy. «Ты откуда пришёл? С client.com? А ресурс-то на api.example.com! Иди нахуй, не пущаю!» — вот его логика, в рот меня чих-пых.

Но выход есть, ёпта! Чтобы этого охранника уболтать, сервер должен выдать специальную «прописку», то есть заголовки в ответе. Типа:

Access-Control-Allow-Origin: https://client.com
Access-Control-Allow-Methods: GET, POST, PUT
Access-Control-Allow-Headers: Content-Type, Authorization

Это как сказать: «Охранник, расслабься, я этого парня с client.com знаю, пусть заходит, ему можно GET, POST и PUT, и пусть со своими бумажками (заголовками) проходит».

А если сервер молчит как рыба об лёд, то в консоли браузера ты увидишь классику жанра, от которой хочется ебать мои старые костыли: Access to fetch at 'https://api.example.com/data' from origin 'https://client.com' has been blocked by CORS policy...

Теперь про подводные ебучки, которые всех и добивают:

  1. Preflight-запросы (OPTIONS). Это когда твой запрос не такой уж и простой. С кастомными заголовками там, или методом PUT. Браузер, такой хитрожопый, сначала шлёт «разведчика» — запрос методом OPTIONS. Мол, «а можно к вам так-то и сяк-то?». И если сервер в ответе на этот OPTIONS не нарисовал нужные заголовки — всё, пиздец, основной запрос даже отправлен не будет. Мартышлюшка!

  2. Учёт учётных данных. О, это отдельная песня! Если твой запрос тащит с собой куки или заголовок Authorization (ну, логично же, авторизоваться), то тут уже не отделаешься звёздочкой (*) в Allow-Origin. Нужно явно указать домен и добавить Access-Control-Allow-Credentials: true. Иначе браузер тебе доверия — ноль ебать. «Куки тащишь, а откуда пришёл — скрываешь? Подозрительный тип!»

  3. Кэширование preflight. Чтобы не слать этот ёбаный OPTIONS перед каждым чихом, можно в ответе указать Access-Control-Max-Age. Типа, «браузер, запомни этот ответ на столько-то секунд и не доёбывайся». Но если настройки поменялись, а он закэшировал старое — ну, сам понимаешь, волнение ебать и дебаг на полдня.

Короче, CORS — это не ошибка, это фича. Но фича, которая сделана, чтобы все, блядь, немного пострадали и задумались о безопасности. А то разбегутся эти фронтендеры, запросы куда попало слать!