node.js https请求和XMLHttpRequest之间有什么区别?

taz*_*azo 8 javascript xmlhttprequest node.js

通过node.js模块发送的HTTPS请求与XMLHttpRequest之间有什么区别?

我正在尝试向amazon aws发送HTTPS GET请求以从javascript(XMLHttpRequest)获取安全令牌,并且它始终失败,并且"来源控制 - 允许 - 来源"不允许"来源http:// my_ip ",但是如果我通过node.js模块发送相同的HTTPS GET请求它工作正常.

我对此感到困惑,因为如果服务器确实支持CORS,那么来自任何地方的任何请求都应该失败,但是它通过node.js,但不是通过XMLHttpRequest.

这失败

var url_ = "https://sts.amazonaws.com/?Action=GetSessionToken" +
            "&DurationSeconds=3600" +
            "&AWSAccessKeyId=XXXXXXXXXXXXXXX" +
            "&Version=2011-06-15" +
            "&Timestamp=" + encode(timestamp) +
            "&Signature=" + encode(hash) +
            "&SignatureVersion=2&SignatureMethod=HmacSHA256";

// Simple GET request
$.get(url_, function(data) {
    alert("response: " + data);
});
Run Code Online (Sandbox Code Playgroud)

这个工作

var https = require('https');
var options = {
    host    : 'sts.amazonaws.com',
    method  : 'GET',
    path    : '/?Action=GetSessionToken' +
              '&DurationSeconds=3600' +
              '&AWSAccessKeyId=XXXXXXXXXXXXXX' +
              '&Version=2011-06-15' +
              '&' + timestamp +
              '&' + signature +
              '&SignatureVersion=2&SignatureMethod=HmacSHA256'
};

https.get(options, function(res) {
    res.on('data', function(d) {
        process.stdout.write(d);
    });    
}).on('error', function(e) {
    console.error(e);
});
Run Code Online (Sandbox Code Playgroud)

有谁能解释我这是如何工作的?

Poi*_*nty 9

浏览器受同源策略约束.Node.js不是.

也就是说,浏览器将允许脚本通过XHR仅向与加载脚本的页面相同的域中的站点发出HTTP请求.但是,Node.js将允许对任何域的HTTP请求.

(现在使用CORS的浏览器故事稍微复杂一些,但这仍然是基本问题.)

编辑 - 详细说明,现在我已经重新阅读了你的问题:CORS是一个合作协议.互联网上的服务器通常会向任何人提供内容; 这就是运行Web服务器的重点.除非请求者询问,否则CORS与HTTP请求无关.如果您有URL"http:// xyz/something",并在浏览器的地址栏中输入,那么浏览器将毫不犹豫地向该站点发出HTTP请求.当来自另一个域(而不是"xyz")的站点的页面中的某些代码尝试通过XHR运行HTTP请求时,同源策略(和CORS)才会发挥作用.在这种情况下,浏览器会向"xyz"网站询问访问权限; 默认答案是"否",但这是浏览器强制执行该规则,而不是服务器.