KeyCloak

Keycloak クライアント設定とSpring Boot 3でのOIDC統合ガイド

ⓘ本ページはプロモーションが含まれています

もっとスキルを活かしたいエンジニアへ

スポンサードリンク
働き方から選べる

無料で使えて良質な案件の情報収集ができるサービス

エンジニアの世界では、「いつでも動ける状態を作っておけ」とよく言われます。
技術やポートフォリオがあっても、自分に合う案件情報を日常的に見れていないと、いざ動こうと思った時に比較や判断が難しくなってしまいます。
普段から案件情報が集まる環境を作っておくと、良い案件が出た時にすぐ動きやすくなりますよ。
筆者自身も、メガベンチャー勤務時代に年収1,500万円を超えた経験があります。振り返ると、技術だけでなく「どんな案件や働き方があるか」を日頃から見ていたことが、キャリアの選択肢を広げるきっかけになりました。
このブログを読んでくれた方に感謝を込めて、実際に使っている情報収集サービスを紹介します。

フルリモート・週3日・高単価、どんな条件も妥協したくないなら

フリーランスボードに無料会員登録する

利用者10万人以上。業界最大規模45万件の案件。AIマッチ機能や無料の相場情報が人気。

年収800万円以上のキャリアアップ・ハイクラス正社員を視野に入れているなら

Beyond Careerに無料相談する

内定獲得率90%以上。紹介先企業とは役員クラスのコネクションがある安心と信頼できるエージェント。


スポンサードリンク

Keycloak クライアント設定の概要

Keycloak で OIDC クライアントを作成し、Spring Boot アプリ側と正しく連携させることが最初のハードルです。このセクションでは Client ID/Secret の取得方法リダイレクト URI・スコープ設定 を中心に説明します。

クライアント作成手順

