Какие знаешь способы обхода CORS со стороны backend

Ответ

  1. CORS Headers – настройка сервера для добавления заголовков Access-Control-Allow-Origin, Access-Control-Allow-Methods и других. Пример для Node.js + Express:
app.use((req, res, next) => {
  res.header('Access-Control-Allow-Origin', '*');
  res.header('Access-Control-Allow-Methods', 'GET, POST, PUT, DELETE');
  next();
});
  1. Proxy-сервер – запросы идут через промежуточный сервер, который добавляет нужные заголовки. Например, Nginx:
location /api {
  proxy_pass http://backend;
  add_header 'Access-Control-Allow-Origin' '*';
}
  1. JSONP – устаревший метод для GET-запросов, где ответ оборачивается в callback-функцию.

  2. Preflight-запросы – сервер должен корректно обрабатывать OPTIONS-запросы для сложных методов (PUT, DELETE и т.д.).

  3. Настройка веб-сервера (Apache/Nginx) – добавление CORS-заголовков на уровне конфигурации сервера.

Ответ 18+ 🔞

Смотри, вот тебе про эту вашу CORS-хуёRS, чтоб ты понимал, как с этим не сойти с ума. Представь, браузер — это такой ебаный параноик в пальто, который каждому скрипту говорит: «Ты куда лезешь, пидор шерстяной? Не в свой дом — не ходи!». И чтобы его успокоить, надо делать вот что:

1. CORS Headers — это как пропуск на границе.
Ты на сервере должен крикнуть браузеру: «Э, сабака сука, этот чувак с другого сайта — свой, пусть проходит!». В Node.js с Express это выглядит примерно так:

app.use((req, res, next) => {
  res.header('Access-Control-Allow-Origin', '*'); // Пускай вообще все, похуй
  res.header('Access-Control-Allow-Methods', 'GET, POST, PUT, DELETE'); // Разрешённые методы
  next();
});

Но если ты поставишь *, то это как сказать «всех пускаю, я щедрый». На деле лучше указать конкретный домен, а то какой-нибудь хитрая жопа с левого сайта тебя обнесёт.

2. Proxy-сервер — это как подставной мужик.
Вместо того чтобы самому лезть в чужой дом, ты шлёшь своего курьера (Nginx), который уже знает все пароли. В конфиге Nginx пишешь:

location /api {
  proxy_pass http://backend;
  add_header 'Access-Control-Allow-Origin' '*';
}

И всё, браузер думает, что запрос идёт в пределах своего домена, а на самом деле тебя уже обслужат где надо. Хуй с горы, а не CORS!

3. JSONP — это старый дед, который ещё помнит IE6.
Работает только для GET-запросов, и выглядит как какая-то пиздопроебибна: ответ приходит обёрнутым в функцию, которую ты заранее объявил. Типа:

callbackFunction({ data: 'тут твои данные' });

Но щас это уже почти никто не использует, потому что это костыль уровня «ебушки-воробушки».

4. Preflight-запросы — это когда браузер сначала стучится: «Можно?».
Если ты шлёшь PUT, DELETE или ещё какую дичь, браузер сначала отправит OPTIONS-запрос, типа «а можно так?». И сервер должен ответить: «Да, можно, хуле». Если не ответит — всё, пиздец, запрос не пройдёт. Надо обрабатывать:

app.options('*', (req, res) => {
  res.header('Access-Control-Allow-Origin', '*');
  res.header('Access-Control-Allow-Methods', 'GET, POST, PUT, DELETE');
  res.send();
});

5. Настройка веб-сервера — чтоб вообще на уровне системы всё работало.
Можно в Apache или Nginx прописать заголовки глобально, и тогда все твои скрипты будут летать как угорелые. В Nginx, например:

add_header 'Access-Control-Allow-Origin' '*';
add_header 'Access-Control-Allow-Methods' 'GET, POST, OPTIONS';

Но опять же — осторожно, а то какой-нибудь полупидор с левого сайта тебе всё сольет.

Короче, суть в том, что CORS — это не ошибка, а просто браузер тебе говорит: «Чувак, я волнение ебать чувствую, ты уверен?». И ты должен его убедить, что всё в ажуре. Либо заголовками, либо проксёй, либо ещё какой хуйнёй. Главное — не паниковать, а то можно и в рот себе чих-пых от безысходности.