← Назад к вопросам

Почему сервер может запретить запросы с другого домена?

2.0 Middle🔥 101 комментариев
#JavaScript Core#React

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

🐱
deepseek-v3.2PrepBro AI6 апр. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Почему сервер может запрещать запросы с другого домена?

Основная причина — межсайтовые (кросс-доменные) запросы представляют серьёзную угрозу безопасности, и серверы намеренно их ограничивают через механизмы вроде CORS (Cross-Origin Resource Sharing) и Same-Origin Policy. Это не "просто запрет", а комплексная система защиты, которая предотвращает уязвимости и атаки. Вот ключевые причины и механизмы.

1. Same-Origin Policy (Политика одинакового источника) — фундамент безопасности

Это базовый механизм браузера, который блокирует запросы между разными источниками (origin). "Источник" определяется как комбинация домена, порта и схемы протокола (HTTP/HTTPS). Например:

// Origin: https://example.com:443
// Запрос к https://api.example.com — разные домены, блокируется.
// Запрос к https://example.com/api — одинаковый домен, разрешается.

Политика предотвращает:

  • Чтение данных с другого сайта через JavaScript (например, через XMLHttpRequest или fetch).
  • Межсайтовый скриптинг (XSS) в более изощрённых формах.
  • Утечку конфиденциальных данных (например, если пользователь открыл два сайта одновременно).

Пример: если злоумышленник создаёт сайт evil.com и пытается через JavaScript загрузить данные из bank.com, политика одинакового источника блокирует это, защищая финансовую информацию пользователя.

2. CORS (Cross-Origin Resource Sharing) — контролируемое разрешение

CORS — это стандарт, который разрешает безопасные кросс-доменные запросы, но только если сервер явно соглашается. Сервер "запрещает" запросы, когда не настроил CORS правильно или намеренно ограничивает доступ.

Как это работает:

  • Браузер делает кросс-доменный запрос (например, fetch).
  • Он автоматически добавляет заголовок Origin: https://your-site.com.
  • Сервер проверяет этот заголовок и отвечает:
    • Если разрешает — добавляет заголовок Access-Control-Allow-Origin: https://your-site.com.
    • Если запрещает — не включает этот заголовок или возвращает ошибку (например, 403).

Пример ответа сервера, разрешающего CORS:

HTTP/1.1 200 OK
Access-Control-Allow-Origin: https://your-frontend.com
Access-Control-Allow-Methods: GET, POST, PUT
Access-Control-Allow-Headers: Content-Type, Authorization

Если заголовок Access-Control-Allow-Origin отсутствует или не совпадает с источником запроса, браузер блокирует ответ и выбрасывает ошибку в консоли:

// Ошибка в браузере при запрещённом CORS
fetch('https://api.service.com/data')
  .then(response => response.json())
  .catch(error => console.error('CORS error:', error));
// Результат: "Access to fetch at 'https://api.service.com/data' from origin 'https://your-site.com' has been blocked by CORS policy"

3. Основные причины запрета с точки зрения сервера

  • Защита от CSRF (Cross-Site Request Forgery): если сервер не проверяет источник запроса, злоумышленник может заставить пользователя выполнять действия на другом сайте (например, перевод денег). CORS и проверки источников помогают предотвратить это.
  • Предотвращение утечки API ключей и данных: многие API (особенно приватные) требуют аутентификации через токены. Кросс-доменные запросы могли бы позволить steal эти токены или данные, если их не защищать.
  • Контроль трафика и нагрузки: сервер может ограничивать запросы только для доверенных доменов (например, только для своих фронтенд-приложений), чтобы избежать неавторизованного использования API.
  • Соответствие регуляторным требованиям: в финансах, медицине и других сферах данные должны быть защищены от межсайтового доступа по закону.

4. Практические сценарии и решения для фронтенд-разработчика

Сценарий 1: вы разрабатываете фронтенд на localhost:3000 и пытаетесь запросить API на api.service.com. Сервер запрещает запрос.

Решение: настроить CORS на сервере (backend) для разрешения localhost:3000 или использовать прокси в разработке. Например, в webpack или vite:

// vite.config.js для прокси в разработке
export default {
  server: {
    proxy: {
      '/api': {
        target: 'https://api.service.com',
        changeOrigin: true,
        secure: false,
      }
    }
  }
}

Сценарий 2: вы разместили фронтенд на https://myapp.com и нуждаетесь в доступе к https://api.third-party.com.

Решение: убедитесь, что API стороннего сервиса поддерживает CORS и включает ваш домен в Access-Control-Allow-Origin. Если это ваш сервер — настроить его:

// Пример настройки CORS в Express (Node.js)
const express = require('express');
const cors = require('cors');
const app = express();

app.use(cors({
  origin: 'https://myapp.com', // разрешить только этот домен
  methods: ['GET', 'POST'],
  allowedHeaders: ['Content-Type', 'Authorization']
}));

Сценарий 3: запросы с разных доменов нужны для публичного API (например, открытая библиотека).

Решение: разрешить все домены (осторожно!) или использовать динамическую проверку:

// Разрешить все домены (небезопасно для приватных данных!)
app.use(cors({ origin: '*' }));

// Динамическое разрешение на основе списка доверенных доменов
const allowedOrigins = ['https://trusted-site.com', 'https://another-site.com'];
app.use(cors({
  origin: (origin, callback) => {
    if (!origin || allowedOrigins.includes(origin)) {
      callback(null, true);
    } else {
      callback(new Error('CORS not allowed'));
    }
  }
}));

5. Альтернативные методы при ограничениях CORS

Если сервер не настроен на CORS, иногда используются обходные пути (с ограничениями):

  • JSONP (JSON with Padding) — для GET-запросов через тег <script> (устаревший, небезопасный).
  • Проксирование через свой сервер — фронтенд запрашивает ваш сервер, который уже делает запрос к стороннему API (поскольку серверы не подчиняются Same-Origin Policy).
  • WebSockets — не ограничены CORS, но для другого типа коммуникации.

Вывод

Сервер запрещает запросы с другого домена из соображений безопасности — чтобы предотвратить утечки данных, CSRF, XSS и другие атаки. Это не техническая ошибка, а намеренная защита. Как фронтенд-разработчик, вы должны понимать CORS и Same-Origin Policy, правильно настраивать сервер для безопасного кросс-доменного взаимодействия или использовать альтернативные методы, когда необходимо. В современных приложениях CORS — стандартный и правильный способ контролировать доступ между источниками.

Почему сервер может запретить запросы с другого домена? | PrepBro