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 у middleware 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. Він як охоронець на вході — впускає лише тих, кому ти довіряєш. Особливо це критично, якщо твоє застосунки пов'язані з персональною інформацією, грошима або просто не повинні видавати дані кому попало.
ПЕРЕЙДІТЬ В ПОВНУ ВЕРСІЮ