HSTS
这个 HTTP 头部用于强制浏览器只通过 HTTPS 连接,是具有里程碑意义的安全策略配置。以下是对各部分的详细拆解:
核心作用
HSTS(HTTP Strict Transport Security)
通过将网站标记为「仅限 HTTPS」来阻止浏览器使用 HTTP 协议连接,可防御以下攻击:
- SSL Stripping(SSL剥离攻击)
- Cookie 劫持
- 中间人攻击(MITM)
- 协议降级攻击
参数解析
1. max-age=31536000
- 数值含义:有效期 31536000 秒 = 365天
- 生效逻辑:
① 浏览器首次访问时:
⠀└ 接收并记录该策略 → 开启 HSTS 保护
② 后续有效期内的访问:
⠀└ 无论用户输入 HTTP/HTTPS → 强制转为 HTTPS
③ 生效期间:
⠀└ 忽略证书错误警告(若配置不当可能导致无法访问)
2. includeSubDomains
- 作用范围:
覆盖当前主域名及其所有子域名
(例如example.com
包含api.example.com
,cdn.example.com
等) - 安全要求:
必须确保所有子域都支持 HTTPS,否则会导致子域不可访问
核心实现原理
浏览器内部维护的 HSTS 列表工作机制:
sequenceDiagram
participant User
participant Browser
participant Server
User->>Browser: 输入 http://example.com
Browser->>Server: 尝试通过 HTTP 访问
Server-->>Browser: 响应 307 跳转 + HSTS 头
Browser->>Browser: 记录 HSTS 规则到本地缓存
Browser->>Server: 自动转为 https://example.com
loop 有效期内的请求
User->>Browser: 任何访问请求
Browser->>Server: 始终强制走 HTTPS
end
配置建议
-
分阶段部署:
- 测试阶段 →
max-age=300
(5分钟) - 稳定后 →
max-age=63072000
(2年)
- 测试阶段 →
-
风险规避:
- 部署前确认所有子域 HTTPS 支持
- 禁用
includeSubDomains
直到子域准备完成 - 使用 HSTS 预加载必须满足全部严格标准
-
紧急救援(误配置时):
# 快速撤销策略(将 max-age 设为0即刻失效) add_header Strict-Transport-Security "max-age=0; includeSubDomains";
安全增强技巧
-
预加载列表(Preload List)
通过 hstspreload.org 提交申请,将域名硬编码到浏览器内核:Strict-Transport-Security: max-age=63072000; includeSubDomains; preload
-
Cookie 安全联动
配合安全 Cookie 属性使用时防御级别更高:Set-Cookie: session=xxxx; Secure; HttpOnly; SameSite=Strict
-
结合 CSP
与内容安全策略形成双层防护:Content-Security-Policy: upgrade-insecure-requests
特别注意:错误配置 HSTS 会导致业务陷入无法恢复的 HTTPS 强制依赖状态,部署前务必通过 curl -I
验证头部生效情况并保持完善的证书管理机制。