Keycloakでトークンに何を載せるかは、Client ScopeとProtocol Mapperの設計そのものです。default/optionalの使い分け、audience制御、そしてトークン肥大化の回避まで、実構築の現場目線で整理します。

Keycloakの認証基盤を構築していて、最終的に一番細かく詰めることになるのが「トークンに何を載せるか」です。ユーザーのメールアドレス、所属部署、ロール、そしてトークンの宛先(audience)。これらは魔法のように入るわけではなく、Client ScopeとProtocol Mapperという2つの仕組みで明示的に組み立てられます。本稿では、default/optional client scopeの使い分けから、audience制御、claim設計、そして現場で必ず問題になるトークン肥大化の回避まで、実務目線で掘り下げます。バージョンは現行のQuarkusベース(Keycloak 26系前後)を前提としますが、設定名や既定挙動はバージョンで動くことがあるため、細部は公式ドキュメントでの確認をおすすめします。

01Client Scopeとは「mapperの再利用バンドル」

Client Scopeは、複数のクライアントで共有する設定のかたまりです。公式の定義では「protocol mapperとrole scope mappingを複数クライアントで共有するエンティティ」とされています(Server Administration Guideのソース)。クライアントをClient Scopeに紐付けると、そのScopeに定義されたmapperとrole scope mappingをクライアントが継承します。

ここを最初に理解しておくと設計がぶれません。個々のクライアントにmapperを直接生やすこともできますが、それをやると「profileというclaimセットを10クライアントに同じように入れたい」といった要件で破綻します。共通のclaimはClient Scopeに寄せ、クライアント固有のものだけクライアント側に置く、という切り分けが基本です。

Keycloakには最初からprofileemailrolesweb-originsacrbasicなどのビルトインClient Scopeが用意されており、それぞれOIDC仕様に沿ったmapperが定義済みです。新規realmを作った直後のトークンにいろいろなclaimが入っているのは、これらが既定でアサインされているためです。

02defaultとoptionalの決定的な違い

Client Scopeには2種類のアサイン方法があります。この違いはトークン設計の根幹なので、正確に押さえてください。

公式ドキュメントの例が分かりやすく、クライアントがscope=openid phoneを送ると、トークンにはdefault scope(profileやemailなど)のmapperに加えて、optional scopeとして要求されたphoneのmapperが載ります。openidはすべてのOIDCリクエストで使うメタ値です(Server Administration Guide)。

現場のコツ:「全ユーザーのトークンに常時必要なもの」だけをdefaultに置き、それ以外はoptionalに倒すのが肥大化回避の第一歩です。電話番号や住所のような一部クライアントしか使わない属性をdefaultに入れると、全トークンに載り続けます。optionalなら、必要なクライアントがscopeで明示的に取りに行くので、無関係なトークンは軽いままです。

Client Scope と scope パラメータの適用関係 Default scope profile / email roles / basic 常に適用 Optional scope phone / address custom-attr 要求時のみ適用 scope=openid phone 発行トークン name, email realm/client roles phone_number (phoneは要求時)
図:default scopeは常に、optional scopeはscopeパラメータで要求された時だけトークンに載る。

03Protocol Mapperの三本柱:user attribute / role / audience

Protocol Mapperは、Keycloakのユーザーモデル(属性、ロール、グループなど)をトークンのclaimに変換するルールです。種類は多いですが、実務で頻出するのは次の三つです。

各mapperには「ID Tokenに載せる」「Access Tokenに載せる」「UserInfoに載せる」「Introspectionに載せる」のトグルがあります。これを絞ることも肥大化対策として効きます。たとえばフロントで表示に使うだけの属性はID Tokenだけに載せ、Access Tokenには載せない、という切り分けが可能です。

04audience制御:誰宛のトークンかを明示する

audience(audクレーム)は「このトークンは誰が受け取って検証すべきか」を示します。リソースサーバ(API)側は、自分宛でないトークンを弾くべきで、そのためにaudの検証が必要です。Keycloakのアダプタ/ライブラリには、bearerトークン認証時にトークンのaudにこのクライアント名(resource)が含まれるかを検証するオプションがあり、既定はfalseですがセキュリティ上は有効化が推奨されています(Securing Applications and Services Guide)。audを載せないと、この検証が意味を持ちません。

