2017-02-07 1 views
1

先週、誰かが10,000人のメッセージをランダムユーザーに送信するようにメッセージAPIを自動化しました。私たちはJWTでセキュリティを提供する予定ですが、強制的なユーザー認証システムはありません。ユーザーアカウントなしのAPIセキュリティ

1時間の有効期限を持つトークンを使用することを検討しましたが、これは少し冗長な感じです。これらの状況下でJWTを利用するための最良のアプローチは何ですか?

単純な公開されたAPIの例は、となります。モバイルへのアプリリンクを送信します。 SMSを介して。

+0

ここからJWTを取得する予定はありますか?あなたのAPIへのアクセスを許可するためにそれを使用したいと思いますか? – ThePragmatist

+0

はい、ページが読み込まれている可能性があります。私はJWTを取得するためにAPI呼び出しを行います。しかし、それは役に立たないと分かった。 – scripter

答えて

1

私の仕事は、モバイルスペースでこのようなことをする製品を扱うことです。あなたの質問に答えている間に私がリンク(approov)を追加した場合、それは完全に正しいとみなされますか?

私はいくつかの提案/観察があります。

できるだけ最初に行うことは、クライアント上で実行されているコードを信頼する必要がないようにすることです。誰かがそれを侵害してAPIにアクセスできる可能性は常にあります。

システムのユーザー認証がないため、これを使用してAPIを保護するオプションがありません。

いくつかのレベルの保護を得る最も簡単な方法は、クライアントに埋め込むAPIキーを追加することです。これを使用しようとする最初の方法は、ヘッダー内のAPIリクエストとともに送信することです。次に、サーバー上でAPIキーが存在することを確認します。その問題は、誰かがあなたのクライアントを握って、トラフィックを調べて、HTTP要求の1つから鍵を持ち上げることができるということです。

HTTPSを使用してサーバーへの接続を保護することはできますが、クライアントがあれば誰かが接続をMITMするのは比較的簡単です。 Pinning接続がこれを助けますが、誰かが十分に決定されていれば、ピンインを実行しているバイナリまたはjavascriptをハックすることができます。

理想的には、認証情報を直接送信しないようにします。これを行うには、クライアントにAPIキーとともに秘密情報を埋め込む必要があります。シークレットを使用して、サーバーに送信するリクエストに署名します。 APIシークレットをHMAC関数のキーとして使用して、メッセージ本体のHMACを計算することができます。 APIキーを使用して、サーバー上のHMACを確認するときに使用する秘密を識別します。これの利点は、HTTP経由で秘密情報を送信しないことです。しかし、依然としてクライアントから鍵を盗むことは可能です。 HMACs on security.stackexchange.com

あなたのコードの中でそれを難読化することで秘密を隠そうとすることができますが、あなたのクライアントがこの言語で書かれた言語によって多かれ少なかれ効果的かもしれません。

この時点では、APIへのアクセスの重要性と重要性、APIの保護に費やしたいエンジニアリングの努力の程度を考慮する必要があります。あなたは、誰かがあなたのシステムに侵入したいと思う可能性のある仕事量を考慮する必要もあります。

もしあなたが非常に熱心であれば、このスペースの一部をカバーする商用ソリューションもありますが、それらは現金を必要とします。私の同僚はapi key articleと書いています。これは、私たちの小さなニッチなモバイルの観点から、これらのもののいくつかをさらに詳しくカバーしています。

+0

今のところNginxの設定でレートリミットを使用していますが、同じIPからのリクエストが多すぎると、ドロップを開始して最終的にブロックします。良い記事 - https://lincolnloop.com/blog/rate-limiting-nginx/ – scripter

+0

オプションとして言及することを全く忘れていました。私はあなた自身でそれを見つけてうれしいです! – ThePragmatist

+0

ありがとう:)それはあなたが与えた良い情報です。いくつかの実装も試みます。 – scripter

関連する問題