HSTS (HTTP Strict Transport Security) — это заголовок безопасности, который указывает браузерам всегда подключаться по HTTPS — даже если пользователь набирает http:// или переходит по HTTP-ссылке. Как только браузер получает заголовок HSTS, он автоматически обновляет все последующие запросы к этому домену на HTTPS, предотвращая атаки на понижение протокола и незащищённые соединения.
Почему HSTS важен
Без HSTS первый запрос к вашему сайту может быть по HTTP (до срабатывания 301-перенаправления). В этом коротком окне злоумышленник в сети может:
- Снять HTTPS — перехватить перенаправление и удержать пользователя на HTTP (атака SSL stripping)
- Украсть куки — если куки отправляются при начальном HTTP-запросе
- Внедрить контент — модифицировать ответ перенаправления
HSTS устраняет это окно. После первого HTTPS-визита браузер больше никогда не пробует HTTP.
Как включить HSTS
Nginx
add_header Strict-Transport-Security "max-age=63072000; includeSubDomains" always;
Добавьте это внутри блока server для HTTPS (порт 443), не в блок HTTP-перенаправления.
Apache
Header always set Strict-Transport-Security "max-age=63072000; includeSubDomains"
Требуется mod_headers (sudo a2enmod headers).
Cloudflare
Dashboard → SSL/TLS → Edge Certificates → HTTP Strict Transport Security (HSTS) → Enable.
Параметры HSTS
| Параметр | Пример | Значение |
|---|---|---|
max-age | 63072000 (2 года) | Как долго (в секундах) браузер помнит о необходимости использовать HTTPS |
includeSubDomains | — | Распространяет HSTS на все поддомены |
preload | — | Сигнализирует о намерении войти в список HSTS preload |
Выбор max-age
| Фаза | max-age | Цель |
|---|---|---|
| Тестирование | 300 (5 минут) | Убедиться, что HTTPS работает, перед полным переключением |
| Уверенность | 604800 (1 неделя) | Низкий риск при необходимости отката |
| Продакшен | 31536000 (1 год) | Стандартная рекомендация |
| Долгосрочно | 63072000 (2 года) | Требуется для списка preload |
Начинайте с малого, увеличивайте постепенно. Если HTTPS перестанет работать, пока закэшировано большое значение max-age, посетители вообще не смогут попасть на ваш сайт — браузер откажется подключаться по HTTP.
HSTS preload
Список HSTS preload — это список доменов, жёстко закодированный в браузерах, для которых всегда используется HTTPS, даже при самом первом визите (до получения какого-либо заголовка HSTS).
Требования для preload
- Предоставлять действующий HTTPS-сертификат
- Перенаправлять HTTP на HTTPS на том же хосте
- Заголовок HSTS с
max-age>= 63072000 (2 года) - Включить директиву
includeSubDomains - Включить директиву
preload
add_header Strict-Transport-Security "max-age=63072000; includeSubDomains; preload" always;
Подача заявки на preload
Перейдите на hstspreload.org, введите ваш домен и отправьте заявку. После проверки (недели-месяцы) ваш домен добавляется во встроенные списки браузеров.
Предупреждения о preload
- Отменить сложно. Удаление из списка preload занимает месяцы и требует выхода нового релиза браузера. В это время ваш домен доступен только по HTTPS.
includeSubDomainsобязателен — каждый поддомен должен поддерживать HTTPS. Еслиstaging.example.comне имеет сертификата, он станет недоступен.- Добавляйте в preload только если уверены, что все текущие и будущие поддомены будут поддерживать HTTPS.
Распространённые ошибки
Установка HSTS в HTTP-ответе
HSTS должен отправляться только через HTTPS. Если ваше HTTP-перенаправление тоже отправляет заголовок HSTS, браузеры его игнорируют (спецификация требует HTTPS). Устанавливайте заголовок только в блоке порта 443.
Забыли о поддоменах
includeSubDomains применяет HSTS ко всем поддоменам. Если internal.example.com не имеет HTTPS, он станет недоступен. Проведите аудит всех поддоменов перед включением.
Слишком большой max-age с самого начала
Если HTTPS сломается (просроченный сертификат, ошибка конфигурации), посетители не смогут откатиться на HTTP. Их браузер откажется подключаться. Начните с 5 минут, убедитесь, что всё работает, затем увеличьте до 1 года.
Как проверить, активен ли HSTS
curl -sI https://yourdomain.com | grep -i strict-transport
# Expected: strict-transport-security: max-age=63072000; includeSubDomains
В Chrome DevTools: вкладка Network → нажмите на запрос → Headers → ищите Strict-Transport-Security.
Часто задаваемые вопросы
HSTS заменяет перенаправления HTTP→HTTPS?
Нет. HSTS и перенаправления служат разным целям. Перенаправление перехватывает первый HTTP-запрос. HSTS указывает браузеру больше никогда не делать HTTP-запросы (после первого HTTPS-визита). Вам нужно и то, и другое.
Может ли HSTS вызвать проблемы?
Да, если HTTPS сломается. При большом max-age браузеры откажутся подключаться по HTTP в качестве запасного варианта. Вот почему следует начинать с маленького max-age и увеличивать только когда HTTPS стабильно работает.
Нужен ли мне HSTS, если я на Cloudflare?
Cloudflare обрабатывает соединение посетитель→Cloudflare, но HSTS на вашем origin-сервере защищает всю цепочку. Включите HSTS через панель Cloudflare для пограничного сервера и на вашем origin, если используете режим Full (Strict).
В чём разница между HSTS и директивой CSP upgrade-insecure-requests?
upgrade-insecure-requests указывает браузеру загружать подресурсы (изображения, скрипты) по HTTPS вместо HTTP — исправляя смешанный контент. HSTS указывает браузеру всегда использовать HTTPS для всего домена. Они решают разные проблемы и могут использоваться вместе.