業務でAPIサーバーをJava, SpringBootで作成した時、認証・認可サーバーとしてKeyCloakを使用しました。その際、学んだことを備忘録としてここに残しておきます。
【KeyCloakとは何なのか?】
1.KeyCloakとは、シングルサインオンやAPIアクセスの認証・認可制御を実現する、Javaベースのアイデンティティ・アクセス管理ソフトウェアです。
【KeyCloakをなぜ使うのか?】
1.ユーザーのデータを利用したいクライアントアプリケーションと、ユーザーデータを管理するリソースサーバーがあったとします。イメージとしては、フロントエンドがクライアントアプリケーション、バックエンドがリソースサーバーに該当します。
2.クライアントアプリケーションは、エンドポイントにアクセスしてAPIと必要なデータをやり取りします。しかし、このままではクライアントが悪意のある第三者だとしても、リソースサーバーはユーザーデータを渡してしまいます。結果として、ユーザーデータの流出やデータベースの改ざんなどの、様々な問題が発生する恐れがあります。
3.その問題を解決するため、OpenIDプロバイダーが発行するIDトークンを導入します。
KeyCloakはこのOpenIDプロバイダーに該当します。また、IDトークンとはユーザー認証情報を含む改ざん検知用の署名付きトークンのことを指します。
4.クライアントアプリケーションがリソースサーバー内のユーザーデータを取得するまでの実際の流れを見ていきます。まず最初に、クライアントアプリケーションがOpenIDプロバイダーに対してIDトークンを要求します。
5.すると、OpenIDプロバイダーはクライアントアプリケーションにIDトークンを与えるかどうかユーザーに確認します。
6.IDトークンを発行するため、ユーザーは本人確認情報の提示をすることでユーザー認証を行います。
7.ユーザー認証が適切に行われた場合、OpenIDプロバイダーはクライアントアプリケーションに IDトークンを発行します。
8.クライアントアプリケーションはリソースサーバーにユーザーデータを要求する際、OpenIDプロバイダーが発行したIDトークンを提示します。
8)リソースサーバーは、リクエストに含まれているIDトークンを取り出し、IDトークンが改ざんされていないか検証します。ここで、クライアントアプリケーションからのリクエストはOpenIDプロバイダーが認証したユーザーによるものか、認証されたユーザーがユーザーデータにアクセスするのに必要な認可情報を持っているか確認します。
9)ユーザーデータにアクセスするための認証・認可情報を所持していることを確認できた場合、ユーザーデータをクライアントアプリケーションに渡します。
10)なぜKeyCloakが必要かという疑問でしたが、「OpenIDプロバイダーとしてKeyCloakを導入することでAPIアクセスの認証・認可制御を実現できるから」ということになります。リソースサーバーをAPIとして公開するためには、誰がアクセスしてきたのかを確認するための「認証」と、APIへのアクセスを誰に許可するのかという「認可」の仕組みが必要不可欠となります。