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