web-dev-qa-db-ja.com

Django Rest APIの認証に何を使用すればよいですか?

私は this の記事を読んだだけで、なぜJWTがひどいのかについて。現在、認証に何を使用すればよいかわかりません。

コンテキスト:私が作成したAPIは、主にモバイルアプリ(iOSおよびAndroid)で使用されます。将来的には、Reactフロントエンドからもアクセスされるようになります。

過去には、トークン認証でDRFのビルドを使用しました。その後、電話はこのトークンをそれぞれのアプリのストレージに保存します。

今私は最近、これは安全ではなく、JWTを使用するべきだと言われました。 JWTを調査したところ、上記の記事が見つかりました。これは、JWTのサックと基本的なセッション認証の方が優れている理由を詳しく説明しています。しかし、私の知る限り、APIとして使用すると、DRFでセッション認証を使用できなくなりますか?

だから私の質問は?安全のために、DRFのどのツールを認証に使用すればよいですか?

5
J. Hesters

私はその記事の執筆者であり、JWTがひどくて愚かである理由について私が与えるやや人気のあるテクニカルトークです(@ joepie91が私がこれまでよりもはるかに優れていると雄弁に書いています: http:/ /cryto.net/~joepie91/blog/2016/06/13/stop-using-jwt-for-sessions/ )。

アプリケーションの要件(モバイルアプリ+両方がバックエンドAPIと通信するJSフロントエンドのみのアプリ)を考慮して、OpenID Connect承認コードフロー(モバイルアプリ用のPKCE付き)を使用することをお勧めします。

特にモバイルアプリの場合、すばらしいAppAuthライブラリを使用することをお勧めします: https://appauth.io/ (iOSとAndroidの両方に優れたライブラリがあります)。

さて、JWTの使用に反対する人々を公に集めたときに、なぜ私が何かにOpenID Connect(したがってJWT)を使用することをお勧めするのか疑問に思うかもしれません。

安全なアプリを構築する際にJWTを使用するのはかなりひどいです。それらは複雑で、ほとんどのライブラリは仕様が完全ではないため、JWT暗号化などのより高度な機能を使用すると、サービス間の大きな問題や互換性の問題が発生することはほぼ間違いありません。

さらに、JWTが認証で一般的になった理由は、JWTが認証と承認のデータをキャッシュするために頻繁に使用されるためです。この実践全体が、セキュリティの世界では大きな違いです。

機密データ(認証データや承認データなど)のキャッシュは、セキュリティのためにこれまでに実行できる最悪のことです。つまり、古い情報を信頼しています。 JWTの上に構築されたすべての現在の認証システムは、このナイーブに悩まされています。

JWTを使用してサイト/ APIを「高速化」しようとするうさぎの穴を掘り下げたら、すでにセキュリティの罪を犯しており、危険にさらされています。

さらに、人々がJWTの使用を開始し、危険にさらされていることに気づいたら、(他のコメンターが示唆しているように)すべてを集中化して失効リストの使用を開始し、悪いことが発生したときにトークンを取り消すことができるようにします。これにより、従来のセッション管理と同じ速度のペナルティが発生しますが、JWTがセッションCookieよりも「重い」ため、速度が低下するため、速度が低下します。

申し訳ありませんが、ここに私のアドバイスがあります:

  • realセキュリティが必要な場合は、サーバー側セッションを使用する必要があります。あなたの場合、これはAPIバックエンドからのセッションCookieのサポートを伴うため、reactアプリがAPIに対して認証するときに、APIは、reactアプリが認証のためにAPIサービスに通信するたびに自動的に使用する安全なCookieを設定します。また、モバイルアプリからCookieベースのAPIを使用する必要があります(私はネイティブモバイルアプリの作成に慣れていないため、このコンポーネントについてコメントすることはできません)。
  • 他のほぼすべての主要なWebアプリと同じくらいシンプルで同じ量のセキュリティが必要な場合は、OIDCを使用して、すぐに使えるオープンソースソリューションを使います。これは現在のところ最も簡単な方法であり、完璧ではありませんが、問題を解決できれば、たいした問題ではありません。

機密性の高いものを作成する場合は、可能であればサーバー側のセッションCookieを使用してください。さもないと?詳細を気にせず、流れに沿って進んでください。

5
rdegges

IMOには2つの適切なオプションがあります。

  1. データベースに保存されているセッションに対応するランダムな文字列を使用します。可能であれば、これが最良のオプションです。これらのセッションは長期であってはなりません。長期間のログインが必要な場合は、JWTトークンを使用した再認証を使用してください。
  2. 対称鍵(HMAC)で署名されたJWTを使用します。これはまだ安全ですが、より高速です。ただし、このオプションでは、帯域幅の要件がさらに厳しくなり、通常はランダムな文字列よりも遅くなります。
1
Peter Harmann