web-dev-qa-db-ja.com

シングルページアプリでの認証のセキュリティ

シングルページアプリで認証を実行する最も安全な方法は何ですか?特定のクライアント側またはサーバー側のフレームワークについて話しているのではなく、一般的なガイドラインまたはベストプラクティスについて話しているだけです。すべての通信は主にsockJSを介して転送されます。

また、OAuthは問題外です。

6
Daniel

ここに2つの出発点があると思います。

単一のWebアプリと同じサーバー上のWebサービス/ RESTサービス

そうすることは珍しいことではなく、必ずしも悪いことでもありませんし、明らかに最も簡単な方法でもあります。選択した認証(基本、ダイジェスト、フォームなど)に関係なく、APIとアプリはサーバー上の同じユーザーセッションを共有します。つまり、いくつかのことを意味します。

  • APIは、ユーザーがログに記録されているかどうかを簡単に検出し、そのアクセス許可、ロール、またはユーザーが特定のアクションの実行を許可されているかどうかを知るために必要なものを取得できます。
  • APIとアプリの両方を同時にデプロイできます。
  • アプリのスケーリングは簡単で、APIとアプリの両方を別のインスタンスにデプロイするだけです。負荷分散も簡単です。
  • アプリの監視は簡単です。
  • マイナス面として、別のアプリでこのAPIを使用する場合は、この新しいアプリを同じサーバーに保存するか、ユーザーのログインについてネゴシエートする必要があります(たとえば、資格情報をサーバーに送信するなど)。新しいアプリがWebアプリでない場合は、さらに複雑になる可能性があります。
  • 別のポイント:それが単一のWebアプリであっても、ほとんどの場合、画像やその他のリソースをロードします。 APIの使用率が高い場合、アプリ(通常は「大きな」HTMLファイル)やその他のクライアントリソースの読み込み時間に影響を与える可能性があります。これを防ぐ方法の1つは、JavaScriptファイル、CSSスタイルシート、および画像に [〜#〜] cdn [〜#〜] を使用することです。

このアプローチは、単純なWebサイトをすばやく起動する場合や、他のサービスからアクセスする必要がないAPIに完全に適していると思います。そして、そのアプローチから始めたとしても(プログラミングに関してはすべてが可能であることはわかっていますよね?)いつでも、分割されたAPI /アプリモデルに切り替えることができます。

1つのサーバー上のWebサービス/ RESTサービスと別のサーバー上のアプリ

「外部」APIにリンクされたSPA、またはサーバーの別のインスタンスに保存されているAPIに対してユーザーを認証するための今日のベストプラクティスは、OAuthを模倣することです。キーは...キー、またはメインサーバーから取得したトークンを使用します。基本的なフローは次のとおりです。

  1. メインアプリ(アプリがホストされている場所)で認証する
  2. 認証が成功した場合は、トークンを作成し、それをHTTP応答(Cookieなど)で送信します。
  3. APIにアクセスする必要があるときはいつでも、トークンを送信します。たとえば、カスタムHTTPリクエストヘッダーで送信できます。
  4. APIはリクエストを受け取り、次をチェックします:
    1. リクエストされたリソースにトークンが必要な場合、それ以外の場合は問題ありません(例:ゲスト、認証されていないユーザーが利用できる情報を返す)
    2. トークンがある場合は、それがまだ受け入れ可能かどうかを確認します。トークンの有効期限をいつどのように有効にするかを決定するのは、トークンの有効期限戦略を設計するさまざまな方法です。
    3. 応答データを返す(オプションで、更新されたトークンを使用)

このアプローチにより、次のことが可能になります。

  • APIを、それを使用するアプリから、およびユーザーシステム自体から分離します。確かに、どういうわけかトークンを解釈する必要がありますが、ユーザーデータがどこにどのように格納されているかを知る必要はありません。新しいWebアプリまたはクライアント/サーバーアプリからこのAPIにアクセスする場合、必要なのは適切なトークンだけです。
  • 個別に展開します。たとえば、APIを更新または修正しても、単一のアプリサーバーがダウンすることはありません。
  • APIの使用状況のみを監視します。

結論として、決定する前にKISSおよびYAGNIの原則を適用します。また、いつでも1つのモデルから別のモデルに移動できることを覚えておいてください。

7
Jalayn

この投稿をチェックしてください HTML5 WebアプリでのOAuth2の使用 。 @jandersenの回答は、単一ページアプリケーションでの リソース所有者のパスワード資格情報 フローの使用についての適切な説明を提供します。いずれの場合でも、このアプリの推奨フローは Implicit Grant です。実際、参照されている投稿に対する@jandersenの応答は、暗黙の付与に近いものとして機能するようにリソース所有者のパスワード資格情報を微調整することに関するものです。

0
Daniel Cerecedo