11

私は2つのサーバーを用意していますが、1つはフロントエンドアプリケーションとユーザー認証を担当しています。このサーバーは、JavaScriptでコード化された単一のページアプリケーションをレンダリングしています。このjavascriptアプリケーションは、この2番目のサーバーでホストされているREST APIを通じて2番目のサーバーからデータをレンダリングしています。1ページのアプリケーションとサーバーの間にREST APIを保護する方法はありますか?

この2番目のサーバーを保護したいと思います。私はフロントエンドアプリケーションだけがバックエンドサーバーを呼び出すことができるようにしたいと思います。

誰でもブラウザから残りのAPIを呼び出してデータをクエリできます。

ありがとうございました。

+0

なぜ2つの異なるサーバーにいる必要がありますか?異なる言語を使用していますか? – mpm

+0

いいえ、両方のサーバーで同じ言語が使用されています。私はスケーラビリティの理由と懸念の分離のために、残りのapiを1つのサーバーに配置し、フロントエンドを他のサーバーに配置しました。 – Michael

答えて

11

ブラウザクライアントでjavascriptアプリケーションが実行できることは、他のユーザーが見ることができ、アプリの外にあるバックエンドのREST APIサーバーにアクセスすることができます。

実際には、クライアントアプリケーションがJavaScriptで実装されているということは重要ではありません。コントロール外のマシンで実行されるアプリケーションは完全に信頼できません。 javascriptアプリケーションでViewSourceよりもネイティブコードをエンジニアリングするのは少し難しいですが、不可能ではありません。あいまいさによってセキュリティに頼ることは決してありません。

ブラウザアプリにログインして信頼できるアイデンティティプロバイダから認証トークンを取得させ、ブラウザアプリケーションがREST APIに対して行うすべてのリクエストに認証トークンを提示するようにすることをお勧めします。 REST APIは、認証トークンを検証して、それが信頼できるプロバイダからのものであるかどうか、およびトークン内の名前のユーザーがREST APIの使用を許可されているかどうかを確認できます。

これは、アプリケーションではなくユーザーにREST API呼び出しの承認を行い、世界中のブラウザアプリケーションに存在しない秘密(ユーザー資格情報)を使用します。

これを使用すると、どのユーザーが通話しているかに基づいてREST APIへのアクセスを制限できます。どのアプリケーションが要求を行っているかに基づいてアクセスをフィルタリングすることもできますが、アプリケーションの説明をユーザーの資格情報よりもコピーする方が簡単であるため、プライマリセキュリティ要素ではなく、これがマイナーポイントになります。

もう1つの選択肢は、WebアプリケーションをREST APIサービスのプロキシとして機能させ、ブラウザアプリケーションがREST APIからデータを取得するためにWebサーバーを経由する必要があることです。これは、ブラウザ・アプリケーションが、Webサーバーが、真正のアプリケーションからのものであり他の誰かからのものではないことを確認するために確認できるセッション状態を維持している場合に有効です。これにより、REST APIをパブリックネットワークから保護することができますが、認証の問題は実際には変更されません。アプリケーションの要求を識別するためにセッションコンテキストを増やすWebサーバーに移動したばかりですinterloper要求。あなたが本当にあなたのアプリケーションセッション状態に自信を持っていない限り、最高ではありません。

どのようなソリューションを選択しても、クライアント側のアプリケーション(ブラウザなど)からREST APIにアクセスできる場合は、公開されているREST APIであり、そのまま扱う(要塞化する)必要があります。クライアントマシンからアクセスできるプライベートWeb APIはありません。

+0

お返事ありがとうございます。私は、信頼された認証トークンを信頼できるプロバイダから受け取るというあなたの考えが好きです。あなたが説明しているのは基本的にoAuthの仕組みですか?ユーザーがGoogleや他の信頼できるプロバイダで自分のアプリに認証しているとします。彼らは返されたものを受け取り、私はこれを使って私のAPI呼び出しに署名することができますか? – Michael

+0

はい、OAuthはそのようなトークンシステムです。 SAMLもそうです。はい.Googleなどから発行されたトークンを使用して、APIの呼び出し元を認証できます。 APIはトークンを検証する必要があります(既知の証明書またはコールプロバイダーに対する署名を確認してください)。 Googleではシステムでこれを行うためのAPIを提供しているため、ワイヤプロトコルとパケットフォーマットの詳細を知る必要はありません。 – dthorpe

+1

Googleと他のアイデンティティプロバイダは、ユーザーの認証のみを提供することに注意してください。 APIは発信者のIDが本物であると信じることができますが、依然として自分で認証を決定する必要があります。 IDとロール/エンタイトルメント/許可情報を提供するフル機能のセキュアトークンサーバー(STS)システムがあります。 Google、FBなどはIDのみを提供します。 – dthorpe

関連する問題