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

Какие настройки нужно указать для получения разрешения на конкретные домены в CORS?

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

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

🐱
claude-haiku-4.5PrepBro AI3 апр. 2026 г.(ред.)

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

CORS Headers для конкретных доменов

Для получения разрешения на обращение к конкретным доменам, на сервере нужно установить CORS-заголовки. Основной заголовок - Access-Control-Allow-Origin.

Основные CORS заголовки

// Пример настройки на бэкенде (Express.js)
const express = require('express');
const app = express();

// 1. Разрешить один конкретный домен
app.use((req, res, next) => {
  res.header('Access-Control-Allow-Origin', 'https://example.com');
  res.header('Access-Control-Allow-Credentials', 'true');
  next();
});

// 2. Разрешить несколько доменов
const allowedOrigins = [
  'https://example.com',
  'https://app.example.com',
  'http://localhost:3000'
];

app.use((req, res, next) => {
  const origin = req.get('origin');
  if (allowedOrigins.includes(origin)) {
    res.header('Access-Control-Allow-Origin', origin);
  }
  next();
});

Полный набор CORS заголовков

// Необходимые заголовки для работы с фронтенда
const corsHeaders = {
  'Access-Control-Allow-Origin': 'https://example.com', // какие домены разрешены
  'Access-Control-Allow-Methods': 'GET, POST, PUT, DELETE, OPTIONS', // какие методы
  'Access-Control-Allow-Headers': 'Content-Type, Authorization', // какие заголовки
  'Access-Control-Allow-Credentials': 'true', // разрешить отправку cookies
  'Access-Control-Max-Age': '3600' // кешировать preflight на 1 час
};

// Пример обработки OPTIONS запроса (preflight)
app.options('/api/*', (req, res) => {
  res.header('Access-Control-Allow-Origin', 'https://example.com');
  res.header('Access-Control-Allow-Methods', 'GET, POST, PUT, DELETE, OPTIONS');
  res.header('Access-Control-Allow-Headers', 'Content-Type, Authorization');
  res.header('Access-Control-Allow-Credentials', 'true');
  res.sendStatus(200);
});

Использование middleware (Express)

const cors = require('cors');

// Простой способ - разрешить все домены
app.use(cors());

// Более безопасный способ - конкретные домены
const corsOptions = {
  origin: function (origin, callback) {
    const allowedOrigins = [
      'https://example.com',
      'https://app.example.com'
    ];
    
    if (!origin || allowedOrigins.includes(origin)) {
      callback(null, true);
    } else {
      callback(new Error('Not allowed by CORS'));
    }
  },
  credentials: true, // разрешить отправку credentials
  methods: 'GET,HEAD,PUT,PATCH,POST,DELETE',
  allowedHeaders: 'Content-Type,Authorization'
};

app.use(cors(corsOptions));

На фронтенде (JavaScript)

// При отправке запроса нужно указать credentials
const response = await fetch('https://api.example.com/data', {
  method: 'GET',
  credentials: 'include', // отправлять cookies
  headers: {
    'Content-Type': 'application/json',
    'Authorization': 'Bearer token'
  }
});

// Или в axios
const instance = axios.create({
  baseURL: 'https://api.example.com',
  withCredentials: true // отправлять cookies
});

instance.get('/data');

Важные моменты

Wildcard ограничение

  • Если использовать Access-Control-Allow-Origin: *, то withCredentials: true не будет работать
  • Нужно явно указывать домен

Preflight запрос

  • Для сложных запросов (POST, PUT, DELETE) браузер автоматически отправляет OPTIONS запрос
  • Сервер должен ответить нужными заголовками

Безопасность

// Правильно - проверять origin
const origin = req.get('origin');
if (whitelist.includes(origin)) {
  res.header('Access-Control-Allow-Origin', origin);
}

// Неправильно - разрешить все
res.header('Access-Control-Allow-Origin', '*');
Какие настройки нужно указать для получения разрешения на конкретные домены в CORS? | PrepBro