Ответ
CORS (Cross-Origin Resource Sharing) — механизм для безопасного междоменного взаимодействия. Основные заголовки:
Запрос (Request):
Origin— указывает домен, с которого пришел запрос (например,Origin: https://example.com).
Ответ (Response):
Access-Control-Allow-Origin— разрешенные домены (*для всех или конкретный домен).Access-Control-Allow-Methods— разрешенные HTTP-методы (GET, POST и т.д.).Access-Control-Allow-Headers— разрешенные заголовки запроса.Access-Control-Allow-Credentials— разрешает передачу кук/авторизации (true/false).Access-Control-Expose-Headers— заголовки, доступные клиенту.Access-Control-Max-Age— время кеширования preflight-запроса (в секундах).
Пример ответа сервера:
Access-Control-Allow-Origin: https://example.com
Access-Control-Allow-Methods: GET, POST, OPTIONS
Access-Control-Allow-Headers: Content-Type, Authorization
Access-Control-Allow-Credentials: true Ответ 18+ 🔞
А, вот эта хуйня с CORS! Ну что за пиздец, каждый раз как в первый раз. Слушай сюда, сейчас разжую.
Представь, что твой браузер — это такой ебучий параноик-охранник на проходной. Сидит он на frontend.com и думает: «Хм, скрипт хочет сходить на api.backend.com... А не пиздит ли он?» И начинает этот ёбаный кросс-доменный допрос, это и есть CORS.
Когда скрипт лезет куда не надо (Request), он кричит:
Origin: https://frontend.com— «Я с этой хаты, честно-пречестно!»
А сервер (api.backend.com), если он не конченный мудак, должен ответить списком разрешений:
Ответ сервера (Response) — это как пропуск:
Access-Control-Allow-Origin: https://frontend.com— «Ладно, пускай этот конкретный сайт заходит». Можно и*написать, но это как кричать «Проходите, все, кому не лень!» — для серьёзных дел не годится.Access-Control-Allow-Methods: GET, POST, OPTIONS— «Можешь вот этими методами тыкать».Access-Control-Allow-Headers: Content-Type, Authorization— «И вот такие бумажки (заголовки) в запросе принимаю».Access-Control-Allow-Credentials: true— Это самое интересное! Это как разрешить проходить с ебучей корпоративной кружкой (куками, авторизацией). Но если этоtrue, то вAllow-Originнельзя писать*, только конкретный домен! Иначе охранник (браузер) скажет: «Ну ты, блядь, совсем? И куки тащить, и всем разрешать? Иди нахуй».Access-Control-Expose-Headers— «Вот эти служебные заголовки из моего ответа можешь посмотреть, остальные — пошёл нахуй».Access-Control-Max-Age: 86400— «Запросы на предварительную проверку (preflight) можешь не слать каждый раз, кешируй на сутки».
А, ну и пример, как это выглядит, когда сервер не мудак и настроил всё правильно:
Access-Control-Allow-Origin: https://example.com
Access-Control-Allow-Methods: GET, POST, OPTIONS
Access-Control-Allow-Headers: Content-Type, Authorization
Access-Control-Allow-Credentials: true
Вот и вся магия. А если не настроил — получаешь в консоли браузера ошибку, от которой волосы дыбом, и начинаешь гуглить, материться и проклинать тот день, когда решил стать фронтендером.