10

node.js モジュール経由で送信される HTTPS リクエストと XMLHttpRequest 経由で送信される HTTPS リクエストの違いは何ですか?

HTTPS GET リクエストを amazon aws に送信して、javascript (XMLHttpRequest) からセキュリティ トークンを取得しようとしていますが、常に「Origin http://my_ip is not allowed by Access-Control-Allow-Origin」で失敗しますが、 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);
});

誰でもこれがどのように機能するか説明できますか?

4

3 に答える 3

11

ブラウザーは、 Same Origin Policyによって制約されます。Node.js はそうではありません。

つまり、ブラウザーは、スクリプトがスクリプトをロードしたページと同じドメイン内のサイトに対してのみ、XHR を介して HTTP 要求を作成できるようにします。ただし、Node.js では、任意のドメインへの HTTP リクエストが許可されます。

(ブラウザーの話は現在、CORS に少し関係していますが、ここではまだ基本的な問題です。)

編集— 詳しく説明すると、あなたの質問を読み直したので、CORS は協調プロトコルです。インターネット上のサーバーは、通常、誰にでもコンテンツを提供します。それが Web サーバーを実行する上での要点です。CORS は、リクエスタが要求しない限り、HTTP リクエストとは関係ありません。「http://xyz/something」という URL があり、それをブラウザのアドレス バーに入力すると、ブラウザは躊躇なくそのサイトに HTTP リクエストを発行します。同一生成元ポリシー (および CORS) は、別のドメイン (「xyz」ではない) のサイトのページ内のコードが XHR 経由で HTTP 要求を実行しようとした場合にのみ機能します。その場合、ブラウザは「xyz」サイトにアクセスについて尋ねます。デフォルトの答えは「いいえ」ですが、それは'サーバーではなく、そのルールを課します。

于 2012-06-27T16:59:52.687 に答える
2

環境の違いです。通常、任意のHTTPリクエストをどこにでも自由に送信できます(このサイトにリクエストを送信することで、現在行っているように)。

Node.jsは、ユーザーが提供するプログラムに代わって実行されるため、おそらく信頼されます。そのため、デフォルトでは制限はありません。信頼できないコードを含めて実行する場合は、任意の制限を追加できます。サンドボックスに関するアイデアについては、お気に入りの検索エンジンで「Node.jsの信頼できないコード」を確認してください。

一方、ブラウザは、ほとんどの場合、信頼できないコードを実行しますが、ユーザーに代わって、可能なすべての権限を使用します。すべてのブラウザが同じように機能するには、ブラウザの環境を標準化する必要があるため、一連のセキュリティポリシーが作成者間で合意され、同じオリジンポリシーとその後のCORSに従ってJavaScriptから送信されるXHR接続の制御がブラウザに実装されました。ブラウザ自体がこれらの制限を制御し、JavaScriptやリモートサーバーは制御しません。別の言語を選択した場合も、環境によって課せられる制限とまったく同じになります。

于 2012-06-27T17:27:50.923 に答える
1

node.js はサーバー側の言語です。.js 拡張子と混同しないでください。あなたがそれに慣れていないとき、それは常に非常に多くの混乱を引き起こします. そのため、php や C++ によく似ています。どんなリクエストでも、どこにでも送信できます。任意のサイトにアクセスします (https 要求)。しかし、ブラウザの JavaScript では、これはクライアント側の言語です。ブラウザーは、別のサーバーからページにアクセスすることを許可しません。host.com:80 にいるとします。host.com:80/* からのデータにのみアクセスできます。host2.com や something.host.com ではありません

これは node.js には適用されません

于 2012-06-27T17:03:10.073 に答える