Что такое CORS и какие HTTP-заголовки он использует

Ответ

CORS (Cross-Origin Resource Sharing) — это механизм безопасности браузера, который позволяет веб-странице запрашивать ресурсы (например, API, шрифты, изображения) с другого домена, отличного от того, с которого была загружена сама страница.

По умолчанию браузеры применяют Политику одинакового источника (Same-Origin Policy), которая запрещает такие междоменные запросы. CORS предоставляет серверам способ "сообщить" браузеру, что запросы с определенных доменов безопасны и разрешены.

Ключевые HTTP-заголовки CORS (отправляемые сервером):

  • Access-Control-Allow-Origin: Указывает, каким доменам разрешен доступ. Значение может быть конкретным доменом (https://example.com) или * (любой домен, но это небезопасно для API, требующих аутентификации).
  • Access-Control-Allow-Methods: Перечисляет разрешенные HTTP-методы (GET, POST, PUT, DELETE и т.д.).
  • Access-Control-Allow-Headers: Перечисляет заголовки, которые разрешено использовать в запросе.
  • Access-Control-Max-Age: Указывает, как долго результаты предварительного запроса (preflight request) могут быть кэшированы.

Пример настройки в FastAPI (Python):

from fastapi import FastAPI
from fastapi.middleware.cors import CORSMiddleware

app = FastAPI()

# Список разрешенных доменов
origins = [
    "http://localhost:3000",
    "https://my-frontend-app.com",
]

app.add_middleware(
    CORSMiddleware,
    allow_origins=origins, # Разрешить запросы с этих доменов
    allow_credentials=True,
    allow_methods=["GET", "POST"], # Разрешить только GET и POST
    allow_headers=["Authorization"], # Разрешить заголовок Authorization
)

@app.get("/")
def read_root():
    return {"Hello": "World"}

Ответ 18+ 🔞

Давай разберем эту хуйню про CORS, а то народ путается, как в тёмном лесу, блядь.

Представь, ты сидишь на сайте my-cool-site.com. И твоя страничка хочет сходить на другой сервер, скажем, api.another-site.com, чтобы данные подтянуть. А браузер твой — он как строгий охранник, блядь, с дубиной. Он такой: «Ты куда, сука? Откуда пришёл, туда и иди!». Это и есть та самая Политика одинакового источника (Same-Origin Policy), ебать её в сраку. Чтобы её обойти, нужен пропуск. И этот пропуск — CORS.

CORS — это когда сервер, к которому ты лезешь, говорит твоему браузеру: «Да, пусть заходит этот парень с my-cool-site.com, я его знаю, он свой в доску». Говорит он это специальными заголовками, вот этими:

  • Access-Control-Allow-Origin — главный, блядь, заголовок. Тут пишут, кому можно. Например, https://my-cool-site.com. А если серверу похуй и он всех пускает, то ставят звёздочку — *. Но это как дверь нараспашку оставить, только для публичных данных годится.
  • Access-Control-Allow-Methods — тут перечисляют, что гостю можно делать: GET (посмотреть), POST (оставить), PUT (поменять), DELETE (удалить) и прочую хуйню.
  • Access-Control-Allow-Headers — а это какие бумажки (заголовки) гость может с собой принести. Например, Authorization — пропуск с печатью.
  • Access-Control-Max-Age — чтобы каждый раз не спрашивать разрешения, браузер может запомнить ответ на время, указанное тут. Удобно, блядь.

А теперь, чтобы не быть голословным, смотри, как это на практике впиндюрить, например, в FastAPI:

from fastapi import FastAPI
from fastapi.middleware.cors import CORSMiddleware

app = FastAPI()

# Список своих, проверенных ребят, которых пускаем
origins = [
    "http://localhost:3000",          # Локальный фронт во время разработки
    "https://my-frontend-app.com",    # Наш настоящий, боевой сайт
]

app.add_middleware(
    CORSMiddleware,
    allow_origins=origins,        # Пускать только этих
    allow_credentials=True,       # Разрешить куки и прочую авторизацию тащить
    allow_methods=["GET", "POST"], # Только смотреть и добавлять, хули там
    allow_headers=["Authorization"], # Пропуск с печатью можно предъявлять
)

@app.get("/")
def read_root():
    return {"Hello": "World"}

Вот и вся магия, ёпта. Настроил заголовки — и фронт с бэком, которые на разных доменах, начинают дружить, как родные, а не как два упыря на тонком льду. Главное — не забудь звёздочку * для всего подряд не ставить, а то какой-нибудь хитрожопый сайт твои данные уведёт, и будешь потом сидеть и думать: «Мудак я, блядь...».