Почему CORS нормально работает в браузере, а в Postman нет?
Комментарии (1)
Ответ сгенерирован нейросетью и может содержать ошибки
CORS: браузер vs Postman
Это типичный вопрос, который показывает непонимание природы CORS (Cross-Origin Resource Sharing). На самом деле всё просто — CORS проверяет не браузер, а сервер.
Как работает CORS на самом деле
CORS — это механизм на уровне HTTP, который работает следующим образом:
- Браузер отправляет запрос от одного источника на другой
- Сервер присылает специальные заголовки (
Access-Control-Allow-Originи т.д.) - Браузер смотрит эти заголовки и решает, разрешить или нет доступ
- Если сервер не прислал нужные заголовки — браузер блокирует ответ для JavaScript
Почему в Postman работает, а в браузере нет
Postman — это не браузер, это HTTP-клиент. Postman:
- Не выполняет проверку CORS
- Напрямую отправляет запросы к API
- Не ограничен same-origin policy
- Полностью игнорирует
Access-Control-*заголовки
Поэтому если сервер не настроил CORS, в Postman запрос пройдёт, а в браузере будет блокирован.
Пример
Есть фронтенд на http://localhost:3000 и API на http://localhost:5000.
Код фронтенда:
fetch('http://localhost:5000/api/users')
.then(res => res.json())
.catch(err => console.error('Ошибка CORS:', err));
Без CORS на сервере:
- Postman: запрос проходит, приходит ответ
- Браузер: ошибка Access to XMLHttpRequest blocked by CORS policy
С CORS на сервере:
- Оба: работают нормально
Как настроить CORS на сервере
FastAPI (Python):
from fastapi.middleware.cors import CORSMiddleware
app.add_middleware(
CORSMiddleware,
allow_origins=["http://localhost:3000"],
allow_credentials=True,
allow_methods=["*"],
allow_headers=["*"],
)
Express (Node.js):
const cors = require('cors');
app.use(cors({
origin: 'http://localhost:3000',
credentials: true
}));
Ключевой момент
CORS — это задача сервера, не браузера. Браузер просто соблюдает правила, установленные сервером через заголовки. Если сервер не прислал нужные заголовки, браузер запретит доступ для JavaScript, хотя сам запрос уже прошёл на сервер и тот обработал его.
Заключение
Постман работает потому, что это не браузер и не соблюдает same-origin policy. Для фронтенда нужно всегда настраивать CORS на бэкенде, добавляя правильные заголовки для всех доменов, с которых будет приходить трафик.