Будет ли работать CORS, если отправить запрос через Postman?
Комментарии (1)
Ответ сгенерирован нейросетью и может содержать ошибки
Будет ли работать CORS при запросе через Postman
Да, CORS будет работать при запросе через Postman, И это важный момент для понимания того, как CORS действительно работает.
Что такое CORS
CORS (Cross-Origin Resource Sharing) — это механизм безопасности браузера, который ограничивает запросы со страниц, загруженных с одного origin'а, к ресурсам другого origin'а.
Ключевое слово: браузера. CORS — это браузерное ограничение, не серверное.
Browser Web Server
│ │
│ Запрос со страницы │
├─────────────────────>│
│ CORS проверка! │
│ Доступно? │
│<─────────────────────┤
│ Ответ │
│<─────────────────────┤
Postman Web Server
│ │
│ Запрос │
├─────────────────────>│
│ БЕЗ проверки CORS! │
│<─────────────────────┤
│ Ответ │
│ (приходит успешно) │
Почему CORS НЕ работает в браузере
Представь scenario:
<!-- Ты загружен с https://prepbro.ru -->
<script>
// Попытка сделать запрос на другой сервер
fetch('https://api.evil.com/steal-data', {
credentials: 'include' // Отправляем cookies
})
.then(res => res.json())
.catch(err => console.log('CORS Error!'));
</script>
Браузер делает следующее:
- Видит, что это cross-origin запрос
- Посылает заголовок
Origin: https://prepbro.ru - Ждет специального заголовка ответа
- Если заголовка нет → блокирует ответ
Browser видит запрос с https://prepbro.ru на https://api.evil.com
Browser отправляет:
Origin: https://prepbro.ru
Сервер отвечает:
Access-Control-Allow-Origin: *
// или
Access-Control-Allow-Origin: https://prepbro.ru
Браузер проверяет: Разрешено ли prepbro.ru?
Да → позволяет JavaScript получить ответ
Нет → блокирует ответ (даже если пришел от сервера)
Почему CORS работает в Postman
Postman — это не браузер. Это desktop приложение, которое:
- Не имеет same-origin policy
- Отправляет запросы напрямую (не через браузерный движок)
- Не проверяет CORS заголовки
// В браузере - ошибка CORS
fetch('https://api.evil.com/data')
.catch(err => console.log('CORS Error: No Access-Control-Allow-Origin'));
// В Postman - работает!
// Он просто отправляет HTTP запрос и показывает ответ
Демонстрация различия
Сервер без CORS настройки:
# FastAPI без CORS
from fastapi import FastAPI
app = FastAPI()
@app.get('/api/data')
async def get_data():
return {"data": "secret"}
Результаты:
Browser (https://prepbro.ru):
fetch('https://api.evil.com/api/data')
→ CORS Error: No 'Access-Control-Allow-Origin' header
→ Данные НЕ доступны JavaScript
→ Но сервер вернул 200 OK!
Postman:
GET https://api.evil.com/api/data
→ 200 OK
→ {"data": "secret"}
→ Данные видны в ответе
Как включить CORS на сервере
FastAPI:
from fastapi.middleware.cors import CORSMiddleware
from fastapi import FastAPI
app = FastAPI()
# Добавить CORS middleware
app.add_middleware(
CORSMiddleware,
allow_origins=["https://prepbro.ru"], # Разрешить prepbro.ru
allow_credentials=True,
allow_methods=["*"],
allow_headers=["*"],
)
@app.get('/api/data')
async def get_data():
return {"data": "информация"}
Express.js:
const cors = require('cors');
const express = require('express');
const app = express();
// Включить CORS для конкретных origin'ов
app.use(cors({
origin: 'https://prepbro.ru',
credentials: true
}));
app.get('/api/data', (req, res) => {
res.json({ data: 'информация' });
});
После включения CORS:
Browser (https://prepbro.ru):
fetch('https://api.evil.com/api/data')
→ Server returns Access-Control-Allow-Origin: https://prepbro.ru
→ CORS OK!
→ {"data": "информация"}
Postman:
GET https://api.evil.com/api/data
→ 200 OK
→ {"data": "информация"}
(CORS не влияет, тот же результат)
Практический пример
HTML/JavaScript (браузер):
<!DOCTYPE html>
<html>
<body>
<button onclick="fetchData()">Получить данные</button>
<div id="result"></div>
<script>
function fetchData() {
// API на другом домене
fetch('https://api.prepbro.ru/api/questions')
.then(res => res.json())
.then(data => {
document.getElementById('result').textContent =
JSON.stringify(data);
})
.catch(err => {
// Если нет CORS:
// TypeError: Failed to fetch
console.error('Ошибка:', err.message);
});
}
</script>
</body>
</html>
Postman:
- Открыть Postman
- Метод: GET
- URL: https://api.prepbro.ru/api/questions
- Нажать Send
- Увидеть ответ (CORS не помешает)
Типы CORS запросов
1. Simple Request (простой запрос)
// Не требует preflight запроса
fetch('https://api.prepbro.ru/api/data', {
method: 'GET', // GET, HEAD, POST
headers: {
'Content-Type': 'application/x-www-form-urlencoded'
}
});
2. Preflight Request (с предварительной проверкой)
// Требует preflight OPTIONS запроса
fetch('https://api.prepbro.ru/api/data', {
method: 'DELETE', // DELETE требует preflight
headers: {
'Content-Type': 'application/json',
'Authorization': 'Bearer token' // Custom header требует preflight
}
});
// Браузер АВТОМАТИЧЕСКИ отправляет:
// OPTIONS /api/data
// Access-Control-Request-Method: DELETE
// Access-Control-Request-Headers: content-type,authorization
// Ожидает ответ:
// Access-Control-Allow-Methods: GET,POST,DELETE
// Access-Control-Allow-Headers: content-type,authorization
Postman НЕ отправляет preflight запросы — он просто шлет DELETE прямо.
Защита от CSRF
Частое недоразумение: "Если CORS блокирует cross-origin запросы, зачем CSRF токены?"
// 1. Хакер не может отправить запрос из браузера пользователя
// благодаря CORS
fetch('https://bank.com/transfer', {
method: 'POST',
body: JSON.stringify({ amount: 1000 })
});
// CORS Error! Хакер не получит ответ.
// 2. Но если банк не настроил CORS:
fetch('https://bank.com/transfer', {
method: 'POST',
body: JSON.stringify({ amount: 1000 })
});
// CORS Error, но запрос все равно ОТПРАВИЛСЯ серверу!
// Банк обработает перевод и вернет ответ
// Браузер заблокирует ответ из-за CORS
// Но деньги уже переведены!
// Решение: CSRF токены
fetch('https://bank.com/transfer', {
method: 'POST',
headers: {
'X-CSRF-Token': 'random-token-from-server'
},
body: JSON.stringify({ amount: 1000 })
});
// Без правильного токена сервер не обработает запрос
Тестирование CORS
Workflow:
1. Разработка (localhost)
- API на http://localhost:8000
- Frontend на http://localhost:3000
- CORS необходим!
2. Тестирование
- Использовать Postman (CORS не мешает)
- Использовать curl (CORS не мешает)
- Использовать браузер (CORS мешает!)
3. Production
- Frontend: https://prepbro.ru
- API: https://api.prepbro.ru
- Настроить CORS для https://prepbro.ru
Best Practices
# Правильная CORS конфиг для production
CORS_ALLOWED_ORIGINS = [
"https://prepbro.ru",
"https://www.prepbro.ru",
]
if DEBUG: # Development
CORS_ALLOWED_ORIGINS += [
"http://localhost:3000",
"http://localhost:8000",
]
app.add_middleware(
CORSMiddleware,
allow_origins=CORS_ALLOWED_ORIGINS,
allow_credentials=True,
allow_methods=["GET", "POST", "PUT", "DELETE"],
allow_headers=["*"],
max_age=600, # Кэшировать preflight на 10 минут
)
Итог
CORS в Postman РАБОТАЕТ, потому что:
- Postman не браузер
- CORS — это браузерное ограничение
- Postman отправляет HTTP запросы напрямую
- CORS заголовки игнорируются (для Postman они не обязательны)
CORS в браузере НЕ РАБОТАЕТ без настройки:
- Браузер проверяет Origin и CORS заголовки
- Если нет Access-Control-Allow-Origin → ошибка
- Нужно настроить CORS на сервере
Вывод: Если запрос работает в Postman, но не работает в браузере → проблема с CORS на сервере. Нужно добавить правильные CORS заголовки.