본문으로 건너뛰기

로그아웃

Logto에서 로그아웃은 두 가지 계층으로 구성됩니다:

  • Logto 세션 로그아웃: Logto 도메인 하에서 중앙화된 로그인 세션을 종료합니다.
  • 앱 로그아웃: 클라이언트 애플리케이션에서 로컬 세션 상태와 토큰을 삭제합니다.

Logto에서 세션이 어떻게 동작하는지 더 잘 이해하려면 세션을 참고하세요.

로그아웃 메커니즘

1) 클라이언트 측에서만 로그아웃

클라이언트 앱이 자체 로컬 세션과 토큰 (ID / 액세스 / 리프레시 토큰)을 삭제합니다. 이는 해당 앱의 로컬 상태에서만 사용자를 로그아웃시킵니다.

  • Logto 세션은 여전히 활성 상태일 수 있습니다.
  • 동일한 Logto 세션 하의 다른 앱들은 여전히 SSO가 가능합니다.

2) Logto에서 세션 종료 (현재 Logto 구현에서의 글로벌 로그아웃)

중앙화된 Logto 세션을 삭제하려면, 앱이 사용자를 end session 엔드포인트로 리디렉션합니다. 예시:

https://{your-logto-domain}/oidc/session/end

현재 Logto SDK 동작 방식:

  1. signOut()/session/end로 리디렉션합니다.
  2. 이후 /session/end/confirm으로 이동합니다.
  3. 기본 확인 폼이 자동으로 logout=true를 전송합니다.

결과적으로, 현재 SDK의 로그아웃은 글로벌 로그아웃으로 처리됩니다.

노트:
  • 글로벌 로그아웃: 중앙화된 Logto 세션을 폐기합니다.

글로벌 로그아웃 시 일어나는 일

글로벌 로그아웃 중에는:

  • 중앙화된 Logto 세션이 폐기됩니다.
  • 관련 앱 권한(grant)은 앱 인가 상태에 따라 처리됩니다:
    • offline_access부여되지 않은 경우, 관련 권한이 폐기됩니다.
    • offline_access부여된 경우, end-session으로 권한이 폐기되지 않습니다.
  • offline_access가 부여된 경우, 리프레시 토큰과 권한은 권한 만료, 리프레시 토큰 만료, 또는 명시적 폐기 중 가장 빠른 시점까지 유효합니다.

권한(grant) 수명과 offline_access 영향

  • 기본 Logto 권한(grant) TTL은 180일입니다.
  • offline_access가 부여된 경우, end-session은 해당 앱 권한을 기본적으로 폐기하지 않습니다.
  • 해당 권한과 연결된 리프레시 토큰 체인은 권한이 만료되거나, 리프레시 토큰이 만료되거나, 권한이 명시적으로 폐기될 때까지 계속됩니다.
  • 싱글 페이지 애플리케이션(SPA)의 경우, 리프레시 토큰 회전은 리프레시 토큰 TTL을 연장하지 않으므로, 리프레시 토큰이 권한보다 먼저 만료될 수 있습니다.

연동 로그아웃: 백채널 로그아웃

앱 간 일관성을 위해, Logto는 백채널 로그아웃을 지원합니다.

사용자가 한 앱에서 로그아웃하면, Logto는 동일한 세션에 참여하는 모든 앱에 로그아웃 토큰을 각 앱의 등록된 백채널 로그아웃 URI로 전송하여 알릴 수 있습니다.

앱 백채널 설정에서 Is session required가 활성화된 경우, 로그아웃 토큰에 Logto 세션을 식별하는 sid가 포함됩니다.

일반적인 흐름:

  1. 사용자가 한 앱에서 로그아웃을 시작합니다.
  2. Logto가 end-session을 처리하고, 등록된 백채널 로그아웃 URI로 로그아웃 토큰을 전송합니다.
  3. 각 앱이 로그아웃 토큰을 검증하고 자체 로컬 세션 / 토큰을 삭제합니다.

Logto SDK에서의 로그아웃 방법

  • SPA 및 웹: client.signOut()이 로컬 토큰 저장소를 삭제하고 Logto end-session 엔드포인트로 리디렉션합니다. 로그아웃 후 리디렉션 URI를 지정할 수 있습니다.
  • 네이티브 (React Native / Flutter 포함): 일반적으로 로컬 토큰 저장소만 삭제합니다. 세션리스 웹뷰이므로 삭제할 Logto 브라우저 쿠키가 없습니다.
노트:

세션리스 웹뷰를 지원하지 않거나 emphasized 설정을 인식하지 않는 네이티브 애플리케이션(Android 앱에서 React Native 또는 Flutter SDK 사용 등)의 경우, 인가 요청에 prompt=login 파라미터를 전달하여 사용자가 다시 로그인하도록 강제할 수 있습니다.

매번 재인증(재로그인) 강제하기

보안이 중요한 작업의 경우, 인증 요청에 prompt=login을 포함하여 SSO를 우회하고 매번 자격 증명 입력을 강제할 수 있습니다.

리프레시 토큰(offline_access)을 요청하는 경우, consent, prompt=login consent도 함께 포함하세요.

일반적인 조합 예시:

prompt=login consent

자주 묻는 질문

백채널 로그아웃 알림을 받지 못하고 있습니다.

  • Logto 대시보드에서 백채널 로그아웃 URI가 올바르게 등록되어 있는지 확인하세요.
  • 앱이 동일한 사용자 / 세션 컨텍스트에 대해 활성 로그인 상태인지 확인하세요.
OIDC 백채널 로그아웃 이해하기.