> Что такое CORS (Python)

Уровень: junior · Роль: backend · Язык: Python · Категория: Технические вопросы

Компании: ООО Диджитал Сектор Поддержка, GGSel, Кинофлекс, Фабрика решений

Стек: Python

> Пример ответа

Короткий ответ

CORS (Cross-Origin Resource Sharing) - это механизм браузера, который контролирует доступ веб-страниц к ресурсам на другом origin (домен, протокол или порт). Браузер отправляет предварительный запрос OPTIONS и проверяет заголовки ответа сервера. Если сервер не разрешает origin, запрос блокируется. Для backend-разработчика это значит правильно настроить заголовки Access-Control-Allow-Origin и обработать preflight-запросы.

Подробное объяснение

CORS работает на уровне браузера, а не сервера. Сервер по умолчанию обрабатывает любой запрос, но браузер блокирует чтение ответа, если origin не совпадает.

Основные заголовки:

  • Access-Control-Allow-Origin - указывает, какой origin разрешён (или * для всех, но без credentials)
  • Access-Control-Allow-Methods - разрешённые HTTP-методы
  • Access-Control-Allow-Headers - разрешённые заголовки запроса
  • Access-Control-Allow-Credentials - разрешает передачу cookies (тогда * нельзя)

Preflight-запрос возникает, когда запрос не является "simple" (например, метод PUT, DELETE, или есть кастомные заголовки). Браузер отправляет OPTIONS с заголовками Access-Control-Request-Method и Access-Control-Request-Headers, ожидая подтверждения от сервера.

На практике

Для Python-бэкенда на FastAPI или Flask обычно используют middleware. В FastAPI это CORSMiddleware, где можно задать список разрешённых origins, методы и заголовки. Важно помнить: если используешь cookies (credentials), нельзя ставить allow_origins=["*"] - нужно явно перечислить origins.

Также нужно обрабатывать OPTIONS-запросы - большинство фреймворков делают это автоматически через middleware, но если пишешь голый WSGI-сервер, придётся обрабатывать вручную.

Пример кода

PYTHON
# FastAPI
from fastapi import FastAPI
from fastapi.middleware.cors import CORSMiddleware
app = FastAPI()
app.add_middleware(
CORSMiddleware,
allow_origins=["https://frontend.example.com"],
allow_methods=["GET", "POST", "PUT", "DELETE"],
allow_headers=["Authorization", "Content-Type"],
allow_credentials=True,
)
PYTHON
# Flask
from flask import Flask
from flask_cors import CORS
app = Flask(__name__)
CORS(app, origins=["https://frontend.example.com"], supports_credentials=True)

Как отвечать на собеседовании

Начни с определения: CORS - это политика браузера, а не сервера. Объясни, что сервер получает запрос, но браузер скрывает ответ, если заголовки не разрешают. Упомяни preflight и разницу между simple и non-simple запросами. Покажи понимание, что * не работает с credentials. Если спросят про безопасность - скажи, что CORS не защищает сервер, а защищает пользователя от CSRF-подобных атак.

Что проверяет интервьюер

Проверяется понимание того, что CORS - это браузерный механизм, а не серверная защита. Также важно знание практических деталей: preflight, заголовки, ограничение * при credentials. Для junior достаточно уверенного объяснения базовой механики и примера настройки в своём фреймворке.

Типичные ошибки

  • Утверждение, что CORS - это защита сервера от атак
  • Использование allow_origins=["*"] вместе с allow_credentials=True - это невалидно
  • Забывают про preflight и думают, что браузер просто блокирует запрос
  • Путают CORS с CSRF - это разные механизмы
  • Не учитывают, что ошибка CORS появляется в консоли браузера, а сервер при этом отвечает нормально

> ГОТОВЫ К СЛЕДУЮЩЕМУ СОБЕСЕДОВАНИЮ?

Запустите тренировочную сессию с ИИ и получите детальную обратную связь, чтобы увереннее проходить реальные интервью