关于跨域问题的归纳和总结

什么是跨域访问?

跨域访问即通过 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 即可。

猜你喜欢

转载自blog.csdn.net/weixin_43832080/article/details/128249441