コンテンツにスキップ

認証/認可@マイクロサービスアーキテクチャ

はじめに

本サイトにつきまして、以下をご認識のほど宜しくお願いいたします。


01. 認証

認証サービス

各マイクロサービスごとに認証処理を持たせるのではなく、認証の責務を持つマイクロサービスを1個だけ配置する。

この認証サービスは、認証情報を永続化するためのDB、またはセッションを保管するためのストレージを持つ。


SSOパターン (独立パターン)

▼ SSOパターンとは

『独立パターン』ともいう。

サーバー側に、認証サービスをIDプロバイダーとして、SSOを実行する。

この認証サービスは、認証情報を永続化するためのDBを持ち、有効期限が切れればアクセストークンを無効化する。

認証サービスが単一障害点になるというデメリットがある。

アクセストークン (JWT仕様またはそうでない場合がある) を使用する。

▼ SSOパターンの仕組み

各マイクロサービスは、SSOのIDプロバイダーに認証を委譲する。

microservices_authentication_type_sso

▼ API Gatewayがある場合

初回のSSO時、フロントエンドからIDプロバイダーに直接的に認可リクエストを送信する。

その後、クライアントのローカルマシンのCookieディレクトリにJWTを保管する。

次回、API GatewayがフロントエンドからのリクエストをKeycloakに転送し、JWTを検証する。

結果に応じて、後続のマイクロサービスにルーティングするかどうかを決める。

microservices_authentication_type_sso_gateway


セッションパターン (集中パターン)

▼ セッションパターンとは

『集中パターン』ともいう。

サーバー側に、セッションデータを作成する認証サービス (例:自前、Redisなど) を1個だけ配置し、認証処理を実行する。

この認証サービスは、セッションデータを保管するためのストレージを持つ。

▼ セッションパターンの仕組み

各マイクロサービスは、セッションデータに基づいてユーザーを認証する。

1個のセッション中の認証情報をマイクロサービス間で共有するために、セッションデータを保管できるストレージ (例:Infinispan、Redisなど) を1個だけ配置する。

セッションベースの認証情報伝播とコンテナの相性が悪く、各マイクロサービスがセッションデータを持つ必要がある。

そのため、SessionStorageが必要になるというデメリットがある。

microservices_authentication_type_session


JWTパターン (分散パターン)

▼ JWTパターンとは

『分散パターン』ともいう。

サーバー側に、JWTを作成する認証サービス (例:自前、Keycloakなど) を1個だけ配置し、認証処理を実行する。

この認証サービスは、認証情報を永続化するためのDBを持つ。

SSOパターンと似ているが、こちらは非SSOでJWT仕様のトークンを使用する。

▼ JWTパターンの仕組み

各マイクロサービスは、JWTに基づいてユーザーを認証する。

1個のセッション中の認証情報をマイクロサービス間で共有するために、リクエスト/レスポンスのヘッダーにJWTを埋め込み、クライアント側にJWTを保管させる。

トークンベースの認証情報伝播とコンテナの相性が良く、各マイクロサービスはJWTを持つ必要がない。

クライアント側に保管されたJWTの失効が難しいというデメリットがある。

その解決策として、Opaqueトークンパターン (ゲートウェイ集中パターン) がある。

microservices_authentication_type_jwt


Opaqueトークンパターン (ゲートウェイ集中パターン)

▼ Opaqueトークンパターンとは

『ゲートウェイ集中パターン』ともいう。

JWTパターンにAPI Gatewayを組み合わせたパターンであり、JWTパターンでJWTの失効が難しいというデメリットを解決する。

サーバー側に、JWTを作成する認証サービス (例:自前、Keycloakなど) を1個だけ配置する。

API Gatewayは、認証を集中的に管理し、認証とアクセストークン検証を担う。

▼ Opaqueトークンパターンの仕組み

各マイクロサービスは、JWTとOpaqueトークンに基づいてユーザーを認証する。

1個のセッション中の認証情報をマイクロサービス間で共有するために、リクエスト/レスポンスのヘッダーにJWTを埋め込む。

クライアント側にはJWTとペアになるOpaqueトークンを保管する。

また、API Gatewayやロードバランサーで、OpaqueトークンとJWTの間の相互変換を通信のたびに実行する。

トークンベースの認証情報伝播とコンテナの相性が良く、各マイクロサービスはOpaqueトークンを持つ必要がない。

microservices_authentication_type_opaque-token


02. 認可

集中パターン

▼ 集中パターンとは

認可スコープを定義する認可サービス (例:自前、OpenPolicyAgentなど) を1個だけ配置し、認可処理を実行する。

microservices_authorization_centralized-authorization


分散パターン

▼ 分散パターンとは

認可処理を各マイクロサービスに実装する。

認可処理はドメインと結びつきが強いので、マイクロサービス側に実装すると拡張性が高くなる。

microservices_authorization_decentralized-authorization


ハイブリッドパターン

▼ ハイブリッドパターンとは

microservices_authorization_hybrid-authorization