HTTP Strict-Transport-Security (HSTS) є заголовком відповіді, який інформує браузери, що доступ до хоста має здійснюватися лише через HTTPS, а всі майбутні спроби з'єднання через HTTP мають автоматично перетворюватися на безпечні. Цей механізм ідентифікує хост виключно за доменним ім'ям, не підтримує IP-адреси та діє на всі порти хоста. Браузер також блокує можливість користувачам обійти помилки безпеки сертифіката для таких хостів.

Отримавши заголовок через HTTPS, браузер додає домен до списку HSTS. При спробах відкрити HTTP-посилання браузер самостійно замінює схему на HTTPS перед відправкою запиту. Якщо вказано порт 80, він змінюється на 443, інші порти залишаються без змін, але підключаються через HTTPS. Браузери повністю ігнорують HSTS, надісланий через HTTP, для запобігання маніпуляціям з боку зловмисників у мережі.

Приклад використання на example.com

Розглянемо приклад, коли користувач вперше відкриває адресу http://example.com. Оскільки домен відсутній у списку HSTS браузера, початковий запит йде через незахищений HTTP. Сервер повертає перенаправлення 301 на https://example.com. Це перенаправлення не повинно містити заголовок HSTS. Після переходу на HTTPS сервер надсилає відповідь із заголовком Strict-Transport-Security.

httpStrict-Transport-Security: max-age=31536000; includeSubDomains

Цей приклад працює, бо браузер запам'ятовує example.com як хост HSTS на один рік. Завдяки директиві includeSubDomains правило діє на всі піддомени, наприклад login.example.com. Якщо зловмисник спробує перехопити трафік за допомогою підробленого сертифіката, браузер покаже помилку та заблокує вхід без можливості обійти попередження. Обмеженням захисту є перший запит: до отримання заголовка початковий HTTP-запит залишається вразливим.

Безпечне використання

Для безпечного використання налаштуйте постійне перенаправлення 301 з HTTP на HTTPS. Заголовок HSTS має надсилатися лише через HTTPS. Поширеною помилкою є його надсилання через HTTP, що повністю ігнорується браузерами. Кожен піддомен має самостійно надсилати заголовок, оскільки користувач може перейти безпосередньо на піддомен, не відвідуючи основний домен, і тоді політика супердомену не встигне застосуватися.

Для вимкнення HSTS встановіть max-age у значення 0. Це налаштування спрацює лише після успішного HTTPS-з'єднання та отримання оновленого заголовка. Вимкнути HSTS через HTTP неможливо за дизайном. При max-age=0 директива includeSubDomains не діє, домен видаляється зі списку HSTS, але окремо збережені політики піддоменів залишаються активними та мають видалятися самостійно.