OpenID Connect를 위한 세션 관리 엔드포인트 호출

OpenID Connect Relying Parties는 세션 관리 엔드포인트를 사용하여 네트워크 트래픽을 최소화하면서 특정 OpenID Connect Provider(OP)에 대한 사용자의 로그인 상태를 모니터링할 수 있습니다. 세션 관리 엔드포인트의 도움으로 Relying Party(RP)는 OpenID Connect Provider에서 로그아웃한 사용자를 로그아웃할 수 있습니다.

시작하기 전에

OP 세션 관리 엔드포인트 URL은 OP의 발견 엔드포인트에서 리턴된 발견 정보의 check_session_iframe 속성에서 얻습니다. 이 URL은 세션 관리 기능이 필요한 RP 애플리케이션에서 iframe의 대상으로 사용되어야 합니다. RP 애플리케이션은 또한 Window.postMessage() 요청을 제출하기 위해 iframeid 속성을 알아야 합니다.

이 태스크 정보

사용자의 로그인 상태 판별을 돕기 위해 RP는 src 대상이 OP의 세션 관리 엔드포인트로 설정된 iframe을 로드합니다. 세션 관리 엔드포인트는 사용자의 로그인 상태 또는 브라우저 상태를 저장하는 쿠키에 대한 액세스 권한이 있습니다. 이 브라우저 상태 쿠키는 사용자가 OP에서 로그아웃할 때 업데이트됩니다. 그런 다음 RP는 클라이언트 측 스크립팅을 사용하여 OP iframeWindow.postMessage() 함수를 호출하고 메시지 텍스트에서 클라이언트 ID와 현재 알려진 세션 상태를 전송할 수 있습니다. RP가 OP 프레임에서 값이 changedpostMessage를 수신하는 경우, OP에서 사용자의 로그인 상태가 변경되었으며 RP는 사용자를 로그아웃할지 여부를 결정할 수 있습니다. unchanged 값이 리턴된 경우 사용자는 여전히 OP에 로그인되어 있습니다.

OpenID Connect가 사용되는 Liberty 서버는 다음 URL에서 OpenID Connect 세션 관리 엔드포인트에 액세스할 수 있습니다.

https://server.example.com:443/oidc/endpoint/<provider_name>/check_session_iframe
문제점 예방: 아웃바운드 프록시를 사용하는 경우, OpenID Connect RP가 자동으로 호스트되는 프록시를 통해 요청을 라우팅하는 방법을 제공하지 않습니다.

OP(OpenID Connect Provider)에 액세스하기 위해 프록시를 사용해야 하는 경우, 임의의 OP 관련 URL 특성에 대해 입력하는 값이 외부 OP 호스트 및 포트가 아니라 프록시 호스트 및 포트를 포함해야 합니다.

대부분의 경우, OP 호스트 및 포트를 프록시 호스트 및 포트로 대체할 수 있습니다. 입력하는 URL이 RP 및 클라이언트(브라우저 또는 애플리케이션) 둘 다에 표시되어야 합니다. 사용할 올바른 URL을 판별하는 방법에 대한 안내가 필요하면 프록시 관리자에게 문의하십시오.

이 예제에서 클라이언트는 SSL 포트가 443으로 설정될 것으로 예상합니다.

프로시저

  1. OP 세션 관리 엔드포인트를 대상으로 하는 iframe을 로드할 수 있는 적절한 RP 애플리케이션에서 웹 자원을 작성하십시오. 웹 자원에는 권한 부여 응답의 session_state 매개변수에 리턴되는 세션 상태 값에 대한 액세스 권한도 있어야 합니다. 예를 들어, 세션 상태 값은 쿠키에 저장될 수도 있고 웹 자원에서 클라이언트 측 스크립팅이 해당 값을 알 수 있는 다른 모든 방법을 사용할 수도 있습니다. 다음은 이러한 iframe을 위한 샘플 HTML 스니펫입니다.
    <iframe id="iframeOP" src="https://server.example.com:443/oidc/endpoint/OidcConfigSample/check_session_iframe" frameborder="0" width="0" height="0"></iframe>
  2. 사용자의 로그인 상태를 확인하려면 클라이언트 ID와 세션 상태를 Client ID + " " + Session State 형식의 메시지 매개변수로 전달하고 OP의 호스트 이름을 대상 오리진 매개변수로 전달하여 OP iframeWindow.postMessage() 함수를 호출하십시오. 다음 JavaScript 샘플 함수에서 스크립트는 세션 상태 값이 session_state라는 쿠키에 저장될 것으로 예상하며 getCookieValue() 함수는 session_state 쿠키에 저장된 값을 리턴합니다.
    	var targetOP = "https://server.example.com:443";
    	function checkStatus() {
               var client = "client01";
               var sessionState = getCookieValue("session_state");
               var text = client + " " + sessionState;
               var iframe = document.getElementById("iframeOP");
               iframe.contentWindow.postMessage(text, targetOP);
    	}
  3. OP에서 사용자의 각 로그인 상태를 반영하는 changed 또는 unchanged 값을 포함하는 postMessages를 청취하도록 웹 자원을 구성하십시오. 그러면 RP는 OP에서 리턴된 값을 기반으로 사용자를 RP에서 로그아웃시킬지 여부를 결정할 수 있습니다. 이 함수는 postMessage의 오리진이 예상 OP 호스트 이름과 일치하는지 확인해야 합니다. 일치하지 않는 메시지는 모두 거절됩니다. 다음 JavaScript 예제는 이러한 메시지를 청취하도록 웹 자원에 이벤트 리스너를 추가하는 방법을 보여줍니다.
    	var targetOP = "https://server.example.com:443";
    	window.addEventListener("message", receiveMessage, false);
    	function receiveMessage(event) {
               if (event.origin !== targetOP) {
                         // Origin did not come from the OP; this message must be rejected.
                         return;
               }
               if (event.data === "unchanged") {
                         // User is still logged in to the OP
               } else {
                         // User has logged out of the OP
               }
    	}

