HSTS (HTTP Strict Transport Security) — заголовок HTTP-ответа, стандартизированный в RFC 6797 (2012). Когда сервер отправляет его в ответе по HTTPS, браузер запоминает: этот домен доступен только по HTTPS. При следующем обращении к домену по HTTP браузер автоматически переключается на HTTPS без единого запроса к серверу.
Как работает
Сервер добавляет заголовок в HTTP-ответ:
Strict-Transport-Security: max-age=31536000; includeSubDomains; preload
max-age— время в секундах, на которое браузер запомнит политику. 31536000 = 1 год.includeSubDomains— распространить политику на все субдомены.preload— разрешить внести домен в HSTS Preload List (встроен в браузеры).
Первый запрос к домену всё равно уязвим (браузер ещё не знает о HSTS). Preload List решает эту проблему: домены из списка принудительно используют HTTPS ещё до первого соединения.
HSTS Preload List
Google ведёт hstspreload.org — список доменов, встроенный в Chrome, Firefox, Safari, Edge. Для добавления домена в список требуются: max-age >= 31536000, includeSubDomains, preload, все субдомены работают по HTTPS. Удаление из preload-списка занимает месяцы.
История
Первое предложение HSTS появилось в 2009 году. RFC 6797 опубликован в ноябре 2012 года. Chrome поддержал HSTS с версии 4.0 (2010). HSTS Preload List запущен в 2012 году; к 2024 году в нём более 140 000 доменов. В 2020 году браузеры начали автоматически применять HSTS к .dev и .app доменам.
Связь с хостингом
В Nginx HSTS добавляется в конфигурацию HTTPS-блока:
add_header Strict-Transport-Security "max-age=31536000; includeSubDomains" always;
Важно: не включай includeSubDomains, пока все субдомены не переведены на HTTPS. Не включай preload, пока не убедишься — удалить домен из preload-списка трудно. Истечение сертификата при включённом HSTS полностью блокирует доступ к сайту.
Как работает HSTS
HSTS (HTTP Strict Transport Security) — заголовок HTTP-ответа, указывающий браузеру всегда использовать HTTPS для данного домена. Браузер сохраняет директиву в локальный список и в течение max-age секунд (рекомендуется 31536000 = 1 год) отказывается от HTTP-соединений к этому домену без попытки редиректа. Настройка в Nginx: add_header Strict-Transport-Security "max-age=31536000; includeSubDomains; preload". Директива includeSubDomains распространяет HSTS на все поддомены. preload включает домен в Chromium HSTS Preload List (hardcoded в браузере). HTTPS и HSTS -- взаимодополняющие механизмы защиты.
HSTS Preload List
Preload List -- список доменов, встроенный прямо в Chrome, Firefox, Safari, Edge. Браузер никогда не обратится к этим доменам по HTTP, даже при первом посещении. Для попадания в список: сайт должен иметь действующий SSL, HSTS header с max-age не менее 1 года, includeSubDomains, preload. Подача заявки: hstspreload.org. Удаление из списка занимает месяцы (браузеры обновляются постепенно). Перевод сайта на HTTPS должен предшествовать включению HSTS.
Типичные ошибки с HSTS
Первая ошибка -- включить HSTS до настройки HTTPS на всех поддоменах: браузер не откроет поддомен без SSL. Вторая -- установить max-age на несколько лет при нестабильном SSL: если сертификат не обновится, сайт будет недоступен весь max-age период. Начинайте с max-age=300 (5 минут), увеличивайте постепенно. Третья -- добавить preload без понимания последствий: убрать домен из preload list нельзя быстро. Mixed content нарушает HSTS: HTTP-ресурсы на HTTPS-странице блокируются браузером.