Где сервер пересылает данные из CORS?
Комментарии (1)
Ответ сгенерирован нейросетью и может содержать ошибки
CORS: Где сервер пересылает данные
CORS (Cross-Origin Resource Sharing) — это механизм безопасности браузера, который контролирует доступ к ресурсам с других доменов. Важно понимать, что CORS работает на уровне браузера и сервера, а не на уровне передачи данных.
Как на самом деле работает CORS
Часто возникает путаница: «Где сервер пересылает данные из CORS?» На самом деле, сервер НЕ пересылает данные из CORS. Вот что происходит:
- Браузер отправляет HTTP-запрос (например, GET, POST)
- Сервер получает и обрабатывает запрос полностью
- Сервер отправляет ответ всё равно, добавив специальные заголовки CORS
- Браузер получает ответ и проверяет CORS-заголовки
- Браузер решает: разрешить ли JavaScript-коду доступ к этим данным
Ключевые CORS-заголовки сервера
Сервер отправляет эти заголовки в Response:
Access-Control-Allow-Origin: https://example.com
Access-Control-Allow-Methods: GET, POST, PUT
Access-Control-Allow-Headers: Content-Type, Authorization
Access-Control-Max-Age: 86400
Access-Control-Allow-Credentials: true
1. Access-Control-Allow-Origin
Указывает, какие источники могут получить доступ к ресурсу:
Access-Control-Allow-Origin: * // Любой источник
Access-Control-Allow-Origin: https://example.com // Конкретный источник
2. Access-Control-Allow-Methods
Перечисляет разрешённые HTTP-методы:
Access-Control-Allow-Methods: GET, POST, PUT, DELETE
3. Access-Control-Allow-Headers
Указывает, какие заголовки запроса разрешены:
Access-Control-Allow-Headers: Content-Type, Authorization, X-Custom-Header
4. Access-Control-Allow-Credentials
Разрешает ли отправку cookies и авторизационных данных:
Access-Control-Allow-Credentials: true
Preflight запрос (OPTIONS)
Для сложных запросов (с кастомными заголовками, методы PUT/DELETE) браузер сначала отправляет preflight-запрос методом OPTIONS:
// Браузер автоматически отправляет OPTIONS запрос ДО POST
fetch("https://api.example.com/users", {
method: "POST",
headers: { "Content-Type": "application/json" },
body: JSON.stringify({ name: "John" })
});
Сервер должен ответить на OPTIONS-запрос:
// Express.js пример
app.options("/users", (req, res) => {
res.header("Access-Control-Allow-Origin", "https://example.com");
res.header("Access-Control-Allow-Methods", "POST, OPTIONS");
res.header("Access-Control-Allow-Headers", "Content-Type");
res.send();
});
Где данные "пересылаются"
Если имеется в виду, через какой путь данные идут:
- Браузер -> Сервер: HTTP-запрос (обычно через интернет)
- Сервер -> Браузер: HTTP-ответ с CORS-заголовками
- Браузер проверяет заголовки и решает, дать ли доступ JS-коду
Типичные CORS ошибки
Access to XMLHttpRequest at https://api.example.com/data
from origin https://myapp.com has been blocked by CORS policy:
No Access-Control-Allow-Origin header is present on the requested resource.
Это означает, что сервер НЕ отправил нужный CORS-заголовок, и браузер заблокировал доступ.
Решение на бэкенде (FastAPI пример)
from fastapi.middleware.cors import CORSMiddleware
app.add_middleware(
CORSMiddleware,
allow_origins=["https://example.com"],
allow_credentials=True,
allow_methods=["*"],
allow_headers=["*"],
)
Итог
Сервер не пересылает данные из CORS — он просто добавляет специальные заголовки в ответ. Браузер получает полный ответ и решает, разрешить ли доступ. CORS — это механизм контроля доступа на уровне браузера, а не промежуточная пересылка данных.