서비스 제공업체 비활성에 따른 SAML 2.0 싱글 로그아웃 모범 사례

SAML

세션 시간 초과 후 SAML 2.0 단일 로그아웃 이해

SAML 2.0 SSO(Single Sign-On) 시스템을 사용하면 사용자가 단일 자격 증명 세트를 사용하여 다양한 애플리케이션에 로그인할 수 있으므로 사용자 인증이 상당히 단순화되었습니다. 그러나 SLO(싱글 로그아웃) 개념에는 특히 사용자가 로그인하지 않았기 때문에 서비스 공급자(SP)에서 사용자 세션이 만료될 때 발생하는 문제와 관련하여 심각한 문제가 있습니다. (IDP) 세션도 종료되나요?

SP와 IDP 간의 세션 관리는 SAML 2.0의 맥락에서 안전하고 효율적인 액세스를 보장하는 데 필수적입니다. 사용자가 계속 IDP에 연결되어 있어야 하는 경우 SP 세션이 언제 종료되는지 항상 명확하지는 않습니다. 이는 동일한 IDP에 연결된 다른 앱에 영향을 미칠 수 있습니다. 이는 보안뿐만 아니라 유용성에 대한 의문을 제기합니다.

많은 기업, 특히 Microsoft Entra와 같은 인터페이스를 사용하는 기업에서는 이러한 세션 시간 초과를 처리하기 위한 명확한 모범 사례를 확립해야 합니다. SP의 세션을 단순히 SP 수준에서 중지하는 것이 더 좋습니까, 아니면 사용자를 IDP 계정에서 로그아웃시키는 SLO를 발생시켜야 합니까?

세션 시간 초과를 처리하고 보안과 유용성을 모두 보장하는 가장 효율적인 기술을 설명하기 위해 실제 사례를 사용하여 이 문서에서는 이러한 상황에서 SAML 2.0 SLO 이벤트를 처리하기 위한 표준 사례와 표준을 검토합니다.

명령 사용예
session() Express 애플리케이션에서 사용자 세션을 제어하는 ​​데 사용됩니다. 이 예에서는 필요할 때 로그아웃 논리가 트리거될 수 있도록 사용자 활동 및 세션 시간 초과를 모니터링하는 데 도움이 됩니다.
maxAge 세션 쿠키가 유효한 기간을 지정합니다. 이 경우 타이머는 600000밀리초 또는 10분 후에 만료되도록 설정되고 로그아웃 이벤트가 시작됩니다.
create_logout_request_url() 서비스 공급자 세션이 종료되면 이 SAML2 라이브러리 메서드로 생성된 SLO(싱글 로그아웃) 요청 URL이 IDP(ID 공급자)로 전달됩니다.
readFileSync() SAML2 서비스 공급자를 설정하는 데 필요한 키 파일과 인증서를 동기식으로 읽습니다. 서비스 공급자와 아이덴티티 공급자가 안전하게 통신하려면 이러한 인증이 필요합니다.
assert_endpoint 인증이 성공한 후 아이덴티티 공급자가 SAML 어설션을 전송하는 데 사용할 URL을 나타냅니다. 이를 통해 서비스 제공자 수준의 사용자 인증이 보장됩니다.
window.onload 이 이벤트는 프런트엔드에서 세션 비활성 타이머를 재설정하는 데 사용됩니다. 사용자가 처음으로 프로그램을 로드하면 타이머가 다시 시작됩니다.
onmousemove 세션 타이머를 재설정하기 위해 이 이벤트 리스너는 마우스 움직임을 감지합니다. 이는 사용자 행동을 감시하고 우발적인 세션 시간 초과를 방지하는 데 필수적입니다.
fetch() 세션 시간 초과 후 SLO 요청을 서버에 비동기식으로 보내는 데 사용됩니다. 아이덴티티 공급자와 연결하고 사용자를 IDP에서 로그아웃하기 위해 백엔드 로직을 설정합니다.
setTimeout() 프런트엔드 코드의 이 함수는 미리 정의된 비활성 기간 이후 세션 시간 초과 이벤트가 발생하도록 합니다. 사용자 행동을 감시하고 보안 규정을 구현하는 데 필수적입니다.

