HSTS: max-age, preload и что именно ломается
Обновлено 2026-11-03 · 6 мин чтения
HSTS — единственный заголовок безопасности, способный сделать сайт недоступным, в том числе для владельца. И он же обязателен для A+. Расстояние между этими двумя фактами целиком зависит от дисциплины при развёртывании.
Что заголовок делает на самом деле
Strict-Transport-Security сообщает браузеру, что к этому хосту следующие N секунд можно обращаться только по HTTPS. Получив его, браузер переписывает внутренние ссылки http://, блокирует клик «всё равно продолжить» при ошибке сертификата и полностью отказывается от чистого HTTP — ещё до того, как запрос покинет машину.
Именно поэтому он защищает от атак понижения, от которых не спасает редирект: редирект всё равно отправляет первый запрос открытым текстом, и это ровно тот запрос, который злоумышленник в сети и хочет перехватить.
Strict-Transport-Security: max-age=31536000; includeSubDomains; preload
max-age — обратный отсчёт, который нельзя отменить
max-age хранится на клиенте. Если вы отдали год, а затем убрали заголовок, каждый браузер, который его уже видел, продолжит требовать HTTPS до года. Серверного выключателя нет.
CertH считает 180 дней (15552000 секунд) порогом для A+. Год — обычное рабочее значение. Меньше 180 дней всё ещё считается включённым HSTS в сводке, но A+ не открывает.
includeSubDomains и preload — два независимых решения
includeSubDomains распространяет правило на все поддомены. Если хотя бы один поддомен говорит только по HTTP — внутренний инструмент, устаревшая админка, staging-хост — он станет недоступен для всех, кто заходил на родительский домен. Сначала проведите аудит DNS.
preload идёт дальше: домен вшивается в список, поставляемый с браузерами, поэтому правило действует уже при первом визите, до получения любого заголовка. Удаление занимает месяцы и требует заявки в список удаления. Не добавляйте preload, пока заголовок не проработает стабильно хотя бы несколько месяцев.
- •Отдавайте заголовок в каждом ответе по HTTPS, включая страницы ошибок — 404 без него ничему не учит браузер.
- •Никогда не отправляйте HSTS по чистому HTTP; по спецификации браузеры его игнорируют, поэтому неверно настроенный цикл редиректов так не починить.
- •Проверьте поддомены на сервисы только по HTTP, прежде чем добавлять includeSubDomains.
- •Добавляйте preload последним и только когда max-age уже какое-то время равен году.
Развёртывание, которое ничего не ломает
Начните с короткого max-age, чтобы ошибка быстро истекала: max-age=300. Подержите неделю, следя за сломанными поддоменами и отчётами о смешанном содержимом. Затем день, потом месяц, потом год. Каждый шаг обратим в пределах предыдущего окна — в этом и смысл начинать с короткого.
Если что-то всё-таки сломалось, исправление — правильно отдавать HTTPS на проблемном хосте, а не удалять заголовок, который уже никому из получивших его не поможет.
FAQ
Снижает ли отсутствие HSTS мой балл?
Оно не снимает баллы с базы, но блокирует A+: высшая оценка требует HSTS с max-age не менее 180 дней или preload. Сайт может набрать 100 и всё равно остаться A без него.
Можно ли использовать HSTS, не владея всеми поддоменами?
Да, если не указывать includeSubDomains. Тогда заголовок применяется только к тому хосту, который его отдал.