作为一名前端开发者,有时候会遇到一些跨域问题,之前我参考一些教程网址的理解是:
客户端浏览器其实已经将请求发送出去了,服务器端也接收到了,但是服务器返回的数据在回来的时候被浏览器拦截了。
但是今天在和后端同事讨论的时候,他说我之前理解错了。下面是他的解释:
跨域的本质是保护服务器的数据,就好像你不能直接进我家来捣乱,你需要我给你钥匙(需要后端的 Access-Control-Allow-Origin 设置允许访问的来源 )。但是按照这样理解的话,就推翻了我之前的理解,请求已经发送了,但是被服务器拒绝了。
问题: 我自己也有点疑惑,哪个理解才是正确的呢?
你可以看看
CORS(跨域资源共享)
的定义 https://developer.mozilla.org/zh-CN/docs/Web/HTTP/CORS首先对齐一个共识,
同源策略是浏览器的安全策略,脱离浏览器不存在跨域问题
,相同的配置下, 两个服务器
之间通信是不会存在跨域问题的,所以跨域请求
被拒绝这个动作,是浏览器和服务端配合完成的,但主要的控制端还是浏览器
在
CORS
中你会看到简单请求
和非简单请求
的概念,无论是哪种请求,都会被发送到服务端,只不过有以下区别浏览器
会屏蔽服务端的响应,这一点你可以用node
起个服务来验证浏览器
会先发送一个OPTIONS
请求去获取服务端的响应头,看服务端是否有配置相关的CORS
策略来允许本次跨域请求,如果满足CORS
的规则,浏览器
就会继续发送真实的请求
,否则就阻断掉所以其实并不是
服务端
真正拒绝的跨域请求,是浏览器
遵循CORS
的规则阻断了真实的请求。你只需要理解到对于跨域请求,真正的逻辑控制端
是在浏览器,只是浏览器支持CORS
让服务端可以通过响应头
来支持跨域而已