CORS, rate limiting, сжатие ответов
↑ 3.5 Инфраструктура приложения: ошибки, health checks, фоновые задачи · ← Предыдущая · → Следующая
Зачем это на собесе
CORS — вечная боль frontend-бэкенд интеграции; rate limiting — защита от перегрузки.
Объяснение
CORS
Браузерная политика: страница с origin A может обращаться к origin B, только если B разрешил это заголовками Access-Control-Allow-*. Сервер не блокирует запрос — блокирует браузер.
builder.Services.AddCors(o => o.AddPolicy("web", p => p
.WithOrigins("https://app.example.com")
.WithMethods("GET", "POST", "PUT", "DELETE")
.WithHeaders("Authorization", "Content-Type")
.AllowCredentials()));
app.UseCors("web");Preflight — OPTIONS перед «небезопасным» запросом; ответ можно кэшировать (SetPreflightMaxAge).
Rate limiting
builder.Services.AddRateLimiter(o =>
{
o.RejectionStatusCode = 429;
o.AddFixedWindowLimiter("api", w => { w.PermitLimit = 100; w.Window = TimeSpan.FromMinutes(1); });
o.AddPolicy("per-user", ctx => RateLimitPartition.GetTokenBucketLimiter(
ctx.User.Identity?.Name ?? ctx.Connection.RemoteIpAddress?.ToString() ?? "anon",
_ => new TokenBucketRateLimiterOptions { TokenLimit = 20, TokensPerPeriod = 10, ReplenishmentPeriod = TimeSpan.FromSeconds(1) }));
});
app.UseRateLimiter();| Алгоритм | Особенность |
|---|---|
| Fixed window | просто, всплески на границе окна |
| Sliding window | плавнее |
| Token bucket | допускает всплески |
| Concurrency | ограничивает параллельные запросы |
Сжатие
AddResponseCompression (Brotli/Gzip) для текстовых ответов. Обычно делается на proxy/CDN.
Нюансы и подводные камни
AllowAnyOriginвместе сAllowCredentialsзапрещён спецификацией.- CORS не заменяет авторизацию: запросы без браузера его игнорируют.
- Встроенный rate limiter локален для инстанса; для кластера нужен общий счётчик (Redis) или лимиты на gateway.
- Сжатие HTTPS-ответов с секретами → BREACH; будьте осторожны.
Практика
- Настройте CORS для SPA и проверьте preflight в DevTools.
- Добавьте лимит на endpoint логина.
- Сравните размеры ответа с Brotli и без.
Вопросы с ответами
Что такое CORS и кто его проверяет?
Механизм браузера, ограничивающий кросс-доменные запросы; сервер лишь сообщает разрешения заголовками.
Зачем preflight?
Браузер заранее спрашивает разрешение для «непростых» запросов (метод, заголовки, credentials).
Чем token bucket отличается от fixed window?
Bucket допускает короткие всплески при контроле среднего темпа; fixed window имеет резкие границы окна.