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

时间:2012-06-27 16:58:42

标签: javascript node.js xmlhttprequest

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

我正在尝试向amazon aws发送HTTPS GET请求以从javascript(XMLHttpRequest)获取安全令牌,并且始终失败并且“Access-Control-Allow-Origin”不允许“Origin 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);
});

此作品

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);
});

有谁能解释一下这是如何运作的?

3 个答案:

答案 0 :(得分:8)

浏览器受Same Origin Policy约束。 Node.js不是。

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

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

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

答案 1 :(得分:2)

环境不同。您通常可以在任何地方自由发送任何HTTP请求(就像您现在正在通过向此站点发送请求一样)。

Node.js代表您提供的程序执行,因此可能是受信任的。这就是默认情况下没有限制的原因。如果您希望包含并运行不受信任的代码,可以添加任意限制 - 只需检查您最喜欢的搜索引擎中的“Node.js不受信任的代码”,以获取有关沙盒可用的一些想法。

另一方面,浏览器几乎总是运行不受信任的代码,但代表用户并拥有所有可能的权限。由于浏览器的环境必须是标准化的,所有浏览器都必须以相同的方式工作,因此作者之间就一系列安全策略达成了一致意见,并且他们在浏览器中实现了对根据same origin policy及以后的CORS以及{{{}}传出的XHR连接的控制权。 3}}。 浏览器本身控制这些限制而不是JavaScript或远程服务器。如果您选择其他语言,您将获得完全相同的环境限制。

答案 2 :(得分:1)

node.js是服务器端语言。不要被.js扩展名混淆。当你刚接触它时,这总会导致很多混乱。所以它很像php或C ++。你可以随时随地发送任何请求。访问任何站点(因此https请求)。但在浏览器javascript中,这是一种客户端语言。浏览器不允许您从其他服务器访问页面。说你在host.com:80。您只能从host.com:80/*not host2.com或甚至something.host.com

访问数据

这个ddoes不适用于node.js