2016-08-29 5 views
3

状況単一ページWeb Appsは、CORSとセキュリティ上の懸念

  1. 私は(角を使用して)単一ページ - Webアプリケーションを書いています。 SPAと呼ぶことができます
  2. もう1人のチームメイトが(Node.jsを使って)いくつかのAPIを書いています。ことができます呼び出しが
  3. 私のSPAは、ログイン/ passwdファイルを使用してサーバにログインし、

私のチームメイトは、セッションを追跡するためにクッキーを使用することを決定しましたいくつかのものをやっているサーバーです。このため、ログインに成功すると、HTTPのみのクッキーは、ウェブブラウザに設定するSPAがにロードされている。

問題

我々はサーバーののpublic_htmlディレクトリにSPAを入れた場合は、すべてうまくいく。ただし、SPAはAPIコードの一部として作成されます。これにより、SPAへのすべてのバージョンのアップグレードでAPIのアップグレードが必要になるため、ビルドプロセスが中断されます。

静的SPAファイルのみを処理する別個のWebサーバーでSPAをホストすると、CORSの問題が発生します。 SPAはアクセスしようとしているAPIとは異なるオリジンから来ているため、ブラウザはajax呼び出しをブロックします。これを克服するには、サーバー側にAccess-Control-Allow-Originを適切に設定する必要があります。私はまた、Access-Control-Allow-Credentials:trueを設定して、ブラウザにCookieの設定/送信を指示する必要があることを理解しています。

可能な解決策

  1. 私たちは、サーバーののpublic_htmlディレクトリにSPAがアップグレードされるたびにgitのプルを行い、ビルドプロセスを作成します。私はクライアントとサーバーのアップグレードを別々に保つためにこれを回避しようとしています。

  2. プロキシという種類の状況が発生します。サーバーはSPAファイルを格納しませんが、SPAファイルをホストする別のサーバーからオンデマンドで収集します。この場合、WebブラウザはSPAファイルとその後の同じ原点からのajax呼び出しを表示します。

  3. レスポンスにAccess-Control-Allow-Origin:*を設定するようにサーバーをコーディングします。まず、これはあまりにも開いており、安全ではないように見えます。 本当に不安でしょうか、それとも私の認識ですか?また、Access-Control-Allow-Credentials:trueを設定しているため、ChromeはCannot use wildcard in Access-Control-Allow-Origin when credentials flag is true.と申し立てます。これを克服するためには、Access-Control-Allow-Originに正確な起源(おそらく正規表現を使用)を入れなければなりません。これにより、SPAを未知のドメインのユーザーに配布することが厳しく制限される可能性があります。

  4. サーバーAPIデザイナーの場合は、Cookieベースの認証が推奨されます。 SPAの認証を処理する方法はありますか? OAuth2.0 and JWT based Authenticationは、クッキーベースの認証がSPAに適していないことを示唆しているようです。長所/短所

上記のオプションについてご意見をお寄せください。前もって感謝します。

答えて

2

あなたの専門用語は混乱していると思います。 APIはserverではなく、serverのマシン上に存在するアプリケーションではありません。NodeJS APIを作成する場合は、Nginxサーバーをその前にリバースプロキシとして使用することをお勧めします。 Nginxサーバー、API、およびSPAファイルをすべて同じマシン上に置いておきたい場合は、APIをディレクトリに、SPAを別のディレクトリに展開し、Nginxに要求に応じてルーティングさせることができます。

私は解決策2が行く方法だと思います。そこから、インスタンス数を増やし(AWSを使用している場合)、それらの負荷を分散したり、APIを独自のアプリケーションサーバーに分けたりすることで、簡単に拡張できます。

認証に関する限り。私はいつも、SPAまたはAPIリクエストのクッキーに対するアクセストークンでヘッダー認証を使用することを推奨してきました。ローカルのストレージを介してアクセストークンを保存することはできますが、各リクエストは自己完結型で、ブラウザに永続的な文字列を保存する必要はありません。

+0

ありがとうございます。したがって、おそらくあなたが好むソリューション2は、SPAとNode.js Appの両方が同じマシン上にあるという制限がありません。 SPAを持つマシンがNode.js App(またはクライアント/サーバの用語ではServer)を保持するマシンからアクセスできる限り、動作します。正しい? – Amarsh

+0

エンドポイントがNode APIとSPAファイルの両方にアクセスできるマシン/サーバで終わる限り、本当にです。何かあれば、あなたのSPAファイルをNginx Serverに置くことをお勧めします。次に、ここからNginxに別のアプリケーションサーバー上のNode APIへのリクエストを指示させます。 – Dan

+0

もう一度ありがとうございます。いくつかのコメントを待つことができます。アクセストークンを使用したヘッダー認証のために私が指摘できる文献はありますか? http://self-issued.info/docs/draft-ietf-oauth-v2-bearer.htmlと同じですか? – Amarsh

2

私は解決策2または3

2のいずれかとなるだろう:あなたは、同じサーバー上の両方(WebページおよびAPI)を設定(またはリバースプロキシを使用する)ことができ外部の視点から、彼らは同じ起源を共有するように。

3:APIの場合、同じ発信元ポリシーはあまり重要ではありません。 APIは、あなたのウェブアプリケーションの一部ではないクライアントによって消費されることになります。 私はallow lax allow originヘッダーを設定することに何の問題も見ません。そして私はワイルドカードを意味するわけではありません。あなたのウェブページの起源を追加するだけです。なぜそれをワイルドカードしたいのですか?

関連する問題