web-dev-qa-db-ja.com

内部通信時のマイクロサービスセッションデータ

タイトルが正しいかわからないので、もっと良いタイトルを思いついたら教えてください。

シナリオは次のとおりです。

  1. REST APIをクライアント(Webおよびモバイルアプリ)に公開するAPIゲートウェイがあります。
  2. ログインしたユーザーを追跡する「セッション」マイクロサービスがあります。ユーザーがログインすると、新しいセッションがこのマイクロサービスに保存され、認証を必要とするリクエストごとに、API GWは最初にこのマイクロサービスと通信してセッショントークンを検証し、セッション関連情報(ユーザーID、権限リストなど)を取得します。
  3. セッションを検証した後、API GWは、要求を満たすために必要な他のマイクロサービスへの呼び出しをいくつか実行しますが、それらのいくつかはログインユーザーIDを必要とします。

簡単な例は、ログインしたユーザーが自分のブログに投稿を追加したいブログのWebサイトです。

  1. POST to/postsに対して、彼の新しいブログ投稿とセッショントークン(一意のセッションID)を実行します。
  2. リクエストはAPI GWに到達します。
  3. API GWは、トークンを検証してセッションデータ(ユーザーID、権限)を返すセッションマイクロサービスに対してセッショントークンをチェックします
  4. API GWは、投稿をユーザーに追加するために、投稿マイクロサービスにリクエストを送信する必要があります。

問題は4thステップ-考えられることより良い実践についてです:

  • ユーザーIDをpostオブジェクトの一部として送信します。つまり、postサービスは認証/認証を処理せず、オブジェクトの基本的な検証後にオブジェクトを保存するだけです。

    [〜#〜]または[〜#〜]

  • セッション情報を含む何らかのJWTを使用し、それをブログ投稿とともに投稿サービスに渡します。ユーザーIDなしで渡された投稿データを格納するときに、JWTを検証し、JWTからのユーザーIDを使用する必要があります。 ?

1
Ron Dadon

両方を使用します。

まず、JWTを使用してクライアント側セッションを置き換えることはできません。彼らは別の問題を解決するために作られました。詳細については、参照リンクをご覧ください。

参照リンク http://cryto.net/~joepie91/blog/2016/06/13/stop-using-jwt-for-sessions/

少し前に同じ質問がありました。私の問題を解決した方法は次のとおりです。

バックエンドにセッ​​ションを保存し(一定の時間の複雑さを備えた高可用性Key-ValueストアO(1))、JWTを使用してユーザーIDを保存するか、バックエンドで取得できるようにセッションID

このリンクには興味深い実装があります。 https://sequoia.makes.software/session-management-with-microservices/

これにはいくつかのバリエーションがあります。覚えておかなければならない主な概念は、仕事に適切なツールを使用し、TRYをシンプルに保つことです。

1
Felipe Gusmao