Ответ
CORS (Cross-Origin Resource Sharing) — это механизм безопасности браузера, который позволяет веб-приложениям, запущенным на одном домене (origin), получать доступ к ресурсам на другом домене. Он является контролируемым исключением из Same-Origin Policy (SOP) — фундаментального принципа безопасности, который по умолчанию запрещает скриптам доступ к ресурсам с другого домена.
Безопасность CORS заключается в следующем:
- Предотвращение несанкционированного доступа к данным: CORS не позволяет вредоносному скрипту, запущенному на одном сайте, читать конфиденциальные данные с другого сайта без явного разрешения целевого сервера. Это защищает от атак, связанных с утечкой данных.
- Контроль над междоменными запросами: Сервер явно указывает, какие домены, HTTP-методы и заголовки разрешены для доступа к его ресурсам. Это дает разработчикам точный контроль над тем, кто и как может взаимодействовать с их API.
Как это работает (упрощенно):
- Простые запросы: Браузер отправляет запрос напрямую, добавляя заголовок
Origin
. Сервер отвечает сAccess-Control-Allow-Origin
, указывая разрешенный домен. Если домен не разрешен, браузер блокирует доступ к ответу. - Сложные запросы (Preflight): Для запросов, которые могут иметь побочные эффекты (например,
PUT
,DELETE
, запросы с нестандартными заголовками), браузер сначала отправляет предварительныйOPTIONS
запрос (preflight). Сервер отвечает, указывая разрешенные методы и заголовки. Только если preflight успешен, браузер отправляет основной запрос.
Пример настройки CORS в Flask:
from flask import Flask, jsonify
from flask_cors import CORS
app = Flask(__name__)
# Разрешить запросы только с 'https://trusted-domain.com' для всех API-эндпоинтов
CORS(app, resources={r"/api/*": {"origins": "https://trusted-domain.com"}})
@app.route("/api/data")
def get_data():
return jsonify({"data": "secure"})
Таким образом, CORS не предотвращает отправку запросов браузером (это может сделать любой скрипт), но он контролирует доступ к ответам на эти запросы, обеспечивая, что только доверенные источники могут читать данные.