日立製作所 中村 雄一
Keycloakではセッションという用語が頻発してきます。一方で、OAuth2.0の認可サーバとして使おうとすると、セッションとトークンの関係が分からなくなることがよくあります。また、元々のKeycloakの使い方でもあるSSO(OAuth2.0の場合はOpenID Connectベース)も関連するためさらに分からなくなります。本記事では、KeycloakにおけるセッションとトークンとSSOの関係について整理してみます。なお、プロトコルとしては、OAuth2.0とその上のOpenID Connectを使っていることを前提としています。
セッションとは
Keycloakによって、ユーザが認証されると、内部的にはセッションと呼ばれるデータ構造が生成され、認証されたユーザの状態を管理します。セッションに、アクセストークンやリフレッシュトークン、またSSOに使われるCookieが紐づけられています。もう少し詳しく見ていきます
セッションとトークンの関係
Keycloak内部では、アクセストークン、リフレッシュトークンそのものは保持しておらず、トークン類は、セッションに格納された情報を元に生成されます。
例えば、トークンエンドポイントからトークン類が返却される際も、セッションに格納された情報を元にトークン類を生成していますし、またToken Introspection時も、セッションに格納された情報と比較も行っています。セッションが無効になるとトークン類も無効になります。
セッションとSSOで使われるCookieの関係
Keycloakは、エンドユーザが認証に使ったブラウザに対して、認証成功時にCookie(KEYCLOAK_IDENTITY等)を発行しています。これらのCookieはSSO用に用いられるものです。例えば、あるWebサイトがKeycloakと連携している場合、そのサイトからKeycloakにリダイレクトされます。初回はKeycloakによって認証が求められ、結果Cookieが発行されます。次いで、Keycloakと連携している別のサイトにアクセス時は、既にKeycloakからCookieが発行されていれば、それをもってKeycloakとの認証が成功となります(パスワードの入力は不要)。これらのCookieも、セッションと紐づいています。セッションが無効になるとCookieも無効になります。
セッションとメモリの関係
セッションは、keycloak内部のinfinispanというコンポーネントによって、メモリ上に管理されます。セッションはトークンやCookieと密接に紐づいており、頻繁に参照されるため、DBに格納せずに、メモリ上で管理しているのだと推察しています。ここで、セッションは認証されたユーザの数となります。セッションが無効にならないかぎり(どのように無効になるか後述)、ユーザが認証されるたびに増え続けます。セッションが増えると、メモリ消費も増えるため、Keycloakのサイジング時には、セッション数と消費メモリの関係を検証し見積もる必要があります。万単位のセッションができるとメモリ消費も無視できないものになってくるため注意が必要です。
オフラインセッション
オフラインセッションとは、以前の記事で紹介した、オフライントークンと紐づくセッションです。オフライントークンが生成されると、これまでのセッションとは別に、オフラインセッションが生成され管理されます。オフラインセッションは、メモリ上に管理されるだけでなく、永続化を目的にDBにも格納され管理されます。ここで、「これまでのセッションとは別に」オフラインセッションが生成されますので、オフライントークンを使うと、メモリ消費量がさらに増える傾向にあるのでサイジング時には注意が必要です。
セッションの有効期限
セッションは、以前の記事で紹介した、SSO Session Idle/SSO Session Maxで指定した時間を過ぎると、メモリ上から消去されます。
同様に、オフラインセッションについても、Offline Session Idle/Offline Session Maxで指定した時間を過ぎると、メモリ上から消去されます。
セッションの削除
有効期限以外にも、ログアウトエンドポイントにアクセスすることで、セッションを削除することもできます。SSO目的で使っている場合はOAuth2.0の認可サーバとして使っている場合とで使い方が違ってきます。
SSO目的で使っている場合は、単純にブラウザからのアクセスをlogoutエンドポイントに誘導するだけです。logoutエンドポイントにアクセスすると、ブラウザのKEYCLOAK_IDENTITY Cookieに紐づいたセッションが消去されます。
認可サーバとして使っている場合は、リフレッシュトークンと共にlogoutエンドポイントをコールすれば、リフレッシュトークンに紐づいたセッションが消去されます。
以上で見てきたように、セッションはKeycloakの中核をなすデータであり、またサイジング時にも重要になってきます。セッションについては多岐にわたり書ききれないことも多いのですが、少しでもKeycloakの理解の参考になれば幸いです。