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

Можно ли в интернете делать кросс-доменный запрос?

1.7 Middle🔥 171 комментариев
#Браузер и сетевые технологии

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

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

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

Можно ли делать кросс-доменный запрос?

Да, кросс-доменные запросы (Cross-Origin Requests) в интернете возможны, но с строгими ограничениями, накладываемыми политикой CORS (Cross-Origin Resource Sharing) и другими механизмами безопасности браузеров. Без специальной настройки браузеры блокируют такие запросы для защиты пользователей от межсайтовой подделки запросов (CSRF) и утечки конфиденциальных данных.

Основные механизмы для кросс-доменных запросов

  1. CORS (Cross-Origin Resource Sharing)
    Современный стандарт, позволяющий серверу явно разрешать запросы с определённых доменов. Сервер отправляет специальные заголовки в ответе, например:
    • Access-Control-Allow-Origin: https://example.com — разрешает доступ с указанного домена.
    • Access-Control-Allow-Methods: GET, POST, PUT — разрешённые HTTP-методы.
    • Access-Control-Allow-Headers: Content-Type, Authorization — разрешённые заголовки.

Пример кода на стороне сервера (Node.js/Express):

const express = require('express');
const app = express();

app.use((req, res, next) => {
  res.header('Access-Control-Allow-Origin', 'https://client-domain.com');
  res.header('Access-Control-Allow-Methods', 'GET, POST, PUT, DELETE');
  res.header('Access-Control-Allow-Headers', 'Content-Type, Authorization');
  next();
});

app.get('/api/data', (req, res) => {
  res.json({ message: 'Данные доступны для кросс-доменного запроса' });
});

app.listen(3000, () => console.log('Сервер запущен на порту 3000'));
  1. JSONP (JSON with Padding)
    Устаревшая техника, использующая тег <script> для обхода ограничений CORS (работает только для GET-запросов). Сервер возвращает данные в виде вызова функции JavaScript.

Пример клиентского кода:

function handleResponse(data) {
  console.log('Получены данные:', data);
}

const script = document.createElement('script');
script.src = 'https://api.example.com/data?callback=handleResponse';
document.head.appendChild(script);
  1. Прокси-сервер
    Клиент делает запрос на свой домен, а сервер перенаправляет его на целевой домен. Это обходит ограничения браузера, так как запрос выполняется с одного origin.

Пример настройки прокси в Nginx:

location /api/ {
  proxy_pass https://target-domain.com/;
  proxy_set_header Host $host;
}
  1. WebSockets
    Протокол ws:// или wss:// не подчиняется политике CORS, позволяя устанавливать кросс-доменные соединения для реального времени.

Пример установки соединения:

const socket = new WebSocket('wss://another-domain.com/ws');
socket.onmessage = (event) => {
  console.log('Получено сообщение:', event.data);
};

Ограничения и нюансы

  • Предзапросы (Preflight Requests): Для "непростых" запросов (с custom-заголовками, методами кроме GET/POST) браузер отправляет OPTIONS-запрос для проверки разрешений CORS.
  • Учётные данные (Credentials): Для отправки cookies или авторизационных заголовков требуется Access-Control-Allow-Credentials: true и явное указание origin (не *).
  • Статические ресурсы: Изображения, CSS, скрипты могут загружаться кросс-доменно без CORS, но доступ к их содержимому через JavaScript ограничен.

Типичные сценарии использования

  • Микросервисная архитектура, где API расположены на разных поддоменах.
  • Сторонние виджеты и интеграции (карты, платежные системы).
  • CDN (Content Delivery Network) для распространения ресурсов.
  • Мобильные приложения, использующие общий API с веб-клиентом.

Вывод: Кросс-доменные запросы возможны при корректной настройке CORS или использовании альтернативных методов. Однако всегда следует оценивать риски безопасности и применять принцип минимальных необходимых разрешений.

Можно ли в интернете делать кросс-доменный запрос? | PrepBro