\n```\n\n**Браузер делает следующее:**\n1. Видит, что это cross-origin запрос\n2. Посылает заголовок `Origin: https://prepbro.ru`\n3. Ждет специального заголовка ответа\n4. Если заголовка нет → блокирует ответ\n\n```\nBrowser видит запрос с https://prepbro.ru на https://api.evil.com\n\nBrowser отправляет:\nOrigin: https://prepbro.ru\n\nСервер отвечает:\nAccess-Control-Allow-Origin: *\n// или\nAccess-Control-Allow-Origin: https://prepbro.ru\n\nБраузер проверяет: Разрешено ли prepbro.ru?\nДа → позволяет JavaScript получить ответ\nНет → блокирует ответ (даже если пришел от сервера)\n```\n\n### Почему CORS работает в Postman\n\n**Postman — это не браузер.** Это desktop приложение, которое:\n1. Не имеет same-origin policy\n2. Отправляет запросы напрямую (не через браузерный движок)\n3. Не проверяет CORS заголовки\n\n```javascript\n// В браузере - ошибка CORS\nfetch('https://api.evil.com/data')\n .catch(err => console.log('CORS Error: No Access-Control-Allow-Origin'));\n\n// В Postman - работает!\n// Он просто отправляет HTTP запрос и показывает ответ\n```\n\n### Демонстрация различия\n\n**Сервер без CORS настройки:**\n\n```python\n# FastAPI без CORS\nfrom fastapi import FastAPI\n\napp = FastAPI()\n\n@app.get('/api/data')\nasync def get_data():\n return {\"data\": \"secret\"}\n```\n\n**Результаты:**\n\n```\nBrowser (https://prepbro.ru):\n fetch('https://api.evil.com/api/data')\n → CORS Error: No 'Access-Control-Allow-Origin' header\n → Данные НЕ доступны JavaScript\n → Но сервер вернул 200 OK!\n\nPostman:\n GET https://api.evil.com/api/data\n → 200 OK\n → {\"data\": \"secret\"}\n → Данные видны в ответе\n```\n\n### Как включить CORS на сервере\n\n**FastAPI:**\n\n```python\nfrom fastapi.middleware.cors import CORSMiddleware\nfrom fastapi import FastAPI\n\napp = FastAPI()\n\n# Добавить CORS middleware\napp.add_middleware(\n CORSMiddleware,\n allow_origins=[\"https://prepbro.ru\"], # Разрешить prepbro.ru\n allow_credentials=True,\n allow_methods=[\"*\"],\n allow_headers=[\"*\"],\n)\n\n@app.get('/api/data')\nasync def get_data():\n return {\"data\": \"информация\"}\n```\n\n**Express.js:**\n\n```javascript\nconst cors = require('cors');\nconst express = require('express');\n\nconst app = express();\n\n// Включить CORS для конкретных origin'ов\napp.use(cors({\n origin: 'https://prepbro.ru',\n credentials: true\n}));\n\napp.get('/api/data', (req, res) => {\n res.json({ data: 'информация' });\n});\n```\n\n**После включения CORS:**\n\n```\nBrowser (https://prepbro.ru):\n fetch('https://api.evil.com/api/data')\n → Server returns Access-Control-Allow-Origin: https://prepbro.ru\n → CORS OK!\n → {\"data\": \"информация\"}\n\nPostman:\n GET https://api.evil.com/api/data\n → 200 OK\n → {\"data\": \"информация\"}\n (CORS не влияет, тот же результат)\n```\n\n### Практический пример\n\n**HTML/JavaScript (браузер):**\n\n```html\n\n\n\n \n
\n\n \n\n\n```\n\n**Postman:**\n1. Открыть Postman\n2. Метод: GET\n3. URL: https://api.prepbro.ru/api/questions\n4. Нажать Send\n5. Увидеть ответ (CORS не помешает)\n\n### Типы CORS запросов\n\n**1. Simple Request (простой запрос)**\n\n```javascript\n// Не требует preflight запроса\nfetch('https://api.prepbro.ru/api/data', {\n method: 'GET', // GET, HEAD, POST\n headers: {\n 'Content-Type': 'application/x-www-form-urlencoded'\n }\n});\n```\n\n**2. Preflight Request (с предварительной проверкой)**\n\n```javascript\n// Требует preflight OPTIONS запроса\nfetch('https://api.prepbro.ru/api/data', {\n method: 'DELETE', // DELETE требует preflight\n headers: {\n 'Content-Type': 'application/json',\n 'Authorization': 'Bearer token' // Custom header требует preflight\n }\n});\n\n// Браузер АВТОМАТИЧЕСКИ отправляет:\n// OPTIONS /api/data\n// Access-Control-Request-Method: DELETE\n// Access-Control-Request-Headers: content-type,authorization\n\n// Ожидает ответ:\n// Access-Control-Allow-Methods: GET,POST,DELETE\n// Access-Control-Allow-Headers: content-type,authorization\n```\n\n**Postman НЕ отправляет preflight запросы** — он просто шлет DELETE прямо.\n\n### Защита от CSRF\n\nЧастое недоразумение: \"Если CORS блокирует cross-origin запросы, зачем CSRF токены?\"\n\n```javascript\n// 1. Хакер не может отправить запрос из браузера пользователя\n// благодаря CORS\nfetch('https://bank.com/transfer', {\n method: 'POST',\n body: JSON.stringify({ amount: 1000 })\n});\n// CORS Error! Хакер не получит ответ.\n\n// 2. Но если банк не настроил CORS:\nfetch('https://bank.com/transfer', {\n method: 'POST',\n body: JSON.stringify({ amount: 1000 })\n});\n// CORS Error, но запрос все равно ОТПРАВИЛСЯ серверу!\n// Банк обработает перевод и вернет ответ\n// Браузер заблокирует ответ из-за CORS\n// Но деньги уже переведены!\n\n// Решение: CSRF токены\nfetch('https://bank.com/transfer', {\n method: 'POST',\n headers: {\n 'X-CSRF-Token': 'random-token-from-server'\n },\n body: JSON.stringify({ amount: 1000 })\n});\n// Без правильного токена сервер не обработает запрос\n```\n\n### Тестирование CORS\n\n**Workflow:**\n\n```\n1. Разработка (localhost)\n - API на http://localhost:8000\n - Frontend на http://localhost:3000\n - CORS необходим!\n\n2. Тестирование\n - Использовать Postman (CORS не мешает)\n - Использовать curl (CORS не мешает)\n - Использовать браузер (CORS мешает!)\n\n3. Production\n - Frontend: https://prepbro.ru\n - API: https://api.prepbro.ru\n - Настроить CORS для https://prepbro.ru\n```\n\n### Best Practices\n\n```python\n# Правильная CORS конфиг для production\nCORS_ALLOWED_ORIGINS = [\n \"https://prepbro.ru\",\n \"https://www.prepbro.ru\",\n]\n\nif DEBUG: # Development\n CORS_ALLOWED_ORIGINS += [\n \"http://localhost:3000\",\n \"http://localhost:8000\",\n ]\n\napp.add_middleware(\n CORSMiddleware,\n allow_origins=CORS_ALLOWED_ORIGINS,\n allow_credentials=True,\n allow_methods=[\"GET\", \"POST\", \"PUT\", \"DELETE\"],\n allow_headers=[\"*\"],\n max_age=600, # Кэшировать preflight на 10 минут\n)\n```\n\n### Итог\n\n**CORS в Postman РАБОТАЕТ, потому что:**\n- Postman не браузер\n- CORS — это браузерное ограничение\n- Postman отправляет HTTP запросы напрямую\n- CORS заголовки игнорируются (для Postman они не обязательны)\n\n**CORS в браузере НЕ РАБОТАЕТ без настройки:**\n- Браузер проверяет Origin и CORS заголовки\n- Если нет Access-Control-Allow-Origin → ошибка\n- Нужно настроить CORS на сервере\n\n**Вывод:** Если запрос работает в Postman, но не работает в браузере → проблема с CORS на сервере. Нужно добавить правильные CORS заголовки.","dateCreated":"2026-04-02T21:51:08.705241","upvoteCount":0,"author":{"@type":"Person","name":"claude-haiku-4.5"}}}}
← Назад к вопросам

Будет ли работать CORS, если отправить запрос через Postman?

2.3 Middle🔥 251 комментариев
#Браузер и сетевые технологии

Комментарии (1)

🐱
claude-haiku-4.5PrepBro AI2 апр. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Будет ли работать 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>

Браузер делает следующее:

  1. Видит, что это cross-origin запрос
  2. Посылает заголовок Origin: https://prepbro.ru
  3. Ждет специального заголовка ответа
  4. Если заголовка нет → блокирует ответ
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 приложение, которое:

  1. Не имеет same-origin policy
  2. Отправляет запросы напрямую (не через браузерный движок)
  3. Не проверяет 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:

  1. Открыть Postman
  2. Метод: GET
  3. URL: https://api.prepbro.ru/api/questions
  4. Нажать Send
  5. Увидеть ответ (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 заголовки.