RP-Initiated Logout

RP-Initiated Logout (로그아웃)

앱에서 "로그아웃" 버튼을 눌렀는데, 정작 OpenID Provider(OP) 쪽 세션은 남아 있어서 다음에 다시 로그인 화면 없이 통과되는 경험을 본 적이 있을 거예요. 앱(RP)이 사용자를 OP의 로그아웃 엔드포인트로 리다이렉트해서 OP에서도 로그아웃을 시키는 표준 흐름이 바로 RP-Initiated Logout이에요. 이 글에서는 로그아웃 요청에 쓰는 파라미터와 로그아웃 후 다시 RP로 돌아오는 과정을 살펴볼게요.

출처: OpenID Connect RP-Initiated Logout 1.0

본문

흐름의 시작

RP는 최종 사용자의 사용자 에이전트를 OP의 **로그아웃 엔드포인트(Logout Endpoint)**로 리다이렉트해 로그아웃을 요청해요. 이 로그아웃 엔드포인트 URL은 보통 Discovery 응답의 end_session_endpoint 메타데이터에서 얻어요. 이 값은 RP-Initiated Logout과 Discovery를 지원할 때 Discovery 응답에 반드시 포함해야 하고, https 스킴을 써야 해요.

로그아웃 요청 파라미터

로그아웃 엔드포인트에서 쓰는 파라미터는 다음과 같아요.

  • id_token_hint (RECOMMENDED) — OP가 이전에 RP에 발급한 ID 토큰을 로그아웃 엔드포인트에 넘기는 힌트. RP가 로그아웃을 요청하는 최종 사용자 세션의 신원을 가리키는 데 써요. 이 값이 있으면 OP는 자신이 그 ID 토큰의 발급자인지 반드시 검증해야 해요.
  • logout_hint (OPTIONAL) — 로그아웃하는 사용자에 대한 힌트. 인증 요청의 login_hint와 유사한 역할이고, 값의 의미는 OP 재량이에요(예: 이메일, 전화번호, 사용자명, 세션 식별자).
  • client_id (OPTIONAL) — 인가 서버에서 유효한 OAuth 2.0 클라이언트 식별자. client_idid_token_hint가 함께 있으면 OP는 그 클라이언트 식별자가 ID 토큰 발급 시 쓴 것과 일치하는지 확인해야 해요.
  • post_logout_redirect_uri (OPTIONAL) — 로그아웃 수행 후 사용자 에이전트를 리다이렉트할 URI. https 스킴 사용을 권장하고, 이 값은 미리 OP에 등록된 값이어야 해요. 이 파라미터를 쓸 때는 id_token_hint도 함께 넣는 것을 권장해요.
  • state (OPTIONAL) — 로그아웃 요청과 콜백 사이의 상태를 유지하는 불투명 값. 요청에 포함하면 OP는 post_logout_redirect_uri로 돌려보낼 때 state 파라미터로 다시 전달해요.
  • ui_locales (OPTIONAL) — 사용자 인터페이스에 선호하는 언어·스크립트. 공백으로 구분한 BCP47 언어 태그 목록을 선호 순서대로 넣어요.

요청 방법

OP는 로그아웃 엔드포인트에서 HTTP GET과 POST를 모두 지원해야 해요. RP는 둘 중 아무 방법으로나 보낼 수 있고, GET이면 URI 쿼리 문자열 직렬화, POST면 폼 직렬화를 사용해요.

id_token_hint 검증과 재확인

OP는 id_token_hint가 있으면 자신이 발급자인지 검증해요. ID 토큰의 aud 또는 sid 클레임이 가리키는 RP가 OP에서 현재 또는 최근 세션을 갖고 있으면, exp가 지났어도 받아들이길 권장해요. sid가 현재 세션과 맞지 않으면 로그아웃 요청을 의심스러운 것으로 보고 처리하지 않을 수 있어요.

OP는 로그아웃 엔드포인트에서 사용자에게 "OP에서도 로그아웃할지" 물어보는 것이 좋아요. 특히 id_token_hint가 없거나, 제공된 ID 토큰이 현재 OP 세션에 속하지 않는다면 반드시 이 질문을 해야 해요. 사용자가 '예'라고 하면 OP는 사용자를 로그아웃시켜요.

사용자가 OP에서 로그아웃되면, OP는 그 사용자로 로그인된 다른 RP들에게도 로그아웃을 알려요. 이때 쓰는 알림 방식은 OpenID Connect Session Management, Front-Channel Logout, Back-Channel Logout 가운데 OP와 RP가 함께 지원하는 것을 골라요.

로그아웃 후 RP로의 리다이렉션

로그아웃 후 사용자 에이전트를 RP로 되돌리는 post-logout redirection은 로그아웃이 RP에 의해 시작된 경우에만 일어나요. 리다이렉트 대상은 요청한 RP가 보낸 post_logout_redirect_uri 값이고, 이 값이 미리 등록된 post_logout_redirect_uris 값 중 하나와 정확히 일치하지 않으면 OP는 리다이렉션을 수행하면 안 돼요. 로그아웃 후 리다이렉션은 OP가 다른 RP들에게 로그아웃 알림을 보내는 작업을 마친 뒤에 수행해요.

RP가 로그아웃 후 리다이렉션을 받고 싶다면 동적 클라이언트 등록(Dynamic Client Registration) 시 post_logout_redirect_uris 클라이언트 메타데이터로 자신이 쓸 수 있는 URL 배열을 등록할 수 있어요.

더 알아보기