CORS позволяет вам управлять тем, какие веб-сайты (источники) могут обращаться к вашему API и какие HTTP-методы (например, GET, POST, PUT, DELETE) можно использовать при этих запросах. Эта настройка важна, чтобы предотвратить несанкционированный доступ к вашему API и обеспечить безопасность данных.
Например, вы можете разрешить доступ только из определённого домена (например, https://myfrontend.com) и только для методов GET и POST. Таким образом, ваш API будет работать только с доверенными источниками и ограничивать действия, которые могут быть выполнены.
Ограничение HTTP-методов
Давайте разберем, почему и как ограничивать HTTP-методы. Представьте себе это как чат с ботом: "Вы хотите, чтобы он отвечал на все запросы пользователей? Или только на те, которые для него релевантны?".
Разрешение всех методов (например, PUT, DELETE, PATCH и т.д.) может быть избыточным и небезопасным. Например, если ваш API предоставляет только возможность чтения данных через GET, другие методы должны быть запрещены, чтобы минимизировать риски эксплуатации уязвимостей.
Настройка методов в FastAPI
FastAPI значительно упрощает настройку CORS. Для работы с методами мы используем параметр allow_methods в миддлваре CORSMiddleware.
Пример: разрешим только методы GET и POST.
from fastapi import FastAPI
from fastapi.middleware.cors import CORSMiddleware
app = FastAPI()
# Настройка CORS
origins = [
"https://myfrontend.com", # Разрешить запросы только с этого домена
]
app.add_middleware(
CORSMiddleware,
allow_origins=origins, # Источники, откуда разрешены запросы
allow_methods=["GET", "POST"], # Разрешённые методы запросов
allow_headers=["*"], # Разрешённые заголовки
)
@app.get("/")
async def read_root():
return {"Hello": "World"}
В этом примере:
- API принимает запросы только из
https://myfrontend.com. - Только методы
GETиPOSTразрешены.
Попробуйте отправить запрос с методом DELETE или PUT — браузер заблокирует его.
Управление источниками запросов
Теперь поговорим о том, как управлять "источниками" (origins). Источник определяется как комбинация:
- Схема (например,
httpилиhttps). - Домен (например,
example.com). - Порт (например,
:3000).
Пример источника: https://myfrontend.com:3000
Ограничение источников позволяет защитить ваш API от доступа с недоверенных доменов. Например, если API должен быть доступен только вашему фронтенду, можно добавить его домен в "белый список" (allow_origins). Все остальные запросы будут отклонены.
Настройка источников в FastAPI
Для настройки параметра allow_origins мы указываем список разрешенных доменов.
Пример: разрешим запросы только с конкретных доменов.
app.add_middleware(
CORSMiddleware,
allow_origins=[
"https://myfrontend.com", # Основной фронтенд
"https://admin.myfrontend.com", # Панель администратора
],
allow_methods=["GET", "POST"], # Методы
allow_headers=["*"], # Все заголовки
)
Теперь только указанные домены смогут обращаться к API. Если запрос придет с другого источника, браузер заблокирует его с ошибкой CORS.
Использование wildcard (*)
Иногда нужно разрешить запросы с любого домена (например, если вы разрабатываете публичное API). В таких случаях можно использовать * (wildcard).
Пример: разрешим запросы с любого источника.
app.add_middleware(
CORSMiddleware,
allow_origins=["*"], # Разрешить запросы с любого источника
allow_methods=["GET", "POST", "DELETE"],
allow_headers=["*"],
)
Это избавляет вас от необходимости перечислять домены вручную. Однако использовать * нужно с осторожностью, так как это увеличивает вероятность несанкционированного доступа.
Примеры сложных конфигураций
- Разрешение методов и источников для разных сред
Представим себе ситуацию: в процессе разработки вы работаете с локальным фронтендом (http://localhost:3000), но в продакшене используете другой домен (https://myfrontend.com). Вы хотите разрешить запросы только из этих источников.
Решение:
import os
# Определяем текущую среду
ENVIRONMENT = os.getenv("ENVIRONMENT", "development")
if ENVIRONMENT == "production":
origins = ["https://myfrontend.com"]
else:
origins = ["http://localhost:3000"]
app.add_middleware(
CORSMiddleware,
allow_origins=origins,
allow_methods=["GET", "POST", "PUT", "DELETE"],
allow_headers=["*"],
)
Теперь окружение (ENVIRONMENT) определяет, какие источники разрешены.
- Настройка политики для REST API
Если у вас REST API и требуется разрешить только "чтение" (GET) для публичных данных и "запись" (POST, PUT, DELETE) только для авторизованных пользователей, вы можете разделить настройки.
app.add_middleware(
CORSMiddleware,
allow_origins=["https://public-api.com"],
allow_methods=["GET"], # Только GET для публичных запросов
allow_headers=["*"],
)
app.add_middleware(
CORSMiddleware,
allow_origins=["https://admin-api.com"],
allow_methods=["POST", "PUT", "DELETE"], # Методы записи для админов
allow_headers=["*"],
)
Проблемы и диагностика
Иногда при настройке CORS вы можете столкнуться с проблемами. Например:
- Ошибка в браузере: "No 'Access-Control-Allow-Origin' header is present on the requested resource".
Это означает, что источник запроса не указан вallow_originsили запрос поступил с недоверенного домена. - Ошибка при предварительном запросе (preflight): "CORS preflight channel did not succeed".
Это может быть связано с неверной настройкой методов вallow_methodsили заголовков вallow_headers.
Используйте DevTools в вашем браузере, чтобы отладить запросы, и проверяйте заголовки Access-Control-Allow-Origin и Access-Control-Allow-Methods в ответах сервера.
Зачем это нужно на практике?
В реальной жизни всё не так просто: если разрешить любому отправлять запросы к вашему серверу, это может обернуться серьёзными проблемами. Например, злоумышленник может заставить браузер пользователя отправлять запросы от его имени, или перехватить чувствительные данные, если доступ открыт с подозрительных сайтов.
Именно поэтому важно настраивать CORS. Он как охранник на входе — пускает только тех, кому вы доверяете. Особенно это критично, если ваше приложение связано с личной информацией, деньгами или просто не должно выдавать данные кому попало.
ПЕРЕЙДИТЕ В ПОЛНУЮ ВЕРСИЮ