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