2017-01-12 21 views
4

私は、独自の認証と承認メカニズムを備えたRESTアプリケーションを開発しています。 JSON Webトークンを認証に使用したいと思います。以下は有効かつ安全な実装ですか?JWT認証とリフレッシュトークンの実装

  1. ユーザー名とパスワードを受け入れ、認証を行うためのREST APIが開発されます。使用されるHTTPメソッドはPOSTなので、キャッシュはありません。また、転送時にセキュリティのためのSSLがあります
  2. 認証時に、アクセストークンとリフレッシュトークンの2つのJWTが作成されます。リフレッシュ・トークンの有効性はより長くなります。両方のトークンはCookieで書かれ、後続の要求ごとに送信されます。
  3. すべてのREST API呼び出しで、トークンがHTTPヘッダーから取得されます。アクセストークンが期限切れでない場合は、ユーザーの権限を確認し、それに応じてアクセスを許可します。アクセストークンが有効期限切れで、更新トークンが有効な場合は、新しいアクセストークンを再作成し、有効期限を変更してトークンを更新します(認証に必要なすべてのチェックを行い、認証の権利が失効しないことを確認します)。
  4. ログインが完了するまで、CookieをリセットするログアウトREST API、したがってその後のAPI呼び出しは拒否されます。

トークンここでリフレッシュの私の理解では、次のとおりです。

によりリフレッシュトークンの存在のために、我々は、アクセストークンのための短い有効期間を保つことができ、ユーザーがあること(アクセストークンの有効期限に)頻繁に確認してくださいまだログインを許可されています。

私が間違っている場合は、私に修正してください。

答えて

3

REST APIはユーザー名とパスワードを受け入れ、 認証を行うために開発されます。使用するHTTPメソッドはPOSTなので、 にはキャッシングがありません。また、 通過時のセキュリティのためのSSLがあります

これはほとんどの方法であり、ここではうまくいきます。

認証時に、アクセストークン とリフレッシュトークンが2つ作成されます。リフレッシュ・トークンの有効性はより長くなります。彼らは自己それで私は危険ではないクッキーのトークンを格納するすべての 後続の要求

に送信されるように トークンは、クッキーに書き込まれますが、何らかの形でのサーバー上のあなたJWTモジュールを取得する場合、両方のそこからCSRF攻撃の脆弱性を読み取ってください。CSRFトークンを使用しない限り、どのWebページでもユーザーのブラウザがフォーム+あなたのサイトのCookieをサーバーに送信することができます。だから一般的には、それらはlocalStorageに格納され、毎回リクエストヘッダに "手動で"追加されます。

すべてのREST API呼び出しで、トークンはHTTP ヘッダーから取得されます。アクセストークンが期限切れでない場合は、ユーザの の特権をチェックし、それに応じてアクセスを許可します。アクセストークンが 有効期限が切れているが、リフレッシュトークンが有効であれば、トークンの新しいアクセスを再作成し、新しい有効期限付き トークン(取り消されていない認証すること ユーザー権利を確保するために必要なすべてのチェックを行う)をリフレッシュし クッキーを通じて送り返さ

クッキーの危険性は別として、安全だと思われます。

クッキーをリセットするログアウトREST APIを提供します。したがって、ログインが完了するまで 以降のAPI呼び出しは拒否されます。

API呼び出しを行う必要はありません。単にクッキーまたはlocalStorageオブジェクトを消去して、クライアントが欠落しているトークンを壊さないようにするだけです。

express-jwtモジュールの標準では、トークンがCookieよりも強く推奨される「Authorization:Bearer [Token]」ヘッダーに含まれていると想定しています。 localStorage APIはIE8まで利用できるので、あなたは良いはずです。

編集:

まず彼らはしばしば同じものであると考えられているので、それはXSSとCSRF攻撃の違いを知っておくことが重要です。

XSSは、他のユーザーのブラウザでドメイン上で実行されている安全でないJSをユーザーが取得したときに、localStorageまたはセッション内のJWTとCookie内のJWTのどちらも安全です。 CookieにhttpOnlyフラグを設定すると、直接アクセスすることはできませんが、ブラウザはAJAXリクエストを使用してサーバーに送信します。これが一般的にあなたが運が悪い場合に起こります。これを防ぐには、ブラウザに送信されたすべてのユーザー入力をエスケープしてください。

スクリプトタグやiframeを使用してサードパーティ製のJSを読み込むと、気をつけなければlocalStorageが妥協する可能性がありますが、ここで手伝ってもらえませんでした。

CSRFは、他のドメインがブラウザに自動的にCookieを送信することによって、通常のHTMLフォームをサーバーに送信しようとしている場合にのみ発生します。フレームワークは、一意のランダムな文字列を隠しフィールドとして挿入し、サブミット時にそれらを再度チェックすることでこれを防ぎます。 localStorageのJWTは、各ドメインがそれ自身の別個のlocalStorage領域を取得するので、これから安全です。

しかし、最終的には、サービスが単一のドメインを使用するかどうかによって異なります。この場合、httpOnly Cookieは安全で設定が簡単ですが、api.domainなどの複数のドメインにサービスを広めたい場合.com + app.domain.comを追加するか、localstorageやその他のネイティブストレージエリアにJWTを保存する必要があるネイティブアプリを追加します。

希望すると便利です。

+1

ありがとうございました!ローカルストレージを推奨しているので、XSS攻撃に対するローカルストレージの脆弱性や、それを防ぐための安全な解決方法があるかどうかについてのあなたの意見を知りたいと思っています。私の理解は、現代のWebフレームワークは、CSRF攻撃からそれらを保護する方法でクッキーを処理していました。 –

+0

私のポストを編集するつもりです、委員会は長すぎるです:) –

+1

この答えは悪いOAuthの基本原則を完全に無視します –

0

トークンここでリフレッシュの私の理解では、次のとおりです。

によりリフレッシュトークンの存在のために、我々は、アクセストークンのための短い有効期間を保つことができ、ユーザーがあること(アクセストークンの有効期限に)頻繁に確認してくださいまだログインを許可されています。

私が間違っている場合は、私に修正してください。

あなたがOAuthのベアラトークンとしてJWTを使用しているとします(OAuth 2.0プロトコルに従うことを強くお勧めします)。

JWTで追加の認証(認証のタイムスタンプ)を要求すると、2つ目のトークンを削除して、アクセスをリフレッシュトークンとして送信することもできます(認証サーバーは新しいアクセストークントークンが有効な場合&許可時間内の認証時間)... ...確かに、それは標準に従うことも良いです;)

とにかく、難しくなったり、 JWTをリフレッシュトークンとして使用する前に考慮する必要があります。これは基本的に、長寿命のJWTを導入することを意味します。

  • 強制的なユーザーログアウト/件名別のトークン取り消しなどが必要ですか?ユーザーが不正であると特定された場合)
  • 特定のトークンの取り消し(ユーザーが端末を失った場合など)が必要ですか?
  • ...例えば、彼らは通常、サーバー側で状態のいくつかの種類を紹介する必要としてあなたは、長い生活トークンが持っているすべての可能な影響を考慮すべきであるあなたのユースケースに依存

(へ失効/ブラックリストを許可する)。 JWTコンセプトの美しさと安全性は、JWTが短命になっていることに留意してください。