ログアウト とは、認証済みセッションが不要になった時点で終了し、権限のない第三者によるセッションの「乗っ取り」を防ぐためのものです。通常は、ユーザーに提供するユーザーインターフェイスにログアウトのオプションを用意して実現します。ユーザーがログインすると、複数種類のセッション (例: ローカルアプリケーションのセッション、Auth0 セッション、サードパーティの セッション) が作成されることがあり、ユーザーが Logout オプションをクリックした際に、そのうちどのセッションを終了する必要があるかを判断する必要があります。
ベストプラクティス
ログアウトの動作では、どのセッションが終了されるのかをユーザーに明確に示す必要があります。また、理想的には、ログアウト後に視覚的な確認も表示するようにしてください。
ログアウト動作を設定する際は、次の点を考慮する必要があります。
- ユーザーがログアウトを開始したときに、どのセッションを終了すべきですか。
- 終了したセッションの確認として、どのような情報をユーザーに提供すべきですか。
- ログアウト完了後、ユーザーをどこにリダイレクトすべきですか。
- ユーザーがログアウト処理を実行しなかった場合、セッションをどのくらい維持したいですか。
- エンドユーザーが 1 つのアプリケーションからログアウトしたときに、そのユーザーのすべてのアプリケーションセッションからもログアウトさせるべきですか。
- ログアウト時に、組織の IdP とのセッションも終了すべきですか。
ユーザーがログインするたびに作成されるセッションの種類はさまざまであるため、ログアウトにもいくつかの種類があります。ローカルアプリケーションのログアウトはアプリケーションとのセッションを終了し、Auth0 のログアウトは Auth0 セッションを終了します。独自の IdP を使用している組織がある場合は、フェデレーテッドログアウト 戦略を検討し、それに応じて実装することをおすすめします。グローバルログアウト、または シングルログアウト (SLO) は、Auth0 セッションを終了し、さらに Auth0 セッションに依存しているアプリケーションにログアウト要求または通知を送信します。
アプリケーションが提供する機能や、シングルサインオン (SSO) のような機能の利用状況に応じて、必要なログアウトの種類や、ユーザーに提供すべき視覚的な確認内容が決まります。どのオプションを選ぶ場合でも、実装するログアウト処理では、どのセッションが終了されるのか、またログアウト処理がいつ完了したのかをユーザーに明確に示す必要があります。
あるアプリケーションのログアウト機能によって、他のアプリケーションでも使用されている Auth0 の SSO セッションが終了すると、未確定のトランザクションがある場合にユーザーが作業内容を失うおそれがあります。作業内容の損失を最小限に抑えるため、そのような状況に対処するために必要な機能を必ず追加してください。
状況によっては、ユーザーが提供されているいずれか 1 つのアプリケーションからログアウトしたときに、関連するすべてのアプリケーションからもログアウトすることが期待される場合があります。これは実装を複雑にする可能性があります。ただし、ユーザーが脆弱な状態に置かれる懸念がある場合 (たとえばデータの機密性などの理由による場合) は、シングルログアウト を確認し、それに応じて実装する必要があるでしょう。
ユーザーがログアウトすると、指定した場所にリダイレクトされます。この場所はログアウト リダイレクト URLとして指定し、 でパラメーターとして定義できます。
ログアウト後にユーザーのリダイレクト先として使用する URL は、オープンリダイレクトのセキュリティ脆弱性を軽減するため、Dashboard で許可リストに登録しておく必要があります。許可リストには、テナントレベルまたはアプリケーションレベルで登録できます。
ユーザーがログアウトした後にアプリケーションへリダイレクトされ、そのアプリケーションが、引き続きユーザーの有効なセッションを保持しているIDプロバイダーにリダイレクトする場合、ユーザーはアプリケーションにサイレント ログインされます。その結果、ユーザーにはログアウト処理が正しく機能しなかったように見えることがあります。
すべてのユーザーが手動でログアウト処理を行うとは限らないため、Auth0 では、セッションが過度に長時間維持されるのを防ぐための セッション タイムアウト も提供しています。この設定は、Auth0 Dashboard で利用および設定できます。
フェデレーテッドログアウト を行う場合は、シングルログアウト (SLO) も実装することになるケースが一般的です。主なアプローチは 2 つあります。
SLO を導入するとシステムが複雑になる可能性があるため、追加の開発コストや保守コストをかける前に、本当に必要かどうかを十分に検討してください。
ベストプラクティス
レート制限やパフォーマンス低下を避けるため、Auth0 テナントへの呼び出しは必要以上に増やさないようにしてください。ベストプラクティスとしては、トークンの有効期限が切れていて、かつユーザーが操作を行った場合にのみ、新しいトークンを要求します。これにより、アプリケーションが開かれているだけで実際には使われていない場合に、新しいトークンを継続的にポーリングし続けることを防げます。
これは、シングルログアウトを実現するうえで最もシンプルなアプローチです。各アプリケーションでは、ユーザーがシステムを利用できる時間を短く設定します。たとえば 5〜10 分です。ユーザーが何らかの操作を行うたびに、その時間を過ぎていれば、新しいトークンを取得するために、通常の Web アプリでは Auth0 へのリダイレクト、クライアントサイドのシングルページアプリケーションでは Silent Authentication を使用します。通常、新しいトークンは (SSO) セッションにより、サイレントに発行されます。ただし、ログアウト後は SSO セッションが削除されているため、どのアプリケーションでも新しいトークンをサイレントに取得できなくなり、ユーザーは認証情報を再入力する必要があります。
connection パラメーターを使うエンタープライズ接続の一部として、ユーザーをそのユーザー自身の IdP に自動的に直接転送している場合、フェデレーテッドログアウト も実施していない限り、この手法は機能しない可能性があります
もう 1 つの方法として、アプリケーションのセッションを追跡して破棄できるログアウトサービスを構築する方法があります。各アプリケーションは、セッションを作成したときと削除したときに、そのログアウトサービスに通知します。この (ログアウト) サービスは、すべてのアプリケーションのサーバーサイドセッションに直接アクセスしてそれらを直接破棄するか、各アプリケーションにバックチャネル呼び出しを行って、アプリケーションにセッションを削除するよう指示できる必要があります。
この方法は、ユーザーがログアウトしてから、すべてのアプリケーションでログアウトされるまでの遅延が小さいため、非常に効果的です。ただし、実装が複雑になり、追加の開発時間が必要になる可能性があります。また、システムに新しく追加されるアプリケーションがこのサービスにも追加されるようにする仕組みも必要です。
Federated User Logout は、アプリケーションで検討が必要になる場合があります。お客様またはその顧客がサードパーティの IdP (つまり、データベース IDプロバイダー 以外) を使用する場合は、アプリケーションからログアウトする際に、ユーザーを IdP からもログアウトさせる必要があるかどうかを判断する必要があります。これは、ユーザーが何を期待しているかによって異なります。使用しているアプリケーションや IdP が顧客の組織と密接に結び付いており、日常業務の中核を担っている場合、アプリケーションからログアウトしたときに IdP からもログアウトされると、ユーザーにとって煩わしく感じられる可能性があります。一方、そうでない場合は、IdP からもログアウトされることが想定どおり、あるいは場合によっては望ましいこともあります。ほとんどの B2B シナリオでは、ユーザーに対してフェデレーテッドログアウトを実行しないほうが望ましいと、お客様は判断しています。
推奨戦略の詳細を確認できるよう、PDF 形式の計画ガイダンスを用意しています。ダウンロードして参照してください。
B2B IAM プロジェクト計画ガイド