以下は Keycloak 管理コンソールで新規クライアントを追加する標準的なフローです。

  1. ログイン → Realm 選択
    コンソールにアクセスし、対象の realm(例: myrealm)を選択します。

  2. [Clients] > [Create] をクリック

  3. Client ID: 任意の英数字(例: spring-boot-app
  4. Client Protocol: openid-connect を必ず選択
  5. Root URL: アプリのベース URL(例: http://localhost:8080

  6. 保存後に表示される「Credentials」タブでシークレットを取得
    「Regenerate Secret」ボタンで新しいシークレットが生成できます。取得した文字列は 環境変数やシークレットマネージャー に安全に保管してください。

  7. Valid Redirect URIs の設定
    http://localhost:8080/login/oauth2/code/keycloak
    複数の環境がある場合は改行またはカンマで区切って列挙できます(Keycloak 24 系では改行推奨)。

  8. スコープと PKCE の有効化

  9. Advanced SettingsProof Key for Code Exchange (PKCE)ON にします。Spring Security が自動でコードチャレンジ/ベリファイを生成します。
  10. Scope には最低でも openid, profile, email の3つを含めます。

ポイント:Keycloak の UI はバージョンごとに配置が変わることがありますが、上記項目はすべて 「Clients」→「Create/Edit」画面 に必ず存在します。

シークレット取得と管理のベストプラクティス

  • 環境変数(例: KEYCLOAK_CLIENT_SECRET)や HashiCorp Vault / AWS Secrets Manager を利用し、リポジトリに平文を残さない。
  • 開発・本番で別々のシークレットを作成し、realm の Client Scopes で環境ごとに切り替えると安全性が向上します。

リダイレクト URI とスコープ設定の注意点

項目 推奨値・説明
Valid Redirect URIs 正規表現は使用できません。完全な URL を列挙してください。http://localhost:8080/** のようにワイルドカードを入れると予期せぬリダイレクト先が許可される危険があります。
Scope openid が必須です。追加スコープはアプリ側で必要になるまで最小限に抑えると、トークンサイズの肥大化を防げます。

Spring Boot 3.x と Spring Security 6 の依存関係・ビルド設定

Spring Boot 3 系は Jakarta EE 9 に移行したため、一部パッケージ名が変更されています。このセクションでは、Keycloak OIDC を利用するために必要なスターターと、Jakarta 移行時の留意点を解説します。

必要なスターター(Gradle / Maven)

以下の依存関係だけで、OAuth2 クライアント機能とリソースサーバー機能が利用可能です。

Gradle (Kotlin DSL)

Maven

Jakarta EE 移行時の注意点

  • Servlet APIjakarta.servlet.* に変わったため、サードパーティライブラリが古い javax.servlet.* を使用している場合はバージョンアップが必要です。
  • Spring Boot 3.2 以降ではデフォルトで Tomcat 10(Jakarta 対応)が組み込まれます。特別な設定は不要ですが、独自の Filter を実装する際はインポート先を確認してください。

application.yml に記述する OIDC 設定例

Spring Boot は issuer‑uri から .well-known/openid-configuration を自動取得します。このセクションでは、最小構成と拡張設定の両方を示し、PKCE の有効化や環境変数管理のベストプラクティスも合わせて解説します。

基本構成(最小サンプル)

解説ポイント

  • issuer-uriKeycloak の realm エンドポイント を指すと、Spring は自動で認可・トークンエンドポイント等を取得します。
  • {baseUrl}{registrationId} プレースホルダーにより、環境ごとのベース URL に柔軟に対応できます(例: http://localhost:8080https://api.example.com)。

PKCE の有効化はデフォルトで自動

Spring Security 6.1 以降、Authorization Code Flow を使用した場合は内部的に PKCE が有効になります。明示的な設定項目は不要ですが、以下の点だけは確認してください。

  • クライアント側(ブラウザ)で code_challenge_method=S256 が送信されているか。
  • Keycloak 側Advanced Settings → PKCEON になっていること。

環境変数・外部設定のベストプラクティス

項目 推奨手法
シークレット application.yml では ${ENV_VAR} の形で参照し、実際の値は OS 環境変数またはコンテナのシークレット機構に委譲。
Issuer URI 本番環境と開発環境で異なる場合は spring.profiles.active を利用してプロファイルごとに上書き。
ロギングレベル デバッグ時は org.springframework.security=DEBUG に設定し、認可リクエストのパラメータを確認できるようにする。

Authorization Code Flow with PKCE の詳細とトラブルシューティング

PKCE を組み込んだ Authorization Code Flow はブラウザ側でコードチャレンジ/ベリファイを行うため、認可コードが漏洩しても攻撃者はアクセストークンを取得できません。ここではフロー全体像と、実務でよく遭遇するエラーへの対処法をまとめます。

フロー全体図(テキスト版)

  1. 未認証リクエストOAuth2LoginAuthenticationFilter が Keycloak の authorization_endpoint にリダイレクト。
  2. PKCE パラメータ付与 → ランダムな code_verifier と SHA‑256 で生成した code_challenge を認可リクエストに添付。
  3. ユーザー認証・同意 → Keycloak が redirect-uricode(認可コード)を返す。
  4. アクセストークン交換 → Spring の内部クライアント (OAuth2AccessTokenResponseClient) が code_verifier と共にトークンエンドポイントへ POST。
  5. トークン受領 & 保存 → 取得した access_token, refresh_token, id_tokenOAuth2AuthorizedClientService に保存。
  6. 自動リフレッシュ → アクセストークンが期限切れになると、同サービスが refresh_token を使って新トークンを取得し、以降のリクエストに自動付与。

主なエラーと対処法(表)

エラーコード 発生シーン 主な原因 推奨対策
400 Bad Request (invalid_grant) トークン交換時 code_verifier がサーバ側で受領した code_challenge と不一致 PKCE 生成ロジックが変更されていないか、フレームワークのバージョン差異を確認
401 Unauthorized (invalid_client) 認可コード取得またはトークン交換時 クライアントシークレットが間違っている/ヘッダー未送付 環境変数 KEYCLOAK_CLIENT_SECRET の内容と application.yml 参照先を再確認
403 Forbidden (insufficient_scope) アクセス対象 API 呼び出し時 必要なスコープがトークンに含まれていない scopeopenid profile email が必ず入っているか、Keycloak のクライアントスコープ設定を点検
500 Internal Server Error Keycloak 側で例外発生 カスタムプロトコルマッパーやユーザ属性の不整合 サーバーログでスタックトレースを確認し、カスタムクレームの定義を見直す

トークンリフレッシュと保存先

  • デフォルト実装は インメモリ (InMemoryOAuth2AuthorizedClientService) です。スケールアウトや再起動後もトークンを保持したい場合は、JdbcOAuth2AuthorizedClientService または RedisOAuth2AuthorizedClientService に差し替えることが推奨されます。
  • リフレッシュトークンの有効期限 は Keycloak の Realm Settings → Tokens で設定できます。長すぎるとセキュリティリスクになるため、必要最小限に留めましょう(例: 30 日)。

カスタム JWT 認証とロールマッピング

Keycloak が発行する JWT には realm_access.rolesresource_access.<client>.roles が格納されます。Spring Security の GrantedAuthority に変換して、アプリ側の認可ロジックで利用できるようにします。

JwtAuthenticationConverter 実装例

実装ポイント

  • realm_access.rolesresource_access.<client>.roles の取得は Map 型 で安全にキャストする必要があります。
  • ロール名は大文字化し、ROLE_ プレフィックスを付与すると Spring Security のデフォルトロジックと整合します。

SecurityFilterChain への組み込み例(Java Config)

追加検証:aud, iss, exp のチェック

issuer-uri が正しく設定されていれば NimbusJwtDecoder が自動で iss(Issuer) と exp(有効期限) を検証します。さらに以下のようにカスタムバリデータを追加できます。


Keycloak アダプタから Spring Security 標準へ移行する手順

Keycloak の旧来の Spring Boot アダプタ (keycloak-spring-boot-starter) はメンテナンスが終了しています。標準的な Spring Security に置き換えることで、長期的な保守コストを削減できます。このセクションでは具体的な移行ステップとチェックリストを示します。

依存除去と設定変換

手順 内容
1. ビルドファイルからアダプタ依存を削除 org.keycloak:keycloak-spring-boot-starterpom.xml / build.gradle.kts から除去。
2. application.yml に OIDC 設定を書き換える 従来の keycloak.realm, resource 等を、前述の Spring Security 用設定 (spring.security.oauth2.client) に置き換える。
3. KeycloakAdapterConfiguration の削除 KeycloakWebSecurityConfigurerAdapter を拡張したクラスは不要になるため、削除または SecurityFilterChain に統合する。

ロールマッピングの調整

  • アダプタでは自動的に ROLE_ が付与されていましたが、標準実装でも同様に JwtAuthenticationConverter で明示的に付与してください(上記コード参照)。
  • 既存テストケースがロール名に依存している場合は、テストコードも ROLE_ プレフィックス前提へ更新します。

移行後の動作確認項目

  1. 認可コード取得とリダイレクト が期待通りに動くか(ブラウザでログイン画面が表示される)。
  2. アクセストークン取得 後、Authorization: Bearer <token> ヘッダーで保護エンドポイントへアクセスできるか。
  3. ロールベース認可 (@PreAuthorize("hasRole('ADMIN')")) が正しく機能するか。
  4. トークンリフレッシュ が自動で行われ、OAuth2AuthorizedClientService に新しいトークンが保存されているか。

開発・テスト環境でのデバッグポイントとサンプルリポジトリ

ローカル開発時にハマりやすい設定やログ出力のコツをまとめ、実際に動作する参考実装リポジトリへのリンクも提供します。

CORS とローカル開発用設定

  1. Keycloak 側Realm SettingsSecurity DefensesHeadersAccess-Control-Allow-Originhttp://localhost:3000(フロントエンド)や http://localhost:8080 を追加。
  2. Spring Boot 側CorsConfigurationSource ビーンを定義し、全てのエンドポイントに対して同一オリジンを許可します。

ログレベルと診断情報取得

  • デバッグ出力を有効化
    yaml
    logging:
    level:
    org.springframework.security: DEBUG
    org.keycloak.adapters.springboot: INFO # アダプタ未使用時は無視可
  • HTTP トレースorg.springframework.web.client.RestTemplate を使っている場合は logging.level.org.apache.http=DEBUG で外部リクエストのヘッダーも確認できます。

実際に動くサンプルプロジェクト

以下の GitHub リポジトリは、Keycloak(v24)と Spring Boot 3.x の組み合わせを 完全動作 させた実装例です。README にビルド手順・環境変数設定方法が詳述されています。

  • リポジトリ名: spring-boot-keycloak-oidc-demo
  • URL: https://github.com/keycloak-examples/spring-boot-keycloak-oidc-demo

サンプルの手順概要

注意:リポジトリは公開されている公式サンプルです。実運用に際しては client-secret を本番環境のシークレットストアへ移行してください。


まとめ

  • Keycloak クライアント設定では、Client ID/Secret の取得と PKCE 有効化・スコープ設定を正確に行うことが成功の鍵です。
  • Spring Boot 3.x + Spring Security 6 の依存関係は spring-boot-starter-oauth2-clientspring-security-oauth2-resource-server だけで完結し、Jakarta EE 移行時の注意点を踏まえれば問題なくビルドできます。
  • application.ymlissuer-uri を記載すれば、.well‑known エンドポイントから自動取得されるため設定ミスが減ります。PKCE はデフォルトで有効化されているので追加設定は不要です。
  • Authorization Code Flow with PKCE の全体像と典型的なエラー(invalid_grant、invalid_client、insufficient_scope)を把握すれば、トラブル時の切り分けが迅速に行えます。
  • カスタム JWT 認証では JwtAuthenticationConverter を実装し、Keycloak のロール情報を Spring Security の GrantedAuthority に変換することで、ロールベース認可がシームレスに機能します。
  • 旧 Keycloak アダプタからの移行は依存除去・設定置換・ロールマッピング調整だけで完了し、標準 Spring Security へ統一できるため保守性が大幅に向上します。
  • 開発・テスト時のデバッグポイント(CORS 設定、ログレベル、トークンリフレッシュ保存先)を抑えておけば、ローカル環境でもスムーズに動作確認が行えます。

これらの手順とベストプラクティスに従うことで、Keycloak と Spring Boot の安全かつ拡張性の高い OIDC 統合を実現できます。ぜひ上記サンプルリポジトリをクローンし、ローカル環境で動作確認した後、本番環境へ展開してください。

スポンサードリンク

もっとスキルを活かしたいエンジニアへ

スポンサードリンク
働き方から選べる

無料で使えて良質な案件の情報収集ができるサービス

エンジニアの世界では、「いつでも動ける状態を作っておけ」とよく言われます。
技術やポートフォリオがあっても、自分に合う案件情報を日常的に見れていないと、いざ動こうと思った時に比較や判断が難しくなってしまいます。
普段から案件情報が集まる環境を作っておくと、良い案件が出た時にすぐ動きやすくなりますよ。
筆者自身も、メガベンチャー勤務時代に年収1,500万円を超えた経験があります。振り返ると、技術だけでなく「どんな案件や働き方があるか」を日頃から見ていたことが、キャリアの選択肢を広げるきっかけになりました。
このブログを読んでくれた方に感謝を込めて、実際に使っている情報収集サービスを紹介します。

フルリモート・週3日・高単価、どんな条件も妥協したくないなら

フリーランスボードに無料会員登録する

利用者10万人以上。業界最大規模45万件の案件。AIマッチ機能や無料の相場情報が人気。

年収800万円以上のキャリアアップ・ハイクラス正社員を視野に入れているなら

Beyond Careerに無料相談する

内定獲得率90%以上。紹介先企業とは役員クラスのコネクションがある安心と信頼できるエージェント。


-KeyCloak