HTTP Strict Transport Security (HSTS) — механизм, который указывает браузеру всегда использовать HTTPS при обращении к вашему домену. Без HSTS первый запрос пользователя (например, при вводе example.com без https://) идёт по HTTP и уязвим для атак «человек посередине». HSTS устраняет это окно уязвимости.
Проблема, которую решает HSTS
Сценарий атаки:
- Пользователь вводит
example.comв адресной строке. - Браузер по умолчанию делает HTTP-запрос.
- Злоумышленник в той же сети перехватывает трафик и подменяет ответ.
- Пользователь может получить фишинговую страницу или перехваченные данные.
С HSTS браузер «помнит», что домен требует HTTPS, и преобразует HTTP-запросы в HTTPS ещё до отправки. Первый визит по-прежнему уязвим, но все последующие — защищены.
Проверить настройку HSTS и SSL можно с помощью анализатора заголовков безопасности и SSL Checker на rechecker.ru.
Синтаксис заголовка Strict-Transport-Security
Strict-Transport-Security: max-age=<seconds>; includeSubDomains; preload
| Параметр | Описание |
|---|---|
max-age | Время в секундах, сколько браузер помнит политику. Рекомендуется 31536000 (1 год) |
includeSubDomains | Распространить политику на все поддомены |
preload | Подсказка для включения в HSTS preload list браузеров |
Требования перед включением HSTS
- Рабочий HTTPS — сайт должен корректно обслуживаться по HTTPS на всех страницах.
- Редирект HTTP → HTTPS — все HTTP-запросы должны перенаправляться на HTTPS (301 или 302).
- Валидный сертификат — без ошибок и истечения срока действия. Проверка: SSL Checker.
Если включить HSTS при нерабочем HTTPS, пользователи не смогут обойти блокировку браузера. Отзыв из preload-списка занимает месяцы.
Настройка в Nginx
add_header Strict-Transport-Security "max-age=31536000; includeSubDomains; preload" always;
Параметр always нужен, чтобы заголовок отдавался и при кодах 4xx/5xx.
Настройка в Apache
Header always set Strict-Transport-Security "max-age=31536000; includeSubDomains; preload"
Требуется модуль mod_headers:
LoadModule headers_module modules/mod_headers.so
Настройка в Node.js (Express)
app.use((req, res, next) => {
if (req.secure) {
res.setHeader(
'Strict-Transport-Security',
'max-age=31536000; includeSubDomains; preload'
);
}
next();
});
При использовании reverse proxy (Nginx перед Node) проверяйте заголовок X-Forwarded-Proto:
const isSecure = req.secure || req.get('X-Forwarded-Proto') === 'https';
if (isSecure) {
res.setHeader('Strict-Transport-Security', 'max-age=31536000; includeSubDomains; preload');
}
Cloudflare
В панели Cloudflare: SSL/TLS → Edge Certificates → включить «HSTS» и задать max-age. Preload включается отдельной опцией.
HSTS Preload
Preload — список доменов, встроенный в браузеры. Для них HTTPS обязателен с первого визита, без единого HTTP-запроса.
Шаги:
- Убедитесь, что HSTS настроен с
max-ageне менее 31536000 иincludeSubDomains. - Добавьте директиву
preloadв заголовок. - Зайдите на hstspreload.org и отправьте домен.
- Дождитесь включения в список (обычно в следующем релизе Chrome).
Важно: отзыв из preload занимает несколько месяцев. Убедитесь, что HTTPS будет работать стабильно.
Проверка настройки
curl -I https://example.com
Ожидаемый заголовок:
Strict-Transport-Security: max-age=31536000; includeSubDomains; preload
Онлайн-проверка: Security Headers — покажет все заголовки безопасности, включая HSTS.
includeSubDomains: когда использовать
Включайте includeSubDomains, только если все поддомены (www, api, cdn, admin и т.д.) обслуживаются по HTTPS. Иначе пользователи не смогут открыть поддомен по HTTP.
Проверьте поддомены:
curl -I https://www.example.com
curl -I https://api.example.com
Типичные ошибки
- HSTS без рабочего HTTPS — сайт становится недоступным при проблемах с сертификатом.
- Короткий max-age — браузер быстро «забудет» политику, защита ослабляется.
- includeSubDomains при проблемных поддоменах — например, старый blog.example.com без HTTPS.
- Preload без тщательной проверки — отзыв долгий и сложный.
Связь с другими механизмами
HSTS дополняет, но не заменяет:
- Редирект HTTP → HTTPS (нужен для первого визита и старых браузеров).
- Валидный SSL-сертификат (см. SSL-сертификаты: полное руководство).
- Другие заголовки безопасности (см. HTTP-заголовки безопасности: защита веб-приложений).
Рекомендуемая конфигурация
Для большинства сайтов:
Strict-Transport-Security: max-age=31536000; includeSubDomains; preload
Убедитесь, что все поддомены поддерживают HTTPS, затем добавьте домен в preload на hstspreload.org.