为什么CORS在从浏览器发送而不是从终端发送时会阻止我的Http请求



我对CORS提供的安全性有点困惑。下面是两个实际上相同的HTTP请求,一个有效,另一个无效,一个是通过curl,另一是浏览器中的javascript。

终端

$ curl https://www.google.com/
--> Returns a page

浏览器:

// Open the console in the browser (or spin put localhost)
const xhr = new XMLHttpRequest();
xhr.open("GET", "https://www.google.com");
xhr.send();
--> CORS Error

重试:

const xhr = new XMLHttpRequest();
xhr.open("GET", "https://www.google.com");
xhr.setRequestHeader("Access-Control-Allow-Origin", "*");
xhr.setRequestHeader("Access-Control-Allow-Methods", 'GET,PUT,POST,DELETE,PATCH,OPTIONS');
xhr.setRequestHeader("Access-Control-Allow-Headers", 'Origin,Authorization,Content-Type,X-Auth-Token');
xhr.setRequestHeader("Access-Control-Allow-Credentials", 'true') 

xhr.send();
--> CORS Error still

所以我猜谷歌的服务器已经设置为只接受来自谷歌域的请求。但是,当我从不属于谷歌域的终端卷曲时,我会收到200个HTML等响应。

那么,为什么当我在浏览器中使用javascript时,服务器会在没有域的情况下响应我的终端,而不响应呢

谢谢^.^

CORS是一个安全功能,最终由浏览器实现。这就是为什么当你从终端卷曲时,你永远不会看到CORS错误。另请参阅:这篇文章来自mozilla

上面写着:

跨来源资源共享(CORS(en-US((是一种机制,它使用额外的HTTP标头来告诉浏览器允许在一个来源(域(运行的web应用程序有权访问来自不同来源的服务器的选定资源。

CORS是浏览器提供的一项功能。CORS是一种机制,旨在允许代表您发出请求,同时阻止流氓JS发出的一些请求,并在您向发出HTTP请求时触发:

  1. 一个不同的域(例如example.com上的站点调用api.com(
  2. 一个不同的子域(例如example.com上的站点调用api.example.com(
  3. 不同的端口(例如example.com上的站点调用example.com:3001(
  4. 不同的协议(例如https://example.com电话http://example.com)

请查看附件-https://medium.com/@baphemot/理解-cors-18ad6b478e2b

相关内容

最新更新