以 HTTP 為例,純文字通訊協定可能會遭受竊聽攻擊,攻擊者可以讀取傳輸的內容。幸好,傳輸層安全標準 (TLS) 可加密流量,讓攻擊者即使擷取資料,也難以使用。
不過,攻擊者可以強制加密連線使用明文 HTTP,藉此規避 TLS。為解決這個問題,我們推出了 HTTP 嚴格傳輸安全性 (HSTS) 回應標頭,強制使用者瀏覽器只使用 TLS 造訪網站,且不會在一段時間內改用純文字 HTTP。
Lighthouse 稽核失敗的原因
稽核作業會標示 HSTS 標頭的下列問題:
- 如果完全找不到 HSTS 標頭。
- 如果缺少其中一個建議指示 (
max-age
、includedSubDomains
、preload
) - 如果
max-age
指令的時間長度低於一年 (31536000 秒)。 - 如果剖析標頭時發生語法錯誤,例如不明指令。
設定嚴格的 HSTS 政策
最佳的 HSTS 標頭設定如下所示:
Strict-Transport-Security: max-age=63072000; includeSubDomains; preload
max-age
指令會指定使用者瀏覽器強制以 TLS 連線至網站的時間長度 (以秒為單位)。在該時間過後,如果網站未提供 HSTS 標頭 (或已實施從 HTTP 到 HTTPS 的暫時重新導向),使用者就能再次透過一般 HTTP 存取網站。- 設定
includeSubDomains
指示後,系統會在網頁網址的任何子網域上強制執行頁首,舉例來說,如果 google.com 傳送的 HSTS 標頭包含includeSubDomains
指令,也會在 mail.google.com 上強制執行 HSTS 標頭。 - 設定
preload
指示詞,並將網域提交至 HSTS 預先載入服務,即可將網域編譯為使用預先載入 HSTS 清單的瀏覽器二進位檔 (不只限於 Google Chrome)。
推出 HSTS 標頭時,存在一些風險。任何需要未加密 HTTP 連線的功能,在 max-age
指令設定的時間內都會中斷。如果套用 preload
指令,處理時間可能會更長。
為降低發布相關風險,建議採取分階段方式:
從小型
max-age
開始,只新增includeSubDomains
(不含preload
):max-age=3600; includeSubDomains
在沒有任何回報的問題的一段等待期 (例如一週) 後,請提高
max-age
,例如:max-age=604800; includeSubDomains
如果這個初始階段在一段較長的時間 (例如三個月) 內成功,請將網站及其子網域加入 HSTS 預載清單,並新增
preload
指令。max-age=63072000; includeSubDomains; preload