JavaRush /Курсы /Модуль 4: FastAPI /Разрешение и управление междоменными запросами

Разрешение и управление междоменными запросами

Модуль 4: FastAPI
21 уровень , 4 лекция
Открыта

Когда веб-приложение (фронтенд) хочет обратиться к вашему API (бекенду), находящемуся на другом домене, это считается междоменным запросом. Например, frontend живёт на https://app.example.com, а backend — на https://api.example.com. Браузер, выступая в роли параноика, отказывается делать такие запросы, чтобы защитить пользователя от зловещего сценария "злой сайт украл личные данные".

CORS — это механизм, который позволяет браузерам узнать, что запросы между доменами безопасны и разрешены. Это как список гостей на вечеринке; браузер сначала спрашивает: "Можно ли этому домену зайти?" И если конфигурация CORS говорит "да," запрос пропускается.


Концепция разрешённых междоменных запросов

Междоменные запросы стоит разрешать только для доверенных источников. Например:

  • Ваши фронтенд-приложения, размещённые на определённых доменах.
  • Разрешение API для третьих сторон с ограничением на конкретные методы.

Разрешение всех источников (*) — плохая практика, если вы не разрабатываете публичный API без авторизации, который позволяет доступ всем подряд. Это равносильно стоять на входе в замок и кричать: "Запускаю всех!"


Когда запрещать междоменные запросы?

Если ваш API:

  • Содержит конфиденциальные данные.
  • Не предназначен для взаимодействия с внешними системами.
  • Будет использоваться только внутренними сервисами (например, вашим фронтендом).

В таких случаях жёсткие ограничения на источники (список разрешённых доменов) — это must-have.


Управление источниками запросов

FastAPI предоставляет простой и удобный способ регулировать, какие источники могут обращаться к вашему API. Для этого мы используем CORSMiddleware, который можно легко подключить к вашему приложению.

Начнём с базового примера, где мы разрешаем доступ только для одного домена — нашего фронтенда:


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

app = FastAPI()

# Разрешённые домены
origins = [
    "https://app.example.com"
]

app.add_middleware(
    CORSMiddleware,
    allow_origins=origins,  # Указываем разрешённые источники
    allow_credentials=True,  # Разрешить передачу cookies и авторизации
    allow_methods=["GET", "POST"],  # Указываем разрешённые методы
    allow_headers=["*"],  # Разрешаем любые заголовки
)

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

Здесь:

  • allow_origins — список доменов, которые могут обращаться к вашему API.
  • allow_credentials=True говорит браузеру, что мы разрешаем отправлять cookies (например, для сессий).
  • allow_methods ограничивает HTTP-методы, которые могут использоваться кросс-доменно.

Теперь только запросы с адреса https://app.example.com смогут получить доступ к нашему API.


Разрешение нескольких источников

Что, если у вас есть два фронтенда, работающих с одним API? Например, обычное веб-приложение и мобильная версия. Просто добавьте оба домена в origins:


origins = [
    "https://app.example.com",
    "https://mobile.example.com"
]

Браузер будет проверять запрос по этому списку и разрешать только те, которые совпадают.

Использование wildcard (*)

Вы можете разрешить доступ с любого источника, установив allow_origins=["*"]. Однако это безопасно только в случаях, когда:

  • Ваш API полностью публичный.
  • Данные, предоставляемые API, не требуют авторизации.

Пример:


app.add_middleware(
    CORSMiddleware,
    allow_origins=["*"],
    allow_methods=["GET", "POST"],
    allow_headers=["*"],
)

Но помните, что разрешение всех источников — это открывать дверь хакерам. Лучше избегать этого на продакшене.


Определение допустимых HTTP-методов

CORS позволяет ограничивать HTTP-методы, которые могут использоваться для междоменных запросов. Например, если вы хотите, чтобы только GET запросы были разрешены:


app.add_middleware(
    CORSMiddleware,
    allow_origins=["https://app.example.com"],
    allow_methods=["GET"],  # Только GET-запросы
    allow_headers=["*"],
)

Другие методы, такие как POST, PUT или DELETE, будут заблокированы.


Управление заголовками запросов

Иногда вашему фронтенду нужно отправить кастомный заголовок, например, Authorization, чтобы передать токен. В таких случаях это нужно явно указать в allow_headers:


app.add_middleware(
    CORSMiddleware,
    allow_origins=["https://app.example.com"],
    allow_methods=["GET", "POST"],
    allow_headers=["Authorization", "Content-Type"],
)

Если разрешить все заголовки (allow_headers=["*"]), браузер будет счастливо пропускать любые заголовки, но это может привести к несанкционированному доступу.


Управление сроком действия предварительного запроса

Браузеры используют предварительные запросы (preflight) для проверки политики CORS перед основным запросом. Чтобы сократить количество таких запросов, вы можете настроить их срок действия (в секундах) с помощью max_age:


app.add_middleware(
    CORSMiddleware,
    allow_origins=["https://app.example.com"],
    allow_methods=["GET", "POST"],
    max_age=3600,  # 1 час
)

Это будет полезно для повышения производительности, особенно в случаях интенсивного взаимодействия фронтенда с вашим API.


Практические примеры настройки междоменных запросов

Пример 1: Разрешение только для продакшена

Для обеспечения безопасности вы можете разрешить запросы только с домена продакшена:


origins = [
    "https://myproductionapp.com"
]

app.add_middleware(
    CORSMiddleware,
    allow_origins=origins,
    allow_methods=["GET", "POST", "DELETE"],
    allow_headers=["Authorization"],
    allow_credentials=True,
)

Пример 2: Разрешение для разработки и продакшена

Во время разработки вам, вероятно, понадобится доступ для localhost:


origins = [
    "http://localhost:3000",  # React dev server
    "https://myproductionapp.com"
]

app.add_middleware(
    CORSMiddleware,
    allow_origins=origins,
    allow_methods=["*"],  # Все методы
    allow_headers=["*"],
    allow_credentials=True,
)

Заключительные мысли о междоменных запросах

Настройка разрешённых источников и методов в CORS — это баланс между безопасностью и удобством. Настраивая CORS для вашего FastAPI-приложения, всегда думайте о том, кто может обратиться к вашему API и зачем. Избыточные разрешения — это путь к проблемам. Лучше немного усложнить себе разработку, чем потом бороться с утечкой данных.

1
Задача
Модуль 4: FastAPI, 21 уровень, 4 лекция
Недоступна
Настройка CORS для одного разрешённого домена
Настройка CORS для одного разрешённого домена
1
Задача
Модуль 4: FastAPI, 21 уровень, 4 лекция
Недоступна
Разрешение запросов для нескольких доменов
Разрешение запросов для нескольких доменов
3
Опрос
Настройка CORS для обеспечения кросс-доменного доступа, 21 уровень, 4 лекция
Недоступен
Настройка CORS для обеспечения кросс-доменного доступа
Настройка CORS для обеспечения кросс-доменного доступа
Комментарии
ЧТОБЫ ПОСМОТРЕТЬ ВСЕ КОММЕНТАРИИ ИЛИ ОСТАВИТЬ КОММЕНТАРИЙ,
ПЕРЕЙДИТЕ В ПОЛНУЮ ВЕРСИЮ