audをトークンに入れる方法は二つあります。

現場のコツ:マイクロサービス構成で「フロント用クライアントで取ったトークンをbackend-api宛にしたい」というときは、backend-apiにダミーでも良いのでclient roleを1つ作り、それをユーザー(またはグループ)にアサインしておくと、Audience Resolveが自動でbackend-apiをaudに入れてくれます。手動のAudience Mapperを乱立させるより保守しやすくなります。ただしrole付与がそのままaud付与になるので、role設計のレビュー時にaudへの波及も一緒に見てください。

aud クレームの生成経路 Audience Mapper 固定の宛先を指定 client ID / 任意文字列 Audience Resolve client roleから 宛先を動的に解決 roles scopeに内蔵 Access Token aud: [...] Resource Server aud を検証 自分宛か確認
図:固定宛先はAudience Mapper、role連動の動的宛先はAudience Resolveで生成し、受け側がaudを検証する。

05トークン肥大化の回避:実務で効く順番

ロールやグループが多いエンタープライズ環境では、トークンが数KBに膨らみ、ヘッダサイズ上限やCookie保存で問題になることがあります。Bearerで飛ばすなら8KB前後のHTTPヘッダ上限も現実的な制約です。効果の大きい順に対策を挙げます。

ロールをトークンから外して認可を成立させる考え方は、細粒度認可の設計と地続きです。ロール・グループ・属性の設計そのものはロール/グループ/属性の設計で、より踏み込んだ認可はきめ細かい認可(Fine-grained Authorization)で掘り下げています。最小権限の実像についてはIAM最小権限の現実も参考になります。

06claim設計の指針:一貫性と検証性

claim設計で現場が後悔しがちなポイントを整理します。

現場のコツ:claim設計はConsent(同意)画面とも連動します。optional client scopeに「Display On Consent Screen」を設定しておくと、ユーザーがどの情報を渡すか同意画面で見える化できます。社内向けでConsentを切る運用でも、scope単位で情報を束ねておくと、後からConsentを有効化したり、監査で「このクライアントはどのclaimを受け取るか」を説明するときに効いてきます。

07Evaluateタブで実物のトークンを検証する

設計したmapperが期待通りに効くかは、頭の中ではなく実物で確認すべきです。KeycloakのAdmin Consoleには、クライアントごとに「Client scopes」タブ配下の「Evaluate」サブタブがあります。ここでユーザーを選び、適用するoptional client scopeを選択すると、生成されるトークンのプレビューと、アプリからKeycloakの認可エンドポイントに送るべきscopeパラメータの値が表示されます(Server Administration Guide)。

Evaluateは、audience resolveの挙動確認にも有効です。あるクライアントをscopeに含めたときに生成されるアクセストークンで、そのクライアントがaudに追加されるか(optional client scopeとしてアサインされている場合)を目視できます。本番でトークンを取ってデコードする前に、ここで「載るべきものが載り、載るべきでないものが載っていない」を確認する習慣をつけると、claim設計のイテレーションが速くなります。

IaCで管理している場合は、この確認をterraform provider(keycloak provider)やAdmin REST APIでの適用後チェックに組み込むと再現性が上がります。REST API経由の構成管理はAdmin REST APIとIaCで扱っています。

まとめ

トークンに何を載せるかは、Client ScopeとProtocol Mapperという2つの明示的な仕組みで決まります。要点は次の通りです。

EMWではKeycloakでエンタープライズの認証基盤を実構築しており、claim設計やトークン肥大化の解消も含めて対応しています。具体的な事例は導入事例を、複数アカウント/テナントにまたがる統制はマルチアカウント統制をご覧ください。

参考(一次情報)

認証基盤のclaim設計やトークン肥大化でお困りの際は、実構築の経験を踏まえてお問い合わせください。

相談する
← ブログ一覧へ戻る