它允许它逐渐推出。建议先将其设置为非常小的max-age,如果没有问题,再将其增大。这避免了对任何非 HTTPS 站点进行 DoS 攻击的真正风险。虽然这种情况变得越来越少,但当它第一次出现时,这是一个真正的风险,因为 HTTP 仍然非常普遍。
例如,您将其部署在https://www.example.com 和该 Web 服务器上,并且该服务器还响应(并设置了 HSTS 标头)https://example.com。现在假设您没有在http://blog.example.com(它是一个不重要的仅静态域)或http://intranet.example.com(它不是面向 Internet)上设置 HSTS。如果没有max-age,您可能会永远阻止这些站点,直到您可以将 HTTPS 部署到它们(这可能比添加一些服务器配置更棘手)。
由于无法访问该站点,浏览器也看不到标题已被删除,因为您建议的重置。另外还有一个事实是,并非每个资源都需要设置 HSTS 标头 - 一个就足够了(尽管最佳实践是在每个 HTTPS 资源上设置它并包括重定向),因此没有标头不足以重置它。您需要明确设置max-age=0。
当然,如今,推荐的方法是在所有子域上使用 HTTPS(这几乎已成为常态,因为现在公共互联网比以前更 HTTPS - 尽管还不是默认设置)以及在内网站点上(尽管很难确定后者是否真的是大大小小的公司的常态)。
您是对的,这可以通过将max-age 设置为可选(而不是现在的强制)来实现,并且网站所有者可以在准备好滚动后将其从 HSTS 标头中删除它完全出来了,但是有一个默认的max-age 是非常危险的——原因与上面给出的相同。没有默认值并让实施者考虑它,希望让他们考虑合适的,或者至少让他们意识到他们正在做出的承诺。
预加载是使其永久化的方法,此时max-age 属性对于那些用户代理的实现预加载列表(主要是最流行的浏览器)来说是多余的。
有一种观点认为,这个世界上没有什么是永恒的——域名来来去去,并被可能或可能不想使用 HTTPS(至少在最初)的新方所采用——尽管正如我所说的,随着 HTTPS 成为规范这不是什么大问题。
还使用无限策略阻塞浏览器缓存,因为他们几年前访问过您的网站一次,这似乎有点粗鲁。虽然浏览器可以限制它(他们会这样做 - 稍后会详细介绍)但最好明确说明您想要的值。
顺便说一句,上述两个原因都是我也不特别喜欢预加载 HSTS 的原因。
另外值得注意的是,浏览器经常在max-age 上实现一个上限(通常是因为它被存储为一个 32 位整数),所以在其中粘贴一个任意大的值不会像你想象的那样将要。事实上,我记得讨论过一个浏览器(Firefox?)没有进行边界检查,所以设置一个大于实际可能溢出的值,因此根本阻止了策略的设置!正如我之前所说,预加载是使其永久化的方法。
六个月或一年的max-age 是推荐的最佳实践,在此之后,无论如何,就更大的政策的安全性而言,收益会递减。如果访问者不是每 6 到 12 个月访问一次您的网站(此时他们将再次刷新 HSTS 政策max-age 秒),那么他们很可能正在使用新的浏览器或设备。