🔑

自社WEBサービスの共通ID基盤にKeycloakを導入した話

に公開

はじめに

こんにちは!株式会社イノベーションでリードエンジニアをしているこだかです。

今回は、自社のWEBサービスで共通ID基盤を構築するためにKeycloakを導入した話を書いてみようと思います。技術的な詳細を記載すると膨大になってしまうため、なぜその選択をしたのか、どんな課題があったのかという部分を中心にお話ししたいと思います。

ID基盤構築の目的

私たちの会社では複数のWEBサービスを運営しているのですが、各サービスでユーザー管理がバラバラになっていました。そのためユーザーの利便性が損なわれていたり、会社としてもサービス横断でのデータ活用が難しい状況でした。

As-Is

  • サービスAで登録したユーザーがサービスBでは別のアカウントとして扱われる
  • ユーザーの行動データがサービス間で紐付けできない
  • 退会処理が各サービスで個別に行う必要がある

To-Be

  • ユーザーを横串で管理して、データ活用に活かしたい
  • サービス横断でユーザーの識別を可能にする
  • 一度の認証で複数サービスにアクセスできる

シングルサインオン(SSO)の実現により、ユーザー体験の向上とサービス横断でのデータ活用基盤の構築が主な狙いとなります。

認証フローの変化

ID基盤の導入による認証フローの変化は以下です。

変更前:サービスごとの個別認証

  • サービスAで登録 → サービスBでは別アカウントとして扱われる
  • 各サービスで個別にログインが必要
  • パスワード管理が煩雑(サービス数分のアカウント管理)
  • 退会時は各サービスで個別に手続きが必要

変更後:共通ID基盤によるSSO

  • 一度の登録で全サービスにアクセス可能
  • 一つのアカウントで複数サービスを利用
  • パスワードは一つでOK
  • 退会時は一度の手続きで全サービスから退会

技術的な補足

  • OAuth 2.0 / OpenID Connect の Authorization Code Flow を採用
  • Keycloakが認証サーバー(Authorization Server)として機能
  • 各サービスはクライアントアプリケーションとして動作

Keycloakの採用理由

ID基盤の候補として Auth0、AWS Cognito、Firebase なども検討しましたが最終的にKeycloakを採用しました。

Keycloakを選んだ理由

  1. カスタム自由度が高い

    • 独自の認証フローを実装できる
    • ユーザー属性のカスタマイズが自由
  2. Docker開発環境との親和性

    • Dockerイメージが提供されておりコンテナ化が簡単
    • 開発環境の構築が容易
  3. インフラ管理の柔軟性

    • ECSなどのコンテナサービスでデプロイが可能
    • コストとパフォーマンスのバランスを要件に応じて自由に調整できる

これらの理由を総合的してKeycloakの採用を決めました。特にOSSであることとカスタマイズ性の高さが、自社の要件に最も適していると判断しました。

よくある要件とKeycloakでの対応方法

フロントエンドのカスタマイズ

新規登録/ログインページ、パスワード再設定ページなど基本的に全てのページがカスタマイズ可能です。通常はFreeMarkerテンプレート(.ftl)ファイルを編集してKeycloakテーマを作成しますが、弊社ではkeycloakifyというOSSを活用してReactで実装を行いました。

Keycloakify

  • https://www.keycloakify.dev/
  • Reactで記述
  • バリデーションなどのフロント用スクリプトも対応可能
  • テンプレートファイル(.ftl)を出力してくれる

退会ユーザーの伝播

ユーザーが退会した際に、各サービスにその情報を伝えるためのものです。KeycloakにはEventListenerという仕組みがあり、各種イベント(新規登録時、ログイン時、退会時など)をトリガーにした任意処理をServiceProviderで指定することができます。

ServiceProvider

  • KeycloakのServiceProvider(.jar)を自前で作成
    • AWS SNSを使ったPub/Subで実現
  • 退会イベントを各サービスに通知する仕組みを実装

大変だった点とその解決方法

先述したServiceProviderの開発

チームにJavaエンジニアがいない中で、KeycloakのServiceProviderを自前で開発する必要がありました。これが一番大変でした。

Docker開発環境の構築

  • Keycloak用のServiceProvider(.jar)の開発・ビルドができるDocker開発環境を用意
  • チームメンバーが誰でも開発できる環境を整備

今後の展望

現在は基本的なSSO機能が動作しており、ユーザー体験の向上を実感できています。今後はさらなる価値の創出に向けて以下の取り組みを進めていく予定となっています。

短期目標:

  • 残りのサービスへのSSO導入を順次進める
  • ユーザー体験のさらなる向上

長期目標:

  • 共通ID基盤/データ分析基盤を活用したデータドリブンな活動のさらなる推進
  • サービス横断でのユーザー行動分析による事業価値の創出

まとめ

Keycloakを使ったID基盤の構築について紹介させていただきました。個人的な感想としては、管理コンソールでぽちぽち設定しなければいけないIDaaS製品が多い中で設定のほぼ全てをコードで管理できるKeycloakの開発体験は非常に良かったです。

同じような課題を抱えている方の参考になれば嬉しいです。何か質問があれば、コメントでお気軽にどうぞ!

株式会社イノベーション Tech Blog

Discussion