OIDC 로그아웃 및 세션 관리 구현: 완벽한 가이드
OIDC 인증 및 세션 관리를 심도 있게 탐구하세요. 안전한 세션 처리를 위한 OIDC RP 시작, IdP 시작, 백 채널 로그아웃을 구현하는 방법을 배웁니다.
OIDC 세션 관리란?
OpenID Connect (OIDC)은 OAuth 2.0 프로토콜을 기반으로 구축된 간단한 정체성 레이어입니다. 인증 서버가 수행한 인증을 기반으로 클라이언트가 최종 사용자 신원을 확인할 수 있게 하며, 상호 운영 가능하고 REST 유사한 방식으로 최종 사용자의 기본 프로필 정보를 얻을 수 있습니다.
OIDC는 사용과 구현이 용이하도록 설계되었으며, 단순함과 유연성에 중점을 두고 있습니다. 웹 애플리케이션, 모바일 앱 및 API에서 싱글 사인온 (SSO) 및 신원 확인을 위해 널리 사용됩니다.
OIDC에서 인증 상태와 세션 관리 이해는 매우 중요합니다. 이 문서에서는 IdP(Identity Provider)와 RP(Relying Party) 또는 SP(Service Provider) 간 상호 작용 맥락에서 OIDC 세션과 사용자 인증 상태가 어떻게 관리되는지를 설명합니다.
이 문서에는 여러 주요 용어가 포함되어 있습니다.
- IdP(Identity Provider): 사용자의 신원을 저장하고 인증하는 서비스입니다.
- SP(서비스 공급자) 또는 RP(의존 당사자): 사용자에게 서비스를 제공하며, 사용자 인증을 위해 IdP에 의존하는 웹 애플리케이션 또는 서비스입니다.
- 로그인 세션 또는 인증 세션: 사용자가 IdP에 로그인할 때 설정되는 세션입니다.
- Grant: IdP에 의해 생성되고 관리되는 중앙 집중화된 사용자 인증 및 권한 부여 정보입니다.
- 싱글 사인온 (SSO): 사용자가 하나의 로그인 자격증명을 사용하여 여러 애플리케이션에 접근할 수 있게 하는 세션 및 사용자 인증 서비스입니다.
OIDC 인증 흐름은 어떻게 작동하나요?
OIDC 세션 및 사용자 인증 상태 관리를 더 잘 이해하기 위해 웹 애플리케이션의 OIDC 인증 흐름을 간단히 살펴보겠습니다:
- 사용자가 웹 애플리케이션 (RP)에 액세스합니다.
- RP는 사용자 인증을 위해 사용자를 OIDC 공급자 (IdP)로 리디렉션합니다.
- OIDC 공급자는 사용자의 로그인 세션 상태를 확인합니다. 세션이 존재하지 않거나 만료된 경우, 사용자는 로그인하라는 메시지를 받습니다.
- 사용자는 로그인 페이지와 상호작용하여 인증을 받습니다.
- 로그인 페이지는 OIDC 공급자에게 상호작용 결과를 제출합니다.
- OIDC 공급자는 사용자를 위한 새로운 로그인 세션 및 인증 grant를 생성합니다.
- OIDC 공급자는 사용자에게 인증 코드와 함께 RP로 리디렉션합니다 (Authorization Code flow).
- RP는 인증 코드를 받고 사용자 정보를 액세스하기 위해 토큰으로 교환합니다.
RP 로그인 세션 관리는 무엇인가요?
사용자가 IdP에 로그인하면 로그인 세션이 설정됩니다. 이 세션은 IdP에서 사용자의 인증 상태를 추적하는 데 사용됩니다. 세션에는 사용자의 신원, 인증 시간 및 세션 만료 시간과 같은 정보가 포함됩니다. 사용자가 처음 로그인할 때 생성되며 사용자가 로그아웃하거나 세션이 만료될 때까지 유지됩니다.
세션 상태를 유지하기 위해 사용자의 브라우저에 안전하게 세션 쿠키가 설정됩니다. 세션 쿠키는 사용자의 세션을 식별하고 이후 인증 요청에 대해 사용자를 인증하는 데 사용됩니다. 이 쿠키는 일반적으로 HttpOnly
및 Secure
플래그로 설정되어 클라이언트 측 접근을 방지하고 안전한 통신을 보장합니다.
단일 RP에 대한 한 개의 세션
사용자가 다양한 장치나 브라우저에서 접근하는 각 RP마다 별도의 사용자 로그인 세션이 설정됩니다. 이는 사용자의 인증 상태가 각 RP마다 따로 유지된다는 의미입니다. 사용자가 하나의 RP에서 로그아웃하더라도 다른 RP에서는 세션이 만료되거나 모든 RP에서 로그아웃할 때까지 여전히 인증 상태가 유 지됩니다.
여러 RP에 대한 중앙 집중화된 세션
이 중앙 집중화된 세션 관리는 사용자의 세션이 활성화되어 있고 동일한 사용자 에이전트(장치/브라우저)에서 인증 요청이 오는 한, 여러 RP 간에 일관된 인증 상태를 유지하도록 IdP가 허용합니다. 이 메커니즘은 사용자가 다시 로그인할 필요 없이 여러 RP에 액세스할 수 있는 SSO 기능을 가능하게 합니다.
클라이언트 측 인증 상태
OIDC에서는 클라이언트 애플리케이션(RP)이 IdP에서 발행한 토큰에 의존하여 사용자의 신원 및 인증 또는 권한 상태를 확인합니다. 클라이언트 측의 "로그인 세션"은 IdP에서 발행한 토큰에 의해 유지됩니다.
- ID 토큰: 사용자 정보를 포함한 단기 유효 토큰으로 인증된 사용자의 신원을 확인하는 데 사용됩니다.
- 액세스 토큰: 사용자를 대신하여 보호된 리소스에 대한 액세스를 부여하는 토큰입니다. 액세스 토큰의 유효 기간은 설정에 따라 단기일 수 있고 장기일 수 있습니다. 클라이언트 애플리케이션은 사용자의 인증 상태를 판단하는 데 액세스 토큰의 유효성을 의존할 수 있습니다. 액세스 토큰이 만료되거나 삭제되면 사용자가 "로그아웃" 또는 "미인증" 상태로 간주되며 재인증이 필요할 수 있습니다.
- 리프레시 토큰:
offline_access
범위가 요청되고 승인된 경우, 클라이언트 애플리케이션은 리프레시 토큰을 수신할 수 있습니다. 이는 사용자가 재인증 없이 사용자의 인증 상태를 연장할 수 있는 수단을 제공합니다. 클라이언트 애플리케이션은 현재 액세스 토큰이 만료될 때 리프레시 토큰을 사용하여 새로운 액세스 토큰을 얻을 수 있습니다. 리프레시 토큰이 유효한 한, 사용자의 인증 상태는 사용자 상호작용 없이 유지될 수 있습니다.
이들 토큰의 조합은 클라이언트 애플리케이션이 사용자의 인증 상태를 유지하고 사용자의 보호된 리소스에 액세스할 수 있게 합니다. 클라이언트 애플리케이션은 이러한 토큰을 안전하게 저장하고 그 수명주기를 관리해야 합니다. (예: SPA 애플리케이션의 경우, 토큰은 브라우저의 로컬 저장소 또는 세션 저장소에 저장될 수 있습니다. 웹 애플리케이션의 경우, 토큰은 서버 측 세션 데이터 또는 쿠키에 저장될 수 있습니다.)
OIDC 로그아웃 메커니즘
OIDC에서 로그아웃 과정은 중앙 집중화된 IdP 관리 로그인 세션과 클라이언트 측에서 분산된 토큰 모두가 관련되므로 다면적인 개념입니다.
클라이언트 측에서 토큰 및 로컬 세션 지우기
클 라이언트 측에서 사용자의 인증 상태를 로그아웃하거나 무효화하는 것은 비교적 간단합니다. 클라이언트 애플리케이션은 사용자 브라우저 또는 메모리에서 저장된 토큰(ID 토큰, 액세스 토큰 및 리프레시 토큰)을 제거할 수 있습니다. 이 작업은 클라이언트 측에서 사용자의 인증 상태를 효과적으로 무효화합니다.
자신만의 사용자 로그인 세션을 관리하는 웹 애플리케이션의 경우, 추가 단계가 필요할 수 있습니다. 여기에는 세션 쿠키 및 사용자 아이디 공급자(IdP)에서 발행한 토큰과 같은 모든 세션 데이터를 지워 사용자가 완전하게 로그아웃되었음을 보장하는 작업이 포함됩니다.
IdP에서 중앙 집중화된 로그인 세션 지우기
IdP는 각 사용자에 대해 중앙 집중화된 로그인 세션을 유지합니다. 이 세션이 활성 상태인 한, 클라이언트 측 토큰이 지워지더라도 사용자는 자동적으로 다시 인증되어 클라이언트 애플리케이션에 새 토큰이 발행될 수 있습니다.
사용자를 IdP에서 완전히 로그아웃하려면 클라이언트 애플리케이션(RP)이 IdP에 로그아웃 요청을 시작할 수 있습니다. 애플리케이션(RP)은 사용자를 IdP의 세션 종료 엔드포인트로 리디렉션하여 로그인 세션을 종료하고 세션 쿠키를 지워야 합니다. 이는 동일한 중앙 집중화된 세션을 공유하는 모든 애플리케이션(RP)에서 완전한 로그아웃을 보장합니다. 세션이 종료되면, IdP가 동일한 세션을 공유하는 연결된 모든 RP로부터 토큰 요청을 받을 때마다 사용자는 다시 인증하라는 메시지를 받게 됩니다.
OIDC 백채널 로그아웃
일부 경우에서는 사용자가 한 애플리케이션(RP)에서 로그아웃할 때 추가 사용자 상호작용 없이 모든 다른 애플리케이션(RP)에서도 자동으로 로그아웃되기를 원할 수 있습니다. 이는 백채널 로그아웃 메커니즘을 사용하여 달성할 수 있습니다.
IdP가 RP로부터 로그아웃 요청을 받을 때, 로그인 세션을 지우는 것 외에도 동일한 세션을 사용하고 백채널 로그아웃 엔드포인트가 등록된 모든 RP에 백채널 로그아웃 알림을 보냅니다.
RP가 백채널 로그아웃 알림을 받으면 사용자의 세션 및 토큰을 지우는 데 필요한 작업을 수행하여 사용자가 모든 애플리케이션에서 완전히 로그아웃되도록 할 수 있습니다.