## Введение
Проблемы с CORS (Cross-Origin Resource Sharing) — частый кошмар фронтенд-разработчиков. Когда браузер блокирует запросы к другому домену, на помощь приходит Node.js прокси-сервер. Это руководство объяснит, как создать собственный прокси для обхода CORS с примерами кода, настройками безопасности и ответами на ключевые вопросы.
## Что такое CORS и почему он блокирует запросы?
CORS — механизм безопасности браузеров, предотвращающий межсайтовые атаки. Он блокирует:
– Запросы к API с другого домена
– Небезопасные методы (PUT, DELETE)
– Запросы с пользовательскими заголовками
Пример ошибки в консоли: `Access to fetch at ‘https://api.example.com’ from origin ‘http://localhost:3000’ has been blocked by CORS policy`.
## Как прокси-сервер решает проблему CORS?
Node.js прокси выступает посредником между клиентом и целевым API:
1. Клиент отправляет запрос вашему домену (например: `yourdomain.com/proxy`)
2. Прокси-сервер перенаправляет запрос к целевому API (например: `api.external-service.com`)
3. Ответ возвращается клиенту с вашего домена, минуя CORS ограничения
**Преимущества подхода**:
– Обход политик Same-Origin
– Контроль над заголовками
– Кэширование ответов
– Логирование запросов
## Создание базового прокси-сервера на Node.js
Установите зависимости:
“`bash
npm install express http-proxy-middleware cors
“`
Пример кода (`server.js`):
“`javascript
const express = require(‘express’);
const { createProxyMiddleware } = require(‘http-proxy-middleware’);
const app = express();
app.use(‘/proxy’, createProxyMiddleware({
target: ‘https://api.target-service.com’,
changeOrigin: true,
pathRewrite: { ‘^/proxy’: ” },
onProxyRes: (proxyRes) => {
proxyRes.headers[‘Access-Control-Allow-Origin’] = ‘*’;
}
}));
app.listen(3000, () => console.log(‘Прокси запущен на порту 3000’));
“`
**Как это работает**:
1. Запрос к `http://localhost:3000/proxy/data` перенаправляется на `https://api.target-service.com/data`
2. Заголовок `Access-Control-Allow-Origin: *` разрешает доступ с любых доменов
3. `changeOrigin` заменяет заголовок Host на целевой домен
## Расширенные настройки прокси
### Обработка ошибок
Добавьте middleware для перехвата сбоев:
“`javascript
app.use((err, req, res, next) => {
res.status(500).json({ error: ‘Ошибка прокси-сервера’ });
});
“`
### Аутентификация
Добавление API-ключей в заголовки:
“`javascript
createProxyMiddleware({
// …
headers: {
‘Authorization’: ‘Bearer YOUR_API_KEY’
}
})
“`
### Ограничение доступа
Разрешите запросы только с вашего фронтенда:
“`javascript
app.use(‘/proxy’, (req, res, next) => {
if (req.get(‘Origin’) !== ‘https://your-frontend.com’) {
return res.status(403).end();
}
next();
}, proxyMiddleware);
“`
## Безопасность прокси-сервера: критически важные практики
1. **Валидация URL**: Фильтруйте запросы к внутренним ресурсам
2. **Ограничение размера payload**: Защита от DDoS-атак
“`javascript
app.use(express.json({ limit: ‘100kb’ }));
“`
3. **HTTPS**: Всегда используйте TLS-шифрование
4. **Rate Limiting**: Установите ограничения запросов с помощью `express-rate-limit`
5. **Запрет чувствительных заголовков**: Удаляйте Cookie/Authorization при проксировании к ненадежным источникам
## Альтернативные решения
– **Cloudflare Workers**: Бессерверные прокси
– **Nginx Reverse Proxy**: Производительное решение для production
– **CORS Anywhere**: Готовое open-source решение
## Часто задаваемые вопросы (FAQ)
### Вопрос: Можно ли полностью отключить CORS на стороне клиента?
**Ответ**: Нет, это нарушит политику безопасности браузеров. Прокси — единственный легальный способ обхода.
### Вопрос: Требует ли прокси-сервер отдельного домена?
**Ответ**: Нет, он может работать на поддомене (api.yoursite.com) или отдельном пути (yoursite.com/proxy).
### Вопрос: Как избежать злоупотреблений прокси?
**Ответ**:
– Реализуйте аутентификацию JWT
– Ограничивайте конечные точки через whitelist
– Мониторьте трафик с помощью Middleware
### Вопрос: Замедляет ли прокси работу приложения?
**Ответ**: При правильной настройке задержка составляет 50-100 мс. Используйте кэширование для критичных к скорости endpoints.
### Вопрос: Совместим ли этот подход с WebSockets?
**Ответ**: Да, http-proxy-middleware поддерживает проксирование WebSockets через опцию `ws: true`.
## Заключение
Node.js прокси-сервер — мощное решение проблем CORS, дающее полный контроль над запросами. Следуя примерам из этого руководства, вы сможете реализовать безопасный прокси с гибкой конфигурацией. Помните о защите от злоупотреблений: 85% инцидентов безопасности происходят из-за неправильной настройки прокси. Для production-сред всегда используйте HTTPS, лимитеры запросов и мониторинг.