Handling authentication and authorization

読んだ本

Microservices Patterns: With examples in Java の13.3.3 Handling authentication and authorization

FTGO社のモノリシックサービスをマイクロサービスに置き換えるというシチュエーションを例にしてマイクロサービスの設計を解説

monolithic と micro serviceでの認証・認可

in-memory sessionでthread localな認証・認可を扱うだけでよかったモノリシックサービスに、 マイクロサービスを加えようとするときJWTのようなトークン認証を加える必要がある。

書籍の図とほぼ同じものであるが書き直した f:id:plm23-ccc:20200102172642p:plain

  1. ユーザー情報を含んだリクエストを送る

  2. API Gatewayが認証管理用のサービス(例ではFTGO monolith)にルーティング

  3. 認証管理用サービスはJSESSIONIDとユーザー情報や役割・権限を含んだJWTであるUSERINFOcookieに含めて返す

図ではauth serviceとなっているが実際はモノリシックサービスを想定しており、

JSESSIONIDモノリスからの移行という文脈なので、通常のモノリスサービスで扱うセッション管理のため

以下別マイクロサービスへのアクセス

  1. クライアントはUSERINFOcookieに含めrequest

  2. API GatewayUSERINFOをvalidate、それより後ろのサービスにAuthorization headerに入れてリクエス

    マイクロサービスはtokenをデコード、validate, 情報の取得を行う

ポイント

  • 全てのリクエストはAPI Gatewayを通る ここでモノリス・マイクロ間の差異を吸収することで開発効率は上がる。

  • session_idとJWT両方を扱う この解説書自体モノリシックからマイクロサービスへの移行を前提としているので依然としてサーバーローカルでのセッション管理を用いている。

    マイクロサービス前提ならJWTだけで良さそう。

  • USERINFOはAPI Gatewayより前ではcookieに入れて扱う

    ブラウザベースのクライアントとサーバー間の部分ではcookieを使い、サーバー間通信の場合はAuthorization Headerにtokenを入れる。

    ローカルのストアに保存などでも良いと思うが、ブラウザがクライアントであればcookieに乗るのが安全。

  • マイクロサービスにリクエストがついた時点でtokenのvalidateを行う

    tokenの有効期限やroleによる認可、サービス間の疎結合などの観点からGatewayだけでなく各マイクロサービスでもtokenのhandlingが必要

感想

まずマイクロサービスで作る時はAPI Gatewayが大事!! それほど大きな発見はなかったが、なんとなく実装していたパターンの意味や重要性を考え直せたのでよかった。

余談ですが、この本は無限に時間が潰せます。