Ответ
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 не предотвращает отправку запросов браузером (это может сделать любой скрипт), но он контролирует доступ к ответам на эти запросы, обеспечивая, что только доверенные источники могут читать данные.
Ответ 18+ 🔞
Да ты послушай, что за дичь творится в интернетах! Вот сидит, блядь, твой скрипт на сайте pornhub-ot-babushki.ru и пытается стырить данные с my-bank-secret-api.com. А браузер ему такой: «Нихуя, дружок-пирожок, не пущу!». Это и есть та самая политика одного источника, SOP, блядь. Как будто стена между районами.
А CORS — это такой официальный пропуск через эту стену, ёпта! Не просто дырка в заборе, а контрольно-пропускной пункт с охраной и бумажками.
В чём, сука, безопасность-то?
- Чтоб не совали свой нос куда не просят. Без этого любой сайт-одностраничник мог бы, как хитрая жопа, тихо запросить твою почту из Gmail, если ты в ней авторизован. CORS не даёт просто так прочитать ответ. Сервер должен явно сказать: «Да,
trusted-site.com, я тебе доверяю, забирай мои данные». - Точный контроль, а не просто «всем можно». Сервер — царь и бог. Он говорит: «Ладно, пусть заходят с
good-guys.ru, но только методомGETи без своих левых заголовковX-My-Shady-Header». Всё по протоколу, блядь!
Как это, сука, работает?
- Простые запросы (как будто за хлебом сходил): Браузер летит к серверу и сразу кричит в заголовке
Origin: «Я сpornhub-ot-babushki.ru, дай данных!». Сервер смотрит в свой список доверенных и либо отвечает «О, да, конечно, вот тебеAccess-Control-Allow-Origin: pornhub-ot-babushki.ruи печеньки», либо посылает нахуй. Браузер, получив отказ, скрипту просто не отдаст эти данные, хоть он обосрись. - Сложные запросы (Preflight, или «Сначала покажи документы»): Это когда твой скрипт собрался не просто посмотреть, а что-то изменить —
PUT,DELETEили со своим хитрожопым заголовком. Браузер, такой бдительный, сначала шлёт запрос-разведкуOPTIONS: «Э, сервак, можно я к тебе вот так вот приду?». Сервер проверяет: «МетодPUT? Разрешаю. ЗаголовокX-Admin-Key? А вот это, блядь, нет, не разрешаю». И если по хоть одному пункту не сошлось — основной запрос даже отправлен не будет. Представь, охрана на КПП не пустила, потому что у тебя в сумке гиря, а не документы.
Вот смотри, как на Flask это выглядит, чтоб не быть, как тот Герасим, немым:
from flask import Flask, jsonify
from flask_cors import CORS
app = Flask(__name__)
# Разрешаем запросы ТОЛЬКО для путей, начинающихся на /api/ и ТОЛЬКО с 'https://trusted-domain.com'
# Всем остальным — иди нахуй, волнение ебать.
CORS(app, resources={r"/api/*": {"origins": "https://trusted-domain.com"}})
@app.route("/api/data")
def get_data():
return jsonify({"data": "secure"})
Короче, CORS — это не про то, чтобы запрос не ушёл. Запрос-то уйдёт всегда, если скрипт его отправит. Это про то, чтобы браузер не дал скрипту прочитать ответ, если сервер его не благословил. Всё честно, блядь. Как на таможне: посылку отправить можешь, а получить — только если все печати в порядке.