← Назад к вопросам
Что такое Cross Origin Headers?
1.0 Junior🔥 81 комментариев
#DevOps и инфраструктура#Django
Комментарии (1)
🐱
claude-haiku-4.5PrepBro AI23 мар. 2026 г.(ред.)
Ответ сгенерирован нейросетью и может содержать ошибки
Cross-Origin Headers и CORS
Cross-Origin Headers — это специальные HTTP заголовки, которые регулируют доступ к ресурсам между разными источниками (domains, protocols, ports). Это критически важный механизм безопасности в веб-разработке.
Что такое Origin?
Origin — это комбинация трёх компонентов:
- Protocol (http, https)
- Domain (example.com)
- Port (80, 443, 3000 и т.д.)
# Примеры разных origins:
# https://example.com — origin 1
# https://example.com:443 — то же самое (443 — default для https)
# http://example.com — другой origin (разный protocol)
# https://api.example.com — другой origin (разный subdomain)
# https://example.com:8080 — другой origin (разный port)
Зачем нужны Cross-Origin Headers?
Без этого механизма любой сайт в интернете мог бы:
- Красть данные из приватных аккаунтов другого пользователя
- Отправлять запросы от имени пользователя
- Модифицировать данные на других сайтах
Поэтому браузер по умолчанию блокирует запросы между разными origins (это называется Same-Origin Policy).
CORS (Cross-Origin Resource Sharing)
CORS — это стандарт, который позволяет серверу явно разрешить доступ с других origins. Работает через систему HTTP заголовков.
Основные CORS заголовки
Заголовки запроса (от браузера):
- Origin — текущий origin клиента
Origin: https://frontend.example.com
- Access-Control-Request-Method — какой HTTP метод будет использован
Access-Control-Request-Method: POST
- Access-Control-Request-Headers — какие дополнительные заголовки понадобятся
Access-Control-Request-Headers: Content-Type, Authorization
Заголовки ответа (от сервера):
- Access-Control-Allow-Origin — какие origins разрешены
Access-Control-Allow-Origin: https://frontend.example.com
- Access-Control-Allow-Methods — разрешённые HTTP методы
Access-Control-Allow-Methods: GET, POST, PUT, DELETE
- Access-Control-Allow-Headers — разрешённые заголовки
Access-Control-Allow-Headers: Content-Type, Authorization
- Access-Control-Allow-Credentials — разрешить ли отправку cookies
Access-Control-Allow-Credentials: true
- Access-Control-Max-Age — кэшировать preflight запрос (в секундах)
Access-Control-Max-Age: 86400
Preflight запросы
Для сложных запросов (POST, PUT, DELETE с custom заголовками) браузер отправляет предварительный OPTIONS запрос перед основным запросом.
Реализация CORS на Python (FastAPI)
from fastapi import FastAPI
from fastapi.middleware.cors import CORSMiddleware
app = FastAPI()
app.add_middleware(
CORSMiddleware,
allow_origins=["https://frontend.example.com"],
allow_credentials=True,
allow_methods=["GET", "POST", "PUT", "DELETE"],
allow_headers=["*"],
max_age=86400,
)
@app.get("/api/data")
async def get_data():
return {"data": "value"}
Распространённые ошибки
# Ошибка: разрешить все origins с credentials
allow_origins=["*"]
allow_credentials=True # Несовместимо!
# Правильно: явно указать origins
allow_origins=["https://frontend.example.com"]
allow_credentials=True
Практический пример с разными окружениями
from fastapi import FastAPI
from fastapi.middleware.cors import CORSMiddleware
import os
app = FastAPI()
ENV = os.getenv("ENV", "development")
if ENV == "production":
allowed_origins = [
"https://example.com",
"https://www.example.com",
]
else:
allowed_origins = ["*"]
app.add_middleware(
CORSMiddleware,
allow_origins=allowed_origins,
allow_credentials=True,
allow_methods=["*"],
allow_headers=["*"],
max_age=3600,
)
Важные моменты
- CORS проверяет только браузер — мобильные приложения и серверные запросы не ограничены
- Никогда не отключай CORS полностью на продакшене
- Всегда явно указывай origins в production
- Max-Age помогает производительности — кэширует preflight запросы
- CORS не шифрует данные — это только проверка происхождения, используй HTTPS