SAML 2.0 세션 시간 초과 처리로 단일 로그아웃 최적화

사용 SLO(싱글 로그아웃)를 처리하기 위한 백엔드 스크립트인 Express 및 Express는 사용자 세션 만료를 추적하고 SP(서비스 공급자) 및 IDP(ID 공급자) 수준에서 로그아웃 시퀀스를 시작하는 기능에 중점을 둡니다. Express 세션 관리는 이러한 추론의 핵심입니다. 미리 결정된 비활성 시간(이 예에서는 10분) 후에 세션이 종료되도록 설정하여 트리거 포인트를 설정합니다. 세션이 종료되면 스크립트는 `create_logout_request_url()} 메서드를 사용하여 SAML 2.0 로그아웃 요청을 시작한 다음 IDP에 연결합니다(이 경우 ) 사용자 세션을 완전히 종료합니다. 이는 사용자가 시스템에서 완전히 로그아웃했음을 보장하여 보안을 강화합니다.

우리는 로드한다 SP(MyApp)와 IDP(Microsoft Entra) 간의 보안 통신을 활성화하기 위해 `readFileSync()} 명령을 사용하여 애플리케이션에 키를 입력합니다. 로그아웃 요청을 인증함으로써 이러한 인증서는 불법 로그아웃을 방지하고 통신이 암호화되고 확인된 상태로 유지되도록 보장합니다. 로그아웃 요청 URL이 생성된 후 사용자는 로그아웃 요청 URL로 전송되며, 여기서 IDP는 로그아웃을 처리하고 필요한 경우 연결된 애플리케이션에서 사용자 세션을 종료합니다. 다중 응용 프로그램 SSO(Single Sign-On) 설치의 보안과 무결성을 유지하려면 이러한 양방향 통신이 필요합니다.

JavaScript 스크립트는 프런트 엔드에서 사용자 활동을 실시간으로 추적하는 데 필수적입니다. 사용자가 프로그램과 상호 작용할 때마다 'onmousemove} 및 'onkeypress'와 같은 이벤트 리스너를 사용하여 세션 시간 초과를 재설정합니다. 'setTimeout()'으로 설정된 타이머는 사용자에게 경고를 보내고 사용자가 유휴 상태가 되면 자동으로 SP(MyApp)에서 로그아웃됩니다. 로그아웃 후에는 `fetch()`를 사용하여 백엔드에 SLO 요청을 보내는 프런트엔드 스크립트에 의해 이전에 다룬 SAML 2.0 로그아웃 프로세스가 시작됩니다. 이 기술을 사용하면 SP 수준의 비활성 문제를 신속하고 안전하게 문제 없이 처리할 수 있습니다.

SAML 2.0 통합 및 결합되어 사용자 경험이 원활해지고 보안 표준이 유지됩니다. 사용자가 비활성 상태에서 허용된 것보다 오랫동안 인증 상태를 유지하는 것을 방지하기 위해 세션 시간 초과는 로컬 SP 로그아웃과 IDP 로그아웃을 모두 시작합니다. SAML 2.0에서는 세션 시간 초과와 관련하여 특별한 조치를 요구하지 않지만 일반적으로 세션 만료를 사용하여 SLO를 시작하는 것이 모범 사례로 받아들여집니다. 유휴 세션을 종료함으로써 다양한 SSO 연결 플랫폼에서 동기화된 로그아웃을 활성화하여 보안과 사용자 경험 사이의 균형을 유지합니다.

Node.js 및 Express를 사용하여 세션 시간 초과로 SAML 2.0 단일 로그아웃 처리

Node.js 및 Express를 활용하여 서비스 제공업체 세션 시간 초과로 SAML 2.0 SLO를 관리하는 백엔드 방법입니다. 이 솔루션은 SAML 요청을 사용하여 세션이 만료되었는지 확인하고 아이덴티티 공급자 수준에서 SLO를 시작합니다.

