Какую безопасность обеспечивает механизм CORS?

Ответ

CORS (Cross-Origin Resource Sharing) — это механизм безопасности браузера, который позволяет веб-приложениям, запущенным на одном домене (origin), получать доступ к ресурсам на другом домене. Он является контролируемым исключением из Same-Origin Policy (SOP) — фундаментального принципа безопасности, который по умолчанию запрещает скриптам доступ к ресурсам с другого домена.

Безопасность CORS заключается в следующем:

  1. Предотвращение несанкционированного доступа к данным: CORS не позволяет вредоносному скрипту, запущенному на одном сайте, читать конфиденциальные данные с другого сайта без явного разрешения целевого сервера. Это защищает от атак, связанных с утечкой данных.
  2. Контроль над междоменными запросами: Сервер явно указывает, какие домены, 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 не предотвращает отправку запросов браузером (это может сделать любой скрипт), но он контролирует доступ к ответам на эти запросы, обеспечивая, что только доверенные источники могут читать данные.