问题描述
最近遇到一个奇怪的问题,在iOS的safari浏览器和pc的chrome浏览器里通过http访问公司的一个项目地址时,该地址会有一个301跳转到https。但是通过Android浏览器里访问该http地址时不会发生跳转。
通过查找资料了解到了HTTP Strict Transport Security(简称为HSTS),它是一个安全功能,可以告诉浏览器只能通过https访问当前资源,禁止http方式。
HSTS作用
大家都知道http与服务器通信是明文的,所以会存在风险,最常见的就是所谓的中间人攻击,什么是中间人攻击呢?比如你接入了一个免费的WiFi,然后开始登录你的网上银行并支付一些账单,实际上你连上的免费WiFi很可能是某个黑客的笔记本热点,此时他可以拦截你最初的http请求,然后跳转到一个和你网上银行一摸一样的钓鱼网站,此时你的隐私数据全部暴露给黑客了。
这时HSTS就派上用场了,它可以强制从http跳转到https。
怎么启用HSTS
开启HSTS很简单,只要给请求的响应头增加:
Strict-Transport-Security: max-age=expireTime [; includeSubdomains]
max-age:过期时间(s),浏览器将当前域名加入到HSTS域名列表的时间,超过时间后将清除。
includeSubdomains:可选属性,存在该属性表示对所有子域名生效;
浏览器处理HSTS
浏览器内部会有一套HSTS域名列表,只要当前访问地址命中该列表,就会执行HSTS,即强制进行https跳转。
怎么将域名加入到HSTS域名列表呢?答案是第一次通过https访问请求,并且该请求的响应头会返回有效的Strict-Transport-Security,浏览器就会将该域名加入列表,后续浏览器如果发现有该域名的http请求会强制使用https。
chrome浏览器可以通过访问chrome://net-internals/#hsts管理上面所说的HSTS域名列表,可以通过该页面增删查域名列表中的域名
问题解惑
因为之前在safari和chrome里都通过https访问过该项目地址,所以该项目地址的域名被添加到了HSTS域名列表中,所以通过http访问会强制跳转。
而android里之前没使用https访问过,项目域名自然不在浏览器的HSTS域名列表中,所以不会强制跳转。