// Required modules for Node.js and SAML SSO
const express = require('express');
const session = require('express-session');
const saml2 = require('saml2-js');
const app = express();

// Service Provider (SP) setup
const sp = new saml2.ServiceProvider({
  entity_id: "http://myapp.com/metadata.xml",
  private_key: fs.readFileSync("./cert/sp-private-key.pem").toString(),
  certificate: fs.readFileSync("./cert/sp-certificate.pem").toString(),
  assert_endpoint: "http://myapp.com/assert"
});

// Identity Provider (IDP) setup
const idp = new saml2.IdentityProvider({
  sso_login_url: "https://login.microsoftonline.com/sso",
  sso_logout_url: "https://login.microsoftonline.com/logout",
  certificates: fs.readFileSync("./cert/idp-certificate.pem").toString()
});

// Session management
app.use(session({
  secret: 'mySecretKey',
  resave: false,
  saveUninitialized: true,
  cookie: { maxAge: 600000 } // Set session expiration time
}));

// Middleware to handle session timeout and SLO
app.use((req, res, next) => {
  if (req.session.expires && Date.now() > req.session.expires) {
    sp.create_logout_request_url(idp, {}, (err, logout_url) => {
      if (err) return res.status(500).send("Logout error");
      return res.redirect(logout_url); // Trigger SLO
    });
  } else {
    next(); // Continue if session is valid
  }
});

app.listen(3000, () => {
  console.log("Server running on port 3000");
});

JavaScript 프런트엔드 및 유휴 시간 초과 감지를 사용하여 SAML 2.0 SLO 처리

프런트엔드 방법에서는 바닐라 JavaScript를 활용하여 사용자 비활성을 모니터링하고 SLO(싱글 로그아웃)를 시작함으로써 세션 시간 초과를 감지합니다. 이는 서비스 공급자에게 아이덴티티 공급자에게 SLO 요청을 보내도록 지시합니다.

// Define variables for session timeout
let timeoutDuration = 600000; // 10 minutes
let timeoutTimer;

// Reset the timer on any user interaction
function resetTimer() {
  clearTimeout(timeoutTimer);
  timeoutTimer = setTimeout(triggerLogout, timeoutDuration);
}

// Trigger logout function
function triggerLogout() {
  alert("Session expired due to inactivity.");
  window.location.href = "/logout"; // Redirect to SP logout
}

// Monitor user actions
window.onload = resetTimer;
document.onmousemove = resetTimer;
document.onkeypress = resetTimer;

// SLO event triggered after logout
function sendSLORequest() {
  fetch('/api/slo', { method: 'POST' })
    .then(response => {
      if (response.ok) {
        console.log("SLO request sent to IDP");
      }
    })
    .catch(err => console.error("SLO request failed", err));
}

SAML 2.0 살펴보기: 단일 로그아웃 및 비활성 시간 초과

SAML 2.0 싱글 로그아웃(SLO) 주소 지정 방법 서비스 공급자(SP) 수준에서는 관리해야 할 중요한 구성 요소입니다. SP에서 수동으로 로그아웃하면 ID 공급자(IDP) 로그아웃도 발생해야 하지만 비활성으로 인해 세션 시간 초과가 발생하면 문제가 복잡해집니다. SAML 2.0 표준은 세션 만료 시 SLO를 처리하는 방법을 명확하게 명시하지 않습니다. 그러나 이를 통해 사용자 경험과 보안을 향상할 수 있는 모범 사례를 채택할 수 있습니다.

예를 들어, 활동이 없어 SP에서 종료된 후에도 IDP(Microsoft Entra)를 통해 MyApp 등의 애플리케이션에 로그인한 사용자는 IDP에 로그인 상태를 유지하는 경우가 많습니다. 동일한 SSO를 사용하는 다른 앱이 계속 실행되는 동안 사용자가 완전히 로그아웃했다고 생각하는 경우 . IDP 수준에서 SP 시간 초과 이벤트를 모방하고 동기화된 로그아웃을 보장하도록 SAML 세션 관리를 설정하는 것은 이러한 위험을 줄이는 한 가지 방법입니다.

