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

Что содержится в Allow-Origin заголовке?

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

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

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

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

Что содержится в заголовке Access-Control-Allow-Origin?

Access-Control-Allow-Origin — это один из ключевых заголовков, используемых в механизме CORS (Cross-Origin Resource Sharing), который позволяет веб-страницам получать данные с сервера, расположенного в домене, отличном от того, с которого была загружена сама страница. Этот заголовок отправляется сервером в ответ на кросс-доменный HTTP-запрос и указывает браузеру, разрешено ли текущему источнику (origin) доступ к ресурсу.

Содержимое заголовка

Сервер может задать два основных значения для этого заголовка:

  • Конкретный домен (origin): Например, Access-Control-Allow-Origin: https://example.com. Это разрешает доступ к ресурсу только для запросов, пришедших с указанного источника. Значение должно точно совпадать с origin в заголовке запроса Origin, включая протокол, домен и порт.

  • Значение-шаблон * (звездочка): Access-Control-Allow-Origin: *. Это специальное значение, которое разрешает доступ к ресурсу любому источнику. Важное ограничение: при использовании * нельзя отправлять запросы с учетными данными (т.е. когда в запросе установлен флаг withCredentials: true, что автоматически отправляет куки и HTTP-аутентификацию). Браузер в таком случае заблокирует ответ.

Примеры использования в коде

На стороне сервера (Node.js/Express):

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

// Разрешить доступ только для конкретного домена
app.use((req, res, next) => {
    const allowedOrigin = 'https://myfrontendapp.com';
    if (req.headers.origin === allowedOrigin) {
        res.setHeader('Access-Control-Allow-Origin', allowedOrigin);
    }
    // ... другие CORS-заголовки, например, для учетных данных или методов
    next();
});

// ИЛИ разрешить доступ всем (*) - просто, но не безопасно для запросов с куками
app.use((req, res, next) => {
    res.setHeader('Access-Control-Allow-Origin', '*');
    next();
});

// Для запросов с учетными данными обязательно указываем явный origin
app.use((req, res, next) => {
    const allowedOrigin = 'https://myfrontendapp.com';
    res.setHeader('Access-Control-Allow-Origin', allowedOrigin);
    res.setHeader('Access-Control-Allow-Credentials', 'true'); // Разрешаем куки
    next();
});

На стороне клиента (JavaScript):

// Простой запрос (без учетных данных) к серверу, который разрешает '*'
fetch('https://api.example.com/data')
    .then(response => response.json())
    .then(data => console.log(data));

// Запрос с учетными данными (куками). Сервер ДОЛЖЕН ответить конкретным origin, а не '*'
fetch('https://api.example.com/user', {
    credentials: 'include' // Аналог withCredentials: true в XMLHttpRequest
})
.then(response => response.json())
.then(data => console.log(data));

Обработка браузером

Когда браузер отправляет кросс-доменный запрос (например, через fetch или XMLHttpRequest), он автоматически добавляет к нему заголовок Origin, указывающий источник текущей страницы. Получив ответ от сервера, браузер проверяет заголовок Access-Control-Allow-Origin:

  1. Если заголовка нет или его значение не совпадает с origin запроса (и не равно *, если это допустимо), браузер блокирует доступ к ответу и выбрасывает CORS-ошибку в консоли.
  2. Если совпадение есть — запрос считается успешным, и клиентский код получает доступ к данным ответа.

Значение для Frontend-разработки

  • Отладка: Большинство ошибок CORS, с которыми сталкивается фронтенд-разработчик, связаны именно с неправильной настройкой этого заголовка на бэкенде ("No 'Access-Control-Allow-Origin' header is present").
  • Безопасность: Этот заголовок — важнейший инструмент политики Same-Origin Policy. Он не защищает сервер от прямых обращений (например, через curl или Postman), но предотвращает утечку данных через вредоносные скрипты, выполняющиеся в браузере пользователя.
  • Разработка: На этапе разработки часто используют прокси-серверы (например, в настройках webpack-dev-server) или плагины для браузера, чтобы обойти ограничения CORS для локальных серверов.

Таким образом, Access-Control-Allow-Origin — это прямой и явный способ для сервера сообщить браузеру, с каких веб-приложений разрешено загружать его ресурсы, обеспечивая баланс между функциональностью межсайтовых запросов и безопасностью пользовательских данных.