HSTS 做什么
HSTS 让浏览器在一段时间内强制使用 HTTPS 访问站点,阻止降级到明文 HTTP,也减少 Cookie 被明文劫持的机会。它通过响应头下发,由浏览器在本地执行约束,部署成本很低,但启用前必须确认全站 HTTPS 已经可用。
为什么回退很难
浏览器记住 HSTS 策略后,在有效期内即使站点证书出问题,用户也无法靠点「继续访问」绕过,只能等策略过期或被清除。includeSubDomains 会把约束扩展到所有子域,preload 会写进浏览器内置列表,这两项要先确认覆盖范围内的域名都支持 HTTPS。
基本信息
| 作用 | 防降级攻击与 Cookie 明文劫持 |
|---|---|
| 主要参数 | max-age、includeSubDomains、preload |
| 前提 | 全站 HTTPS 且证书有效 |
| 回退代价 | 策略有效期内无法绕过,证书故障会直接导致不可访问 |
典型使用场景
- 站点已完成全站 HTTPS 改造,需要防止降级
- 审计或检查要求启用严格传输安全
- 登录类页面需要降低 Cookie 被劫持的风险
- 统一多站点安全基线
- 评估子域覆盖范围后再决定是否 includeSubDomains
- 上线 preload 前的逐域名确认
响应头示例
响应头示例
# 先从小 max-age 起步,确认无问题后再逐步加长
add_header Strict-Transport-Security "max-age=300" always;
# 全站与子域都确认支持 HTTPS 后,再启用下面的形式
# add_header Strict-Transport-Security "max-age=31536000; includeSubDomains" always;参数与含义
| 参数 | 含义 | 注意事项 |
|---|---|---|
| max-age | 策略有效期(秒) | 设得过小作用有限,过大则回退困难 |
| includeSubDomains | 策略覆盖全部子域 | 存在未支持 HTTPS 的子域时不要启用 |
| preload | 写入浏览器内置列表 | 退出流程冗长,启用前逐域名确认 |
includeSubDomains 覆盖全部子域:存在未支持 HTTPS 的子域时,启用后这些子域会直接无法访问。
max-age 建议先从小值起步(如几分钟到几小时),确认站点与子域都正常后再逐步加长,避免一开始就把自己锁死。
启用 preload 前要确认所有相关域名都长期支持 HTTPS:一旦进入浏览器内置列表,退出周期以月计。