web-dev-qa-db-ja.com

秘密のデータをクライアント側のWebアプリケーションに安全に保存する

私はこのクライアントアプリケーションをすべてクライアント側のテクノロジ(HTML、CSS、JavaScript/AngularJSなど)にする予定です。このWebアプリケーションは、データにアクセスして変更するためにREST APIと対話します。現在、認証システムのタイプは未定ですREST APIを使用します。

私の理解から、あらゆるタイプのAPI認証システム(APIキー、OAuth 1/2など...)には、秘密にしておく必要がある特定のデータが含まれます。そうしないと、アクセスが危険にさらされる可能性があります。APIキーの場合、キー自体は秘密である必要があります。OAuth 2の場合、クライアントの秘密/アクセストークン/更新トークンは秘密にしておく必要があります。関係する4つのキーのいくつかOAuth 1は秘密にしておく必要があります(OAuth 1での経験は多すぎません)。これを保存する方法があるかどうか考えていましたサーバーサイドにある中間層のない純粋なクライアントサイドWebアプリケーションの秘密のもの。

私はこれについて考えていて、それをする場所は考えられません。つまり、誰でもソースを表示したり、コンソールを開いてデータを取得したりできるため、JavaScriptに保存することはできません。 localStorageの安全性と、ユーザーがそのデータにアクセス/変更できるかどうかは、100%わかりません。ローカルストレージが安全であったとしても、データをそこに取り込むために考えられる2つの方法はそうではありません。 1つの方法は、私が考えることができる最も安全でないことであるjavascriptソースコードにデータを格納することです。 OAuth 2のようなものを使用していて、残りのAPI自体がトークンを提供する場合、トークンは返されるため、安全ではありません(最初のオプションより優れています)。コンピュータが行っている要求を見ることができる誰でも見ることができるプレーンテキストとして。

完全にクライアント側で実行されているアプリケーションに、サーバー側に何らかの中間層がなくても秘密のデータを安全に保存できるようにする方法はありますか?

11
ryanzec

いいえ、完全に安全にすることはできません。ユーザーがハードウェアを制御しており、あなたは何かを彼らの手に渡らないようにしようとしています。最終的に、彼らは何らかの手段でそれを得ることができます。 JavaScriptで作業しているため、ユーザーがハードウェアを制御するだけでなく、実行中のサンドボックスも制御するため、通常のコンピューターアプリケーションよりも位置がかなり悪くなります。

あなたは物事を隠し、物事に到達するのを難しくすることができますが、結局、彼らが十分に頑張れば、彼らはそれを手に入れることができます。

9
Michael Kohne

セキュリティシステムを設計するときは、常に脅威モデルについて考える必要があります。 "Make it secure"はばかげた要件であり、実行可能でも検証可能でもありません。 "ユーザーがアプリケーションからアクセストークンを抽出できないようにする"の方がはるかに優れており、ソリューションの境界を定義します。 "他のユーザーがユーザーのアクセストークンを取得できないようにする"も優れており、完全に異なるソリューションスペースを定義します。一方のソリューションは必ずしも他方を解決するわけではありません(e.g。、WiFiが関係する場合、後者はSSLを絶対に必要としますが、前者にはまったく影響しません)。

2
Ross Patterson

1つのオプションは、REST APIがユーザーのログインに基づいてアクセスを許可するかどうかを指定することです。これは、セッションベースのトークン(GUID、ハッシュされた文字列、好きなもの)を返すことができます。他のRESTアクセスを認証するためのAPI呼び出し

ユーザーのログイン情報をクライアントマシンに保存することを心配している場合は、その必要はありませんが、ユーザーは毎回アカウントとパスワードの情報を入力する必要があります。

OAuth et alにはそれほど詳しくありませんが、認証情報を永続的に保存するための上記の説得力のある理由はありません...

0
Steven A. Lowe