결과

이제 사용자는 Liberty 서버 OP에서 OpenID Connect의 세션 관리 기능을 활용할 수 있는 RP의 웹 자원을 보유합니다. OP iframe에서 유지보수되는 브라우저 상태는 사용자가 OP에서 로그인하거나 로그아웃할 때 업데이트됩니다. OP에 성공적으로 로그인한 후에는 권한 부여 응답에 있는 새 세션 상태 값이 RP에 제공됩니다. 그러면 RP는 추가 네트워크 트래픽을 브로드캐스트하지 않으면서 클라이언트 측 스크립팅을 사용하여 사용자의 세션 상태를 유효성 검증하고 OP에서 사용자의 로그인 상태가 변경되었는지 여부를 판별할 수 있습니다.

다음 HTML 예제는 OpenID Connect Session Management를 사용하는 전체 HTML 페이지를 보여줍니다. OP iframesrc 속성은 OP로부터 얻은 세션 관리 엔드포인트 URL로 설정됩니다. startChecking() 함수는 60초마다 자동으로 호출되어 사용자의 로그인 상태를 확인합니다. 이 페이지에는 postMessage를 수신할 때 receiveMessage() 함수를 호출하는 message 이벤트 리스너가 있습니다. 이 함수는 postMessage가 OP에 대해 예상되는 도메인에서 왔는지 확인하고 리턴된 메시지의 값을 검사하여 사용자의 로그인 상태가 changed인지 아니면 unchanged인지 확인합니다.

RP 내에 있는 다른 웹 자원에는 표시되지 않는 iframe으로서 이 HTML 페이지 자체를 로드할 수 있습니다. 그러면 이 iframe을 로드하는 모든 웹 자원은 클라이언트 측 사용자의 로그인 상태를 모니터링할 수 있습니다.
	<!DOCTYPE html>
	<html>
	<head>
	<meta charset="ISO-8859-1">
	<title>iFrame RP Page</title>
	</head>
	<body onload="javascript:startChecking()">
            <iframe id="iframeOP" src="https://localhost:8999/oidc/endpoint/OidcConfigSample/check_session_iframe" frameborder="0" width="0" height="0"></iframe>
	</body>
	<script>
            var targetOP = "https://server.example.com:443";
		
            window.addEventListener("message", receiveMessage, false);
		
            function startChecking() {
                      checkStatus();
                      // Check status every 60 seconds
                      setInterval("checkStatus()", 1000*60);
            }
		
            function getCookieValue(cookieName) {
                      var name = cookieName + "=";
                      var cookies = document.cookie.split(';');
                      if (!cookies) {
                                return null;
                      }
                      for (var i = 0; i < cookies.length; i++) {
                                var cookie = cookies[i].trim();
                                if (cookie.indexOf(name) == 0) {
                                          return cookie.substring(name.length, cookie.length);
                                }
                      }
                      return null;
            }
		
            function checkStatus() {
                      var client = "client01";
                      var sessionState = getCookieValue("session_state");
                      var text = client + " " + sessionState;
                      var iframe = document.getElementById("iframeOP");
                      iframe.contentWindow.postMessage(text, targetOP);
            }
		
            function receiveMessage(event) {
                      if (event.origin !== targetOP) {
                                // Origin did not come from the OP; this message must be rejected
                                return;
                      }
                      if (event.data === "unchanged") {
                                // User is still logged in to the OP
                      } else {
                                // User has logged out of the OP
                      }
            }
	</script>
	</html>

주제의 유형을 표시하는 아이콘 태스크 주제

파일 이름: twlp_oidc_session_mgmt_endpoint.html