マイクロサービスと認証
マイクロサービスでは、1つの大きなアプリを機能ごとの小さなサービスに分けます。
たとえば、ECサイトなら次のように分かれます。
- ユーザーサービス
- 注文サービス
- 決済サービス
- 在庫サービス
- 通知サービス
これらのサービスはAPIで通信します。そこで問題になるのが、サービス間で「誰のリクエストか」「どの権限か」をどう伝えるかです。
従来のセッションの課題
従来のサーバ側セッションでは、ログイン状態はRedisやDBなどのセッションストアにあります。
session_id -> session store -> user情報
マイクロサービスで全サービスが毎回セッションストアを見ると、次の課題が出ます。
| 課題 | 内容 |
|---|---|
| 共有ストア依存 | 全サービスが同じセッションストアに依存する |
| レイテンシ | 毎回ストア問い合わせが発生する |
| 結合度 | 認証基盤との結合が強くなる |
| 障害影響 | セッションストア障害の影響が大きい |
JWT の便利さ
自己完結型JWTを使うと、各サービスは認証サーバーへ毎回問い合わせずに必要な情報を検証できる構成があります。
Request with JWT
-> Service A verifies signature
-> Service B verifies signature
-> Service C verifies signature
中央のセッションストアに毎回問い合わせなくても、許可したアルゴリズムと信頼する鍵で署名を検証し、発行者、有効期限、audience、scope、token種別などを確認できます。
{
"sub": "user_001",
"scope": "orders:read",
"aud": "order-api",
"exp": 1760000000
}
サービス間では JWT が有効

JWTは、サーバ間・サービス間の認証では便利です。
| 利点 | 内容 |
|---|---|
| 分散検証 | 各サービスが署名と必要なclaimsを検証できる |
| スケールしやすい | セッションストア参照を減らせる |
| 権限を含められる | scopeやaudienceを表現できる |
| 標準化されている | OAuth/OIDCと相性がよい |
ただし、JWTに何でも入れてよいわけではありません。Payloadは読まれる前提で、機密情報は入れません。また、有効なJWTでも、その利用者が対象の注文などを操作できるかは各サービスが認可します。
ブラウザに持たせる話とは別
ここが重要です。
マイクロサービスでJWTが便利だからといって、ブラウザにJWTを持たせる必要があるとは限りません。
現在の構成では、次のように分けることができます。
Browser -> Cookie -> BFF -> access token -> Microservices
ブラウザはBFFにCookieでアクセスします。BFFがサーバー側でaccess tokenを使い、マイクロサービス群を呼びます。access tokenはJWT形式とは限りません。
ポイント: JWT はサーバ間では便利です。しかし、その利点はブラウザにJWTを置く理由にはなりません。
JWT の注意点
マイクロサービスでJWTを使う場合も、注意点があります。
- 有効期限を短くする
- 検証側で署名アルゴリズムを許可リストにする
iss、aud、exp、必要ならnbfとtoken種別を検証する- scopeに加えて、対象リソースへの業務認可を行う
- 公開鍵の配布、キャッシュ、鍵ローテーションを設計する
- 失効反映までの時間とreplay時の影響を整理する
- 権限情報を大きくしすぎず、変更反映の遅れを考慮する
特に aud の検証は重要です。別API向けに発行されたJWTが誤って使われないようにします。
Service Mesh や mTLS との関係
マイクロサービス間の認証では、JWTだけでなく mTLS や Service Mesh も使われます。
| 方式 | 主な役割 |
|---|---|
| JWT | ユーザーや権限を伝える |
| mTLS | サービス同士の本人確認と暗号化 |
| Service Mesh | 通信制御、認証、監視を共通化 |
JWTは「どの主体・権限を伝えるか」、mTLSは「どのサービスとの通信か」を確認する、というように役割を分けることがあります。片方があればもう片方の検証や業務認可が不要になるわけではありません。
まとめ
マイクロサービスで自己完結型JWTが使われる理由は、各サービスが認証サーバーへ毎回問い合わせずに検証できる構成を作れるからです。
- セッションストア依存を減らせる
- 各サービスで署名とclaimsを分散検証できる
- scopeやaudienceをトークンに含められる
- OAuth/OIDCと相性がよい
- ただし認可、即時失効、replay、鍵管理には注意が必要
- サーバ間でJWTが便利なことと、ブラウザにJWTを持たせることは別問題
参考リソース
次に読む記事
- JWTのdecodeはverifyではない - 署名とclaimsを検証する実践
- mTLS と Service Mesh とは何か
- BFF とは何か
- マイクロサービスアーキテクチャとは
- JWTの仕組み - トークンベース認証を理解しよう