web-dev-qa-db-ja.com

バックエンドでのトークンベースの認証とセッションベースの認証

クライアントと通信するRESTful API(Koa.js)を作成してアプリケーションを構築しようとしています(ReactおよびIonicを使用するモバイル)。しかし、認証。

だから私の質問は、このシナリオでどのように認証を実装する必要がありますか?ステートレストークンベースの認証だけを使用しても問題ありませんか、それともWebクライアントにセッションベースの認証を実装する必要がありますか?

前もって感謝します。

4
Junior Miranda

tl; dr:特定のケースでは、トークンベースの認証を使用しない理由はありません。 OAuthプロバイダーはおそらくとにかくJWTを提供します。トークンが適切に保護されていることを確認する必要があります(TLSを使用し、適切なライフタイムを選択してください)。


状態を維持するためのセッションに本質的に何か問題があるというのは少し神話です。 HTTPはステートレスであり、REST(基礎となるプロトコルを厳密に反映しているため))もステートレスである場合に最適です。

ただし、完全にステートレスなアプリケーションは非常に制限されています。自明ではないことについては、どこかにどこかの状態を保存する必要があります。クライアントにこの状態を(Cookieまたはその他のローカルストレージの形式で)保存するように頼むか、サーバーに何らかの形式で保存するよう依頼することができます。考慮すべき2つの主な考慮事項は次のとおりです。

  • 保存する必要がある状態の量
  • データの機密性

アプリケーションの状態がたくさんある場合、それをクライアントに格納し、すべてのリクエストとともに渡すことで、アプリケーションのレイテンシが増加し、データが非常に機密性が高い場合は、適切な保護(暗号化)を提供したことを確認する必要があります。状態をクライアントにまったく渡さないでください。

OAuth2の場合、クライアントに返されるトークンは実質的に状態(認証を表す)です。これらは、JWTの形式(情報はトークン自体に含まれています)か、サーバーが関連情報を検索するために使用できる参照トークンの形式のいずれかです。

1
richzilla

ステートレストークンベースの認証だけを使用してもかまいません...

はい、そうです。 stateless制約を正当に重視し、その利点を考慮すると、トークンベースのプロトコルが大きな役割を果たすことがわかります。全体としては、分散型ソリューションについてです。

または、Webクライアントにセッションベースの認証も実装する必要がありますか?

私の経験では、同じWeb API内でステートフルセッションとステートレスセッションのバランスを取ることは困難であり、最終的には逆効果です。ステートフルAPIとステートレスAPIは互いに何かを必要とし、2つの異なるセッションを同時に両方とも調停しようとしているためですシステムの側面(クライアントとサーバー)。

このシナリオで認証を実装するにはどうすればよいですか?

一貫性を保つ、すべてのクライアントを平等に扱い、リクエストがどこから来ても同じソリューションを再利用できるようにします。結局のところ、これらはすべてWebクライアントであり、同じルールでプレイする必要があります。 HTTPのもの。

ここではWeb APIについて説明しているため、ステートレスソリューション(クライアント側のトークンとセッション)を検討してください。これは、Webに最適なソリューションであるためです。 Webに準拠すればするほど、そのアーキテクチャから得られる利点が増えます。

1
Laiv

RESTを実装する際のベストプラクティスの1つは、Webサーバーの状態を回避することです。セッションはデフォルトでWebサーバーに実装される傾向があります(もちろん、セッション状態をWebサーバーに保存しないようにする方法があります)。 JWTトークンは認証に状態を必要としないため、RESTを使用する場合に最も意味があります。

新しいアプリケーションを構築しているので、トークンベースの認証を使用できるはずです。