什么是跨域访问?
跨域访问即通过 HTTP 请求,从一个域去请求另一个域的资源。
影响点:若服务端没有返回允许的 Header 头则无法获取资源,因而导致服务不可用,常见于前后端分离项目、CDN加速服务等;
域的意思: 协议、域名、端口组合,若三者有一处不相等即视为跨域
跨域举例
类型 | 样例A | 样例B | 是否跨域 |
---|---|---|---|
协议问题 | http://www.example.com | https://www.example.com | 跨域 |
域名问题 | https://ftp.example.com | https://www.example.com | 跨域 |
端口问题 | https://www.example.com:80 | https://www.example.com:81 | 跨域 |
为什么要有同源策略(出现跨域问题的原因)
同源策略是一个重要的安全策略,它用于限制一个origin的文档或者它加载的脚本如何能与另一个源的资源进行交互。它能帮助阻隔恶意文档,减少可能被攻击的媒介。
举个例子
在正规的浏览器下, 你登录 A 网站,然后无意打开 B 网站(钓鱼、恶意网站),B网站会抓取你的 Cookie,调用 A 网站的接口,获取敏感信息,从而导致信息泄露,甚至资金损失, 而同源策略就是解决 B 调用 A网站时的鉴权认证流程(浏览器实现),从而拒绝 B 访问 A的行为。
所以当我们配置配置下面介绍参数的时候,需要时刻注意当前服务的安全问题,从而配置出合理又安全的配置。
常用参数说明
Header 参数 | 含义 | 常见设置 |
---|---|---|
Access-Control-Allow-Origin | 用于解决资源的跨域权限问题,域值定义了允许访问该资源的域。可以设置通配符 “*”,允许被所有域请求。 | Access-Control-Allow-Origin: * Access-Control-Allow-Origin: <origin> |
Access-Control-Max-Age | The Access-Control-Max-Age 这个响应头表示预检请求的返回结果(即 Access-Control-Allow-Methods 和Access-Control-Allow-Headers 提供的信息)可以被缓存多久,设置好该值可以避免频繁的 OPTIONS 请求 | Access-Control-Max-Age: <delta-seconds> |
Access-Control-Request-Method | 请求头 Access-Control-Request-Method 出现于 preflight request(预检请求)中,用于通知服务器在真正的请求中会采用哪种 HTTP 方法。因为预检请求所使用的方法总是 OPTIONS ,与实际请求所使用的方法不一样,所以这个请求头是必要的。 | Access-Control-Allow-Methods: POST, GET, OPTIONS |
Access-Control-Allow-Credentials | Access-Control-Allow-Credentials 响应头用于在请求要求包含 credentials(Request.credentials 的值为 include)时,告知浏览器是否可以将对请求的响应暴露给前端 JavaScript 代码。 | Access-Control-Allow-Credentials: true |
特别说明
- Access-Control-Max-Age: 设置缓存时间后可以提升性能,但不同的浏览器对于缓存时间有自己的上限值,即你配置很长,但实际上不会达到你的预期,一般建议配置 86400 即可。