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

Javascript node.js https请求和XMLHttpRequest之间有什么区别?,javascript,node.js,xmlhttprequest,Javascript,Node.js,Xmlhttprequest,通过node.js模块发送的HTTPS请求与通过XMLHttpRequest发送的HTTPS请求有什么区别 我正在尝试向amazon aws发送HTTPS GET请求,以从javascript(XMLHttpRequest)获取安全令牌,它总是失败,并出现“访问控制不允许源站允许源站”的情况,但如果我通过node.js模块发送相同的HTTPS GET请求,则可以正常工作 我对此感到困惑,因为若服务器确实支持CORS,来自任何地方的任何请求都应该失败,但它是通过node.js进行的,而不是通过XM

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

我正在尝试向amazon aws发送HTTPS GET请求,以从javascript(XMLHttpRequest)获取安全令牌,它总是失败,并出现“访问控制不允许源站允许源站”的情况,但如果我通过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);
});
这很有效

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

有人能解释一下这是怎么工作的吗?

浏览器受限制。Node.js不是

也就是说,浏览器只允许脚本通过XHR向加载脚本的页面所在域中的站点发出HTTP请求。然而,Node.js将允许对任何域的HTTP请求

(浏览器的故事现在稍微涉及CORS,但这仍然是这里的基本问题。)


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

node.js是服务器端语言。不要被.js扩展搞糊涂了。当你刚接触它的时候,这总是会引起很多混乱。所以它非常像PHP或者C++。你可以发送任何你想要的请求。访问任何站点(https请求)。但在浏览器javascript中,这是一种客户端语言。浏览器不允许您从其他服务器访问页面。假设你在host.com:80。您只能访问host.com:80/*中的数据,而不能访问host2.com或something.host.com中的数据


此DDoS不适用于node.js,因为环境不同。您通常可以在任何地方自由发送任何HTTP请求(就像您现在通过将请求发送到此站点所做的那样)

Node.js代表您执行由您提供的程序,因此可能是可信的。这就是为什么默认情况下没有限制。如果希望包含并运行不受信任的代码,您可以添加任意限制,只需查看您喜爱的搜索引擎中的“Node.js untrusted code”,了解有关沙箱的一些想法

另一方面,浏览器几乎总是运行不受信任的代码,但代表用户并拥有其所有可能的权限。由于浏览器的环境必须标准化,所有浏览器才能以相同的方式工作,因此作者之间商定了一组安全策略,并在浏览器中实现了对JavaScript发出的XHR连接的控制浏览器本身控制这些限制,而不是JavaScript或远程服务器。如果您选择另一种语言,您将受到与环境完全相同的限制。

特别是(为了扩展答案并鼓励讨论,使其成为规范的答案),SOP的要点是防止恶意代码加载到您的浏览器中,以防止说。。。一些网站在你的计算机上运行跟踪广告,广告加载一点javascript,显示一个图像(这样你就不知道你“感染”了,因为你看到了图像),然后该代码监控你进入页面的每一次按键,并将其引用到其主服务器。假设它监视书签(可以在JS中完成)并查看您所在的银行?有人吗?