В чем заключается механизм CORS и какую проблему он решает?

Ответ

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

Проблема, которую решает CORS

По умолчанию в браузерах действует политика одинакового источника (Same-Origin Policy, SOP), которая запрещает скриптам с одного сайта получать доступ к данным на другом. Это защищает пользователей от вредоносных сайтов, которые могли бы читать данные из вашей почты или банковского аккаунта, открытых в соседних вкладках.

CORS предоставляет серверу контролируемый способ "ослабить" эту политику и разрешить доверенным сайтам получать доступ к его ресурсам.

Как это работает?

Когда фронтенд (например, с https://my-app.com) пытается отправить "сложный" запрос (например, PUT или с кастомными заголовками) к API на https://api.service.com, браузер автоматически выполняет preflight-запрос (предварительный запрос) с методом OPTIONS.

Сервер должен ответить, разрешает ли он такой запрос, отправив специальные HTTP-заголовки:

  • Access-Control-Allow-Origin: Указывает, каким доменам разрешен доступ (https://my-app.com или * для всех).
  • Access-Control-Allow-Methods: Список разрешенных методов (GET, POST, DELETE и т.д.).
  • Access-Control-Allow-Headers: Список разрешенных заголовков запроса.

Если ответ сервера разрешающий, браузер отправляет основной запрос. В противном случае — блокирует его.

Пример на Flask с использованием flask-cors (best practice):

from flask import Flask, jsonify
from flask_cors import CORS

app = Flask(__name__)

# Разрешить запросы с домена 'https://my-app.com' для всех роутов, начинающихся с /api/
CORS(app, resources={r"/api/*": {"origins": "https://my-app.com"}})

@app.route('/api/data')
def get_data():
    return jsonify({'message': 'This is cross-origin data!'})