はじめに
2026年、Qiitaでの技術ブログをスタートします!医療ITエンジニアの三浦です。
最初のテーマは、認証の要となる「OpenID Connect (OIDC)」についてです。
これまで病院内で使われる臨床向けアプリは、オンプレミス運用が主流でした。国を挙げたクラウド推進(3省2ガイドライン等)や医療DXの流れはありましたが、2025年までは依然として院内サーバーへのインストール型が一般的だったと感じています。しかし、2026年からは「標準型電子カルテ」の本格稼働や「電子カルテ情報共有サービス」の拡充、さらに「医療情報システムの安全管理に関するガイドライン」で規定された厳格な認証要件への対応が不可欠となります。
オンプレとクラウドが混在する過渡期の今、その両方に柔軟に対応できる認証基盤として、OIDC準拠のOSSである「Keycloak」に注目し、その活用術をまとめていきます。
Keycloakとは
Keycloakは、シングルサインオン(SSO)を実現するオープンソースの認証・認可マネージャーです。OpenID Connect(OIDC)やSAML 2.0といった標準プロトコルに準拠しており、外部DB連携やSNSログイン、多要素認証(MFA)もGUI上で容易に設定・一括管理できます。
開発には日立製作所や野村総合研究所(NRI)といった国内大手企業も深く携わっており、エンタープライズ用途でも高い信頼を得ているOSSです。
内部はJava / Quarkusで構築されており、バックエンドのデータベースはPostgreSQLやOracleといった主要プロダクトのほか、Amazon AuroraやAzure SQLといったクラウドマネージドサービスも幅広くサポートしています。
※本記事では2026年1月現在の最新版である Keycloak 26.4.7 をベースに解説します。
環境を準備する
Keycloak(v26以降)を動かすには Java 21以上 が必要です。 開発・テスト用として、標準で組込データベースの H2 Database が同梱されているため、DBサーバーを別途用意しなくてもすぐに試すことが可能です。
今回は、最新の Java 25 環境で動作確認を行いました。事前に java コマンドにパスが通っていることを確認してください。
>java -version
openjdk version "25" 2025-09-16
OpenJDK Runtime Environment (build 25+36-3489)
OpenJDK 64-Bit Server VM (build 25+36-3489, mixed mode, sharing)
Keycloakをダウンロードする
Windows11にインストールするため、"ZIP" をダウンロードします。
解凍するだけでインストール完了です。
Keycloakを起動する
コマンド プロンプトで、Keycloakを解凍したフォルダのトップに移動し、以下のコマンドを実行します。
start-dev=開発モードで起動することで、"http"プロトコルでアクセスできます。
>bin\kc.bat start-dev
JAVA_HOME is not set. Unexpected results may occur.
Set JAVA_HOME to the directory of your local JDK to avoid this message.
Running the server in development mode. DO NOT use this configuration in production.
WARNING: A terminally deprecated method in sun.misc.Unsafe has been called
WARNING: sun.misc.Unsafe::allocateMemory has been called by io.netty.util.internal.PlatformDependent0$2 (file:/C:%5CFiles%5Ckeycloak%5Ckeycloak-26.4.7%5Clib%5Clib%5Cmain%5Cio.netty.netty-common-4.1.128.Final.jar)
WARNING: Please consider reporting this to the maintainers of class io.netty.util.internal.PlatformDependent0$2
WARNING: sun.misc.Unsafe::allocateMemory will be removed in a future release
2026-01-04 22:38:52,469 INFO [org.hibernate.orm.jdbc.batch] (JPA Startup Thread) HHH100501: Automatic JDBC statement batching enabled (maximum batch size 32)
2026-01-04 22:38:53,330 INFO [org.keycloak.quarkus.runtime.storage.database.liquibase.QuarkusJpaUpdaterProvider] (main) Initializing database schema. Using changelog META-INF/jpa-changelog-master.xml
2026-01-04 22:38:57,645 INFO [org.infinispan.CONTAINER] (main) Virtual threads support enabled
2026-01-04 22:38:57,778 INFO [org.infinispan.CONTAINER] (main) ISPN000556: Starting user marshaller 'org.infinispan.commons.marshall.ImmutableProtoStreamMarshaller'
2026-01-04 22:38:58,096 INFO [org.keycloak.connections.infinispan.DefaultInfinispanConnectionProviderFactory] (main) Node name: node_724697, Site name: null
2026-01-04 22:38:58,254 INFO [org.keycloak.services] (main) KC-SERVICES0050: Initializing master realm
2026-01-04 22:38:59,860 INFO [io.quarkus] (main) Keycloak 26.4.7 on JVM (powered by Quarkus 3.27.1) started in 10.972s. Listening on: http://0.0.0.0:8080
2026-01-04 22:38:59,860 INFO [io.quarkus] (main) Profile dev activated.
2026-01-04 22:38:59,861 INFO [io.quarkus] (main) Installed features: [agroal, cdi, hibernate-orm, jdbc-h2, keycloak, narayana-jta, opentelemetry, reactive-routes, rest, rest-jackson, smallrye-context-propagation, vertx]
http://localhost:8080 で管理画面にアクセスできます。
bugfix
Java24以上を使用している場合、Keycloakを起動してしばらくすると以下のようなエラーが発生します。
Exception in thread "executor-thread-6" Exception in thread "executor-thread-1" java.lang.IllegalAccessError: module java.base does not open java.lang to unnamed module @66d33a; to use the thread-local-reset capability on Java 24 or later, use this JVM option: --add-opens java.base/java.lang=ALL-UNNAMED
at org.jboss.threads.JDKSpecific$ThreadAccess.<clinit>(JDKSpecific.java:32)
at org.jboss.threads.ThreadLocalResettingRunnable.run(ThreadLocalResettingRunnable.java:13)
at io.netty.util.concurrent.FastThreadLocalRunnable.run(FastThreadLocalRunnable.java:30)
at java.base/java.lang.Thread.run(Thread.java:1474)
java.lang.NoClassDefFoundError: Could not initialize class org.jboss.threads.JDKSpecific$ThreadAccess
at org.jboss.threads.ThreadLocalResettingRunnable.run(ThreadLocalResettingRunnable.java:13)
at io.netty.util.concurrent.FastThreadLocalRunnable.run(FastThreadLocalRunnable.java:30)
at java.base/java.lang.Thread.run(Thread.java:1474)
Caused by: java.lang.ExceptionInInitializerError: Exception java.lang.IllegalAccessError: module java.base does not open java.lang to unnamed module @66d33a; to use the thread-local-reset capability on Java 24 or later, use this JVM option: --add-opens java.base/java.lang=ALL-UNNAMED [in thread "executor-thread-6"]
at org.jboss.threads.JDKSpecific$ThreadAccess.<clinit>(JDKSpecific.java:32)
... 3 more
原因はJava24からリフレクションによるメンバへのアクセスが厳格化されたためです。
javaコマンドパラメータで、java.langパッケージへのリフレクションによるアクセスも許可させる必要があります。
bin\kc.batの以下の行を修正します。
(他パッケージへの許可を付与している行の最後に、エラーが出たパッケージ(java.lang)も追加します)
警告
正しい修正方法ではない可能性があります。運用環境へのバグフィックスはご注意ください。
修正前
set "JAVA_ADD_OPENS=--add-opens=java.base/java.util=ALL-UNNAMED --add-opens=java.base/java.util.concurrent=ALL-UNNAMED --add-opens=java.base/java.security=ALL-UNNAMED
修正後
set "JAVA_ADD_OPENS=--add-opens=java.base/java.util=ALL-UNNAMED --add-opens=java.base/java.util.concurrent=ALL-UNNAMED --add-opens=java.base/java.security=ALL-UNNAMED --add-opens java.base/java.lang=ALL-UNNAMED"
Keycloakを設定する
アプリの認証基盤として使用するために、最低限以下の設定が必要です。
- 管理者アカウントを作成する
- レルムを作成する
- レルムを設定する
- クライアントを作成する
- ユーザーを作成する
H2 Databaseのファイルは、Keycloakフォルダ配下の「data\h2」に保存されます。
Keycloakを停止して、「data\h2」配下のファイルを削除すると、初期状態でKeycloakを起動できます。
管理者アカウントを作成する
最初にマスター管理者を作成する必要があります。
マスター管理者を作成した後、そのアカウントでログインします。
レルムを作成する
Keycloakは1つのサーバーで複数のシステムやテナントを分離して管理できるようになっています。 その管理の最小単位がレルムです。Keycloakを利用する際は、用途に応じて1つ以上のレルムを作成して運用します。
左メニューの「Manage realms」を選択します。
初期状態では masterというレルムが1つ存在しています。これは管理用のレルムで、先ほど作成したマスター管理者が含まれています。
セキュリティと運用の観点から、masterレルムにシステムやテナントを追加してはいけません。「Create realm」ボタンを押して、新しいレルムを1つ作成します。
「Realm name」を入力します。今回は「myrealm」としました。
レルム一覧に「myrealm」が追加されました。作成したレルムが選択された状態となっています。
左上に現在選択されているレルムが「myrealm Current realm」として表示されています。この状態でレルムを設定していきます。
レルムを設定する
クライアントを作成する
作成したレルムが選択された状態で、左メニューの「Clients」を選択すると、そのレルムのクライアント一覧が表示されます。
作成したレルムには最初からいくつかクライアントが登録されています。これはKeycloakの管理画面等が登録されているためです。例えば、account-consoleはユーザー自身がパスワード変更等を行う管理用の画面です。
Viteを用いたlocal開発サーバーのWebアプリを想定したクライアントを作成してみます。
「Create client」ボタンを押して新しいクライアントを3ステップで作成します。
1. General settings
Client IDにアプリからアクセスするときのIDを設定します。今回はmyclientと設定します。
2. Capability config
Authentication flowはStandard flowにチェックが付いている状態にします。PKCE MehotdはS256を選択します。
3. Login settings
アプリのURL等を設定します。最低限必要な設定は以下の2項目です。
| 項目 | 値 |
|---|---|
| Valid redirect URIs | http://localhost:5173/* |
| Web origins | http://localhost:5173 |
ユーザーを作成する
作成したレルムが選択された状態で、左メニューの「Users」を選択すると、そのレルムのユーザー一覧が表示されます。レルムを作成した直後は0件です。
「Create new user」ボタンを押してユーザーを作成します。
今回はメールアドレスの確認は不要なのでEmail verifiedをOnにします。
Username、Email、First name、Last nameを設定します。
Createボタンを押すとアプリからログインできるユーザーが作成されます。
まとめ
Windows11にKeycloakをインストールして、最低限のセットアップを行う方法を記載しました。
インストールしてマスター管理者でログインした後、アプリの認証基盤として使用するには以下の3つの作業が必要です。
- レルムを作成
- クライアントを作成
- ユーザーを作成
Java21以上が入っている環境であれば、ワンライナーで起動できるKeycloakはOIDCサーバーとして開発にも、運用にも便利に使えると思います。
アプリに組み込んでいた認証機能を共通基盤に移行して、多要素認証や正しいシングルサインオンへの対応を進めていく必要があります。
独自進化を辿ってきた医療ITですが、厚生労働省やクラウド先行ベンダーのおかげで、今年2026年こそは医療ITのクラウド元年となるのではないでしょうか。













