HSTS: что это и зачем нужен

HSTS (HTTP Strict Transport Security) — заголовок безопасности, принудительно переключающий браузер на HTTPS. Защищает от атак перехвата трафика.

безопасностьhstshttpsзаголовкиweb-security

Что такое HSTS

HSTS (HTTP Strict Transport Security) — HTTP-заголовок безопасности, который инструктирует браузер всегда использовать HTTPS для данного домена в течение указанного периода, даже если пользователь явно вводит http:// в адресную строку.

После получения HSTS заголовка браузер сохраняет запись: "этот сайт — только HTTPS". При попытке открыть HTTP-версию браузер автоматически переключается на HTTPS ещё до отправки запроса на сервер. Это исключает атаку SSL stripping, при которой злоумышленник перехватывает незащищённый HTTP-запрос до редиректа.

Зачем нужен HSTS

Защита от SSL stripping: без HSTS первый HTTP-запрос уязвим — злоумышленник в сети может перехватить его до того, как сервер сделает 301-редирект на HTTPS.

Защита от человека посередине (MITM): HSTS делает невозможным перехват трафика через подменный HTTP-прокси.

Ускорение: браузер не делает HTTP-запрос и не ждёт редиректа — сразу обращается по HTTPS.

Защита поддоменов: директива includeSubDomains распространяет защиту на все поддомены.

Google Chrome Security: сайты с HSTS получают зелёный статус в Security-оценке Chrome.

Как настроить HSTS

Заголовок HSTS

Strict-Transport-Security: max-age=31536000; includeSubDomains; preload

Параметры:

  • max-age=31536000 — время кеширования в секундах (1 год = 31536000)
  • includeSubDomains — распространить на все поддомены
  • preload — включение в HSTS Preload List браузеров

Nginx

server {
    listen 443 ssl;

    # Только в production, не в dev-окружении!
    add_header Strict-Transport-Security "max-age=31536000; includeSubDomains; preload" always;
}

Apache

Header always set Strict-Transport-Security "max-age=31536000; includeSubDomains; preload"

Next.js

// next.config.js
async headers() {
  return [{
    source: '/(.*)',
    headers: [{
      key: 'Strict-Transport-Security',
      value: 'max-age=31536000; includeSubDomains; preload'
    }]
  }]
}

HSTS Preload List

Браузеры (Chrome, Firefox, Safari, Edge) содержат встроенный список HSTS-доменов — HSTS Preload List. Для сайтов из этого списка HTTPS обеспечивается ещё до первого посещения.

Подать заявку на включение: hstspreload.org

Требования для preload:

  • Действующий SSL-сертификат
  • Редирект HTTP → HTTPS
  • HSTS заголовок с max-age >= 31536000
  • Обязательно: includeSubDomains и preload
  • Все поддомены должны работать по HTTPS

Внимание: после включения в Preload List удаление занимает месяцы. Убедитесь что все поддомены поддерживают HTTPS перед подачей заявки.

Проверка HSTS на reChecker

Используйте Security Headers для проверки HSTS и других заголовков безопасности. Инструмент покажет:

  • Наличие и значение заголовка HSTS
  • Значение max-age (достаточно ли долго)
  • Наличие includeSubDomains и preload директив
  • Общую оценку безопасности заголовков

FAQ

HSTS можно добавить на HTTP-сайт? Нет. HSTS имеет смысл только для HTTPS-сайтов. Браузер игнорирует HSTS заголовок, полученный по HTTP. Сначала переведите сайт на HTTPS, потом добавляйте HSTS.

Что делать если нужно вернуться на HTTP? Если вы уже добавили HSTS с длинным max-age, вернуться на HTTP сложно — браузеры будут принудительно использовать HTTPS. Для постепенного отключения уменьшите max-age до 0 и дождитесь истечения кеша у всех пользователей.

Нужно ли добавлять HSTS в dev-окружении? Нет. HSTS в localhost или dev-домене заблокирует HTTP-доступ для разработки. Используйте переменную окружения: if (NODE_ENV === 'production') для применения HSTS только на production.

Попробуйте инструмент

Проверьте hsts на вашем сайте с помощью бесплатного инструмента.

Security Headers

Техническая поддержка

Нашли баг, сбой или ошибку в работе сервиса? Есть предложение по улучшению? Напишите нам — мы читаем каждое сообщение и стараемся быстро исправлять проблемы.