프론트엔드 코드의 유휴 감지 기술 구현은 또 다른 요소입니다. 개발자는 사용자 활동에 대한 이벤트 리스너를 사용하여 세션이 만료되기 전에 비활성 시간을 예측하고 사용자에게 경고할 수 있습니다. 이를 사용하여 사용자는 자신의 세션을 계속 제어하고 지속적으로 실행되지 않습니다. SSO 통합 환경에서 개발자는 이러한 요소 간의 균형을 유지하여 보안과 사용자 편의성을 유지할 수 있습니다.

  1. 세션 시간이 초과되면 서비스 제공업체 수준에서 어떤 일이 발생합니까?
  2. 일반적으로 SP 수준에서 세션 시간이 초과되면 사용자는 프로그램에서 로그아웃됩니다. 그러나 SAML 2.0 사양에서는 이로 인해 IDP에서 SLO가 발생하도록 요구하지 않으므로 시스템 설정 방법에 따라 다릅니다.
  3. 서비스 공급자 세션 시간 초과로 인해 아이덴티티 공급자의 SLO가 트리거되어야 합니까?
  4. 조직의 정책이 이에 적용됩니다. SAML 2.0에서는 이를 의무화하지 않지만 보안상의 이유로 SP 세션이 종료되면 IDP에서 SLO를 설정하는 경우가 많습니다.
  5. 비활성 세션이 종료되면 SLO가 발생하도록 하려면 어떻게 해야 합니까?
  6. 세션 만료는 백엔드 메커니즘을 통해 감지될 수 있습니다. IDP에 SLO 요청을 하는 절차입니다.
  7. 프런트엔드에서 세션 비활성은 어떻게 감지됩니까?
  8. 다음과 같은 이벤트 리스너 그리고 일반적으로 사용자가 애플리케이션과 상호 작용할 때마다 타이머를 재설정하므로 비활성을 추적하는 데 사용됩니다.
  9. SP에서 로그아웃한 후 IDP 세션을 열어도 안전합니까?
  10. 특히 사용자가 완전히 체크아웃했다고 생각하는 경우 IDP 세션을 열어두면 보안 위험이 발생할 수 있습니다. SP 세션 만료를 복제하도록 SLO를 설정하는 것이 좋습니다.

SSO 시스템에서 보안을 유지하려면 아이덴티티 공급자와 서비스 공급자가 로그아웃 프로세스를 동기화하는지 확인해야 합니다. SAML 2.0에서는 세션 시간 초과 처리 방법을 규정하지 않지만 많은 기업에서는 통일된 방식으로 단일 로그아웃을 처리합니다.

보안을 강화하려면 활동이 없어 서비스 공급자 세션이 종료될 때마다 SLO 요청을 보내는 것이 좋습니다. 이렇게 하면 사용자가 ID 공급자와 애플리케이션에서 로그아웃되어 많은 플랫폼에서 원치 않는 액세스를 방지할 수 있습니다.

  1. SAML 2.0 및 싱글 로그아웃 표준 및 지침에 대한 자세한 문서는 공식에서 찾을 수 있습니다. OASIS SAML 2.0 핵심 사양 .
  2. Microsoft Entra와 SSO 및 SLO와의 통합에 대한 자세한 내용은 공식 Microsoft 설명서를 참조하세요. Azure Active Directory 및 SAML .
  3. 세션 관리 기술과 함께 예제에 사용된 Node.js SAML 라이브러리는 다음에서 자세히 알아볼 수 있습니다. SAML2-js 라이브러리 문서 .
  4. Single Sign-On 및 세션 관리 구성에 대한 모범 사례를 이해하려면 다음 문서를 참조하세요. SSO 모범 사례 작성자: Auth0