OpenID Connect를 위한 세션 관리 엔드포인트 호출
OpenID Connect Relying Parties는 세션 관리 엔드포인트를 사용하여 네트워크 트래픽을 최소화하면서 특정 OpenID Connect Provider(OP)에 대한 사용자의 로그인 상태를 모니터할 수 있습니다. 세션 관리 엔드포인트의 도움으로 Relying Party(RP)는 OpenID Connect Provider에서 로그아웃한 사용자를 로그아웃할 수 있습니다.
시작하기 전에
이 태스크 정보
사용자의 로그인 상태 판별을 돕기 위해 RP는 src 대상이 OP의 세션 관리 엔드포인트로 설정된 iframe을 로드합니다. 세션 관리 엔드포인트는 사용자의 로그인 상태 또는 브라우저 상태를 저장하는 쿠키에 대한 액세스 권한이 있습니다. 이 브라우저 상태 쿠키는 사용자가 OP에서 로그아웃할 때 업데이트됩니다. 그런 다음 RP는 클라이언트 측 스크립팅을 사용하여 OP iframe의 Window.postMessage() 함수를 호출하고 메시지 텍스트에서 클라이언트 ID와 현재 알려진 세션 상태를 전송할 수 있습니다. RP가 OP 프레임에서 값이 changed인 postMessage를 수신하는 경우, OP에서 사용자의 로그인 상태가 변경되었으며 RP는 사용자를 로그아웃할지 여부를 결정할 수 있습니다. unchanged 값이 리턴된 경우 사용자는 여전히 OP에 로그인되어 있습니다.
OpenID Connect가 사용되는 Liberty 서버에는 다음 URL에 있는 OpenID Connect 세션 관리 엔드포인트에 대한 액세스 권한이 있습니다.
https://server.example.com:443/oidc/endpoint/<provider_name>/check_session_iframe
프로시저
결과
예
다음 HTML 예제는 OpenID Connect Session Management를 사용하는 전체 HTML 페이지를 보여줍니다. OP iframe의 src 속성은 OP로부터 얻은 세션 관리 엔드포인트 URL로 설정됩니다. startChecking() 함수는 60초마다 자동으로 호출되어 사용자의 로그인 상태를 확인합니다. 이 페이지에는 postMessage를 수신할 때 receiveMessage() 함수를 호출하는 message 이벤트 리스너가 있습니다. 이 함수는 postMessage가 OP에 대해 예상되는 도메인에서 왔는지 확인하고 리턴된 메시지의 값을 검사하여 사용자의 로그인 상태가 changed인지 아니면 unchanged인지 확인합니다.
<!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>