認証/認可@マイクロサービスアーキテクチャ¶
はじめに¶
本サイトにつきまして、以下をご認識のほど宜しくお願いいたします。
01. 認証¶
認証サービス¶
各マイクロサービスごとに認証処理を持たせるのではなく、認証の責務を持つマイクロサービスを1
個だけ配置する。
この認証サービスは、認証情報を永続化するためのDB、またはセッションを保管するためのストレージを持つ。
SSOパターン (独立パターン)¶
▼ SSOパターンとは¶
『独立パターン』ともいう。
サーバー側に、認証サービスをIDプロバイダーとして、SSOを実行する。
この認証サービスは、認証情報を永続化するためのDBを持ち、有効期限が切れればアクセストークンを無効化する。
認証サービスが単一障害点になるというデメリットがある。
アクセストークン (JWT仕様またはそうでない場合がある) を使用する。
▼ SSOパターンの仕組み¶
各マイクロサービスは、SSOのIDプロバイダーに認証を委譲する。
▼ API Gatewayがある場合¶
初回のSSO時、フロントエンドからIDプロバイダーに直接的に認可リクエストを送信する。
その後、クライアントのローカルマシンのCookie
ディレクトリにJWTを保管する。
次回、API GatewayがフロントエンドからのリクエストをKeycloakに転送し、JWTを検証する。
結果に応じて、後続のマイクロサービスにルーティングするかどうかを決める。
セッションパターン (集中パターン)¶
▼ セッションパターンとは¶
『集中パターン』ともいう。
サーバー側に、セッションデータを作成する認証サービス (例:自前、Redisなど) を1
個だけ配置し、認証処理を実行する。
この認証サービスは、セッションデータを保管するためのストレージを持つ。
▼ セッションパターンの仕組み¶
各マイクロサービスは、セッションデータに基づいてユーザーを認証する。
1
個のセッション中の認証情報をマイクロサービス間で共有するために、セッションデータを保管できるストレージ (例:Infinispan、Redisなど) を1
個だけ配置する。
セッションベースの認証情報伝播とコンテナの相性が悪く、各マイクロサービスがセッションデータを持つ必要がある。
そのため、SessionStorageが必要になるというデメリットがある。
JWTパターン (分散パターン)¶
▼ JWTパターンとは¶
『分散パターン』ともいう。
サーバー側に、JWTを作成する認証サービス (例:自前、Keycloakなど) を1
個だけ配置し、認証処理を実行する。
この認証サービスは、認証情報を永続化するためのDBを持つ。
SSOパターンと似ているが、こちらは非SSOでJWT仕様のトークンを使用する。
▼ JWTパターンの仕組み¶
各マイクロサービスは、JWTに基づいてユーザーを認証する。
1
個のセッション中の認証情報をマイクロサービス間で共有するために、リクエスト/レスポンスのヘッダーにJWTを埋め込み、クライアント側にJWTを保管させる。
トークンベースの認証情報伝播とコンテナの相性が良く、各マイクロサービスはJWTを持つ必要がない。
クライアント側に保管されたJWTの失効が難しいというデメリットがある。
その解決策として、Opaqueトークンパターン (ゲートウェイ集中パターン) がある。
Opaqueトークンパターン (ゲートウェイ集中パターン)¶
▼ Opaqueトークンパターンとは¶
『ゲートウェイ集中パターン』ともいう。
JWTパターンにAPI Gatewayを組み合わせたパターンであり、JWTパターンでJWTの失効が難しいというデメリットを解決する。
サーバー側に、JWTを作成する認証サービス (例:自前、Keycloakなど) を1
個だけ配置する。
API Gatewayは、認証を集中的に管理し、認証とアクセストークン検証を担う。
▼ Opaqueトークンパターンの仕組み¶
各マイクロサービスは、JWTとOpaqueトークンに基づいてユーザーを認証する。
1
個のセッション中の認証情報をマイクロサービス間で共有するために、リクエスト/レスポンスのヘッダーにJWTを埋め込む。
クライアント側にはJWTとペアになるOpaqueトークンを保管する。
また、API Gatewayやロードバランサーで、OpaqueトークンとJWTの間の相互変換を通信のたびに実行する。
トークンベースの認証情報伝播とコンテナの相性が良く、各マイクロサービスはOpaqueトークンを持つ必要がない。
02. 認可¶
集中パターン¶
▼ 集中パターンとは¶
認可スコープを定義する認可サービス (例:自前、OpenPolicyAgentなど) を1
個だけ配置し、認可処理を実行する。
分散パターン¶
▼ 分散パターンとは¶
認可処理を各マイクロサービスに実装する。
認可処理はドメインと結びつきが強いので、マイクロサービス側に実装すると拡張性が高くなる。