로그아웃
Logto에서 로그아웃은 두 가지 계층으로 구성됩니다:
- Logto 세션 로그아웃: Logto 도메인 하에서 중앙화된 로그인 세션을 종료합니다.
- 앱 로그아웃: 클라이언트 애플리케이션에서 로컬 세션 상태와 토큰을 삭제합니다.
Logto에서 세션이 어떻게 동작하는지 더 잘 이해하려면 세션을 참고하세요.
로그아웃 메커니즘
1) 클라이언트 측에서만 로그아웃
클라이언트 앱이 자체 로컬 세션과 토큰 (ID / 액세스 / 리프레시 토큰)을 삭제합니다. 이는 해당 앱의 로컬 상태에서만 사용자를 로그아웃시킵니다.
- Logto 세션은 여전히 활성 상태일 수 있습니다.
- 동일한 Logto 세션 하의 다른 앱들은 여전히 SSO가 가능합니다.
2) Logto에서 세션 종료 (현재 Logto 구현에서의 글로벌 로그아웃)
중앙화된 Logto 세션을 삭제하려면, 앱이 사용자를 end session 엔드포인트로 리디렉션합니다. 예시:
https://{your-logto-domain}/oidc/session/end
현재 Logto SDK 동작 방식:
signOut()이/session/end로 리디렉션합니다.- 이후
/session/end/confirm으로 이동합니다. - 기본 확인 폼이 자동으로
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가 포함됩니다.
일반적인 흐름:
- 사용자가 한 앱에서 로그아웃을 시작합니다.
- Logto가 end-session을 처리하고, 등록된 백채널 로그아웃 URI로 로그아웃 토큰을 전송합니다.
- 각 앱이 로그아웃 토큰을 검증하고 자체 로컬 세션 / 토큰을 삭제합니다.
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가 올바르게 등록되어 있는지 확인하세요.
- 앱이 동일한 사용자 / 세션 컨텍스트에 대해 활성 로그인 상태인지 확인하세요.