CORS, rate limiting, сжатие ответов

↑ 3.5 Инфраструктура приложения: ошибки, health checks, фоновые задачи · ← Предыдущая · → Следующая

Обязательно~3 мин чтенияУровень: middle

Зачем это на собесе

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; будьте осторожны.

Практика

  1. Настройте CORS для SPA и проверьте preflight в DevTools.
  2. Добавьте лимит на endpoint логина.
  3. Сравните размеры ответа с Brotli и без.

Вопросы с ответами

Связанные темы