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

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

我试图发送一个HTTPS GET请求到亚马逊aws从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); }); 

这工作

 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:// xyz / something”,并且您在浏览器的地址栏中input该地址,那么浏览器将毫不犹豫地向该站点发出HTTP请求。 当来自另一个域(不是“xyz”)的站点的页面中的某些代码尝试通过XHR运行HTTP请求时,相同来源策略(和CORS)才起作用。 在这种情况下,浏览器询问“xyz”网站的访问权限; 默认的答案是“否”,但这是浏览器施加该规则,而不是服务器。

这是环境的差异。 你通常可以自由发送任何HTTP请求(就像你现在正在向这个网站发送请求一样)。

Node.js代表您执行的程序,因此可能是可信的。 这就是为什么默认没有限制。 如果您希望包含并运行不受信任的代码,您可以添加任意限制 – 只需查看您最喜爱的search引擎“Node.js不可信代码”,以获取有关可用沙盒的一些想法。

另一方面,浏览器几乎总是运行不受信任的代码,但代表用户和他所有可能的权限。 由于浏览器的环境必须是所有浏览器都以相同方式工作的,所以作者之间就已经达成了一套安全策略,并且在浏览器中实现了根据相同的源策略和后来的CORS控制从JavaScript输出的XHR连接。 浏览器本身控制这些限制,而不是JavaScript或远程服务器。 如果你select另外一种语言,你也会有与环境相同的限制。

node.js是服务器端语言。 不要被.js扩展名困惑。 当你不熟悉的时候总会引起很多混乱。 所以它很像php或者C ++。 你可以随时随地发送任何请求。 访问任何网站(https请求)。 但在浏览器JavaScript中,这是一种客户端语言。 浏览器将不允许您从另一台服务器访问一个页面。 假设你在host.com:80。 您只能从host.com:80/*not host2.com甚至something.host.com访问数据

这个ddoesn'n不适用于node.js