HSTS: что это и зачем нужен
HSTS (HTTP Strict Transport Security) — заголовок безопасности, принудительно переключающий браузер на HTTPS. Защищает от атак перехвата трафика.
Что такое 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 →