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

Что такое 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 заголовки

Заголовки запроса (от браузера):

  1. Origin — текущий origin клиента
Origin: https://frontend.example.com
  1. Access-Control-Request-Method — какой HTTP метод будет использован
Access-Control-Request-Method: POST
  1. Access-Control-Request-Headers — какие дополнительные заголовки понадобятся
Access-Control-Request-Headers: Content-Type, Authorization

Заголовки ответа (от сервера):

  1. Access-Control-Allow-Origin — какие origins разрешены
Access-Control-Allow-Origin: https://frontend.example.com
  1. Access-Control-Allow-Methods — разрешённые HTTP методы
Access-Control-Allow-Methods: GET, POST, PUT, DELETE
  1. Access-Control-Allow-Headers — разрешённые заголовки
Access-Control-Allow-Headers: Content-Type, Authorization
  1. Access-Control-Allow-Credentials — разрешить ли отправку cookies
Access-Control-Allow-Credentials: true
  1. 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
Что такое Cross Origin Headers? | PrepBro