有兴趣可关注公众号 毛毛虫的小小蜡笔,不定时更新前端等文章信息。
定义
HSTS,全称是HTTP Strict Transport Security。
设置后,浏览器只会通过HTTPS来访问服务端。
详情解释
你的网站第一次通过HTTPS请求,服务器响应Strict-Transport-Security头,浏览器记录下这些信息,然后后面尝试访问这个网站的请求都会自动把HTTP替换为HTTPS。
当HSTS头设置的过期时间到了,后面通过HTTP的访问恢复到正常模式,不会再自动跳转到HTTPS。
每次浏览器接收到Strict-Transport-Security头,它都会更新这个网站的过期时间,所以网站可以刷新这些信息,防止过期发生。
Chrome、Firefox等浏览器里,当您尝试访问该域名下的内容时,会产生一个307 Internal Redirect(内部跳转),自动跳转到HTTPS请求。
如果服务器发送的TLS证书无效,用户不能忽略浏览器警告继续访问网站。
一般情况下,如果是证书无效,浏览器会给出提示警告,但用户还是能选择继续访问来忽略警告。
但如果开启了HSTS,那么浏览器就不会让你绕过警告了。
响应头
在服务端设置响应头,即可开启HSTS功能。
// 后面两个值是可选的。
Strict-Transport-Security: max-age=31536000; includeSubDomains; preload
Demo
在浏览器输入www.baidu.com
浏览器默认是HTTP协议,所以发起的第一个请求是HTTP请求。
然后服务端会重定向到HTTPS,此时状态码是301或302。直接输入baidu.com实际上会重定向到www.baidu.com。
为了排除域名跳转因素影响,所以这里假设直接输入www.baidu.com来验证,不带协议就可以。
具体如下截图所示:
浏览器重定向到HTTPS,即发起第二个请求,此时是HTTPS请求。
然后服务端的响应头会带上Strict-Transport-Security。
具体如下截图所示:
然后,后面的所有请求都是HTTPS了。
用户关了再打开浏览器
在浏览器输入www.baidu.com,此时的状态码是307(Internal Redirect[内部重定向])。也就是这个请求没发生群殴那个到服务端,只是浏览器内部重定向而已。
具体如下截图所示:
然后第二个以及后面的请求,都是HTTPS了。
具体如下截图所示:
后面用户如果再打开浏览器,输入baidu.com,请求流程会继续走307(内部重定向)的流程。
chrome中查询HSTS
chrome://net-internals/#hsts
就可以在chrome浏览器中查询网站,是否已加入HTST域名列表。
如下截图所示:
HSTS的主要作用
HTTPS比HTTP安全,所以攻击者会阻止浏览器和服务器之间建立HTTPS链接。
现在很多用户都是在浏览器输入域名,比如baidu,而不是直接输入https://xxx,所以就有可能访问的是HTTP服务,从而存在中间人攻击。
攻击者就可以在用户访问HTTP服务的时候,替换所有的HTTPS请求为HTTP,已达到阻止访问HTTPS的目的。
HSTS主要作用是防止该问题的发生。
因为只要浏览器与服务器建立过一次HTTPS连接,后面浏览器就会强制的使用HTTPS请求。
就算用户特定输入HTTP协议,浏览器会忽略它,继续使用HTTPS协议来访问。
另外,如果中间人使用了证书攻击,浏览器发出警告,此时很多用户都会选择忽略。但只要服务器发送了HSTS字段,浏览器就会强制使用HTTPS来访问,不允许用户忽略告警。
HSTS不足的地方
因为用户第一次访问网站的时候,是不受HSTS保护的。
这是因为第一次访问的时候,浏览器还未收到服务器返回的HSTS头部,所以仍然有可能存在通过HTTP来访问的问题。
目前比较常用的解决方案是,在浏览器中提前设置好HSTS的域名。
最后
- 有兴趣可关注公众号 毛毛虫的小小蜡笔,不定时更新前端等文章信息。
- 文章有疑问和问题,请留言。
- 如果觉得文章还可以,请点赞或收藏,谢谢。