>  기사  >  백엔드 개발  >  PHP에서 SSO Single Sign-On을 구현하는 방법에 대한 심층 분석

PHP에서 SSO Single Sign-On을 구현하는 방법에 대한 심층 분석

青灯夜游
青灯夜游앞으로
2021-07-09 19:15:344716검색

SSO는 여러 응용 프로그램 시스템에 있습니다. 사용자는 한 번만 로그인하면 상호 신뢰되는 모든 응용 프로그램 시스템에 액세스할 수 있습니다. 그렇다면 PHP에서 SSO Single Sign-On을 구현하는 방법은 무엇입니까? 다음 문서에서는 Single Sign-On SSO 구현에 대해 자세히 소개합니다.

PHP에서 SSO Single Sign-On을 구현하는 방법에 대한 심층 분석

SSO(Single Sign On), 즉 Single Sign-On은 서로 관련되어 있지만 독립적인 여러 시스템을 제어하는 ​​일종의 접근 권한입니다. 이 권한을 가진 사용자는 하나의 ID와 비밀번호를 사용하여 특정 시스템에 접근할 수 있습니다. 서로 다른 사용자 이름이나 비밀번호를 사용하지 않도록 하기 위한 다중 시스템 또는 각 시스템에 원활하게 로그인하기 위한 구성.

대규모 시스템의 경우 Single Sign-On을 사용하면 사용자의 많은 문제를 줄일 수 있습니다. Baidu를 예로 들면 Baidu Experience, Baidu Knows, Baidu Library 등 많은 하위 시스템이 있습니다. 이러한 시스템을 사용하는 경우 각 시스템에서 로그인하려면 사용자 이름과 비밀번호를 입력해야 합니다. 경험치가 확실히 떨어지겠죠.

SSO와 상호작용하는 두 가지 요소: 1. 사용자, 2. 시스템, 특성은 다음과 같습니다. 한 번의 로그인, 모든 액세스. SSO는 사용자의 로그인 가능 여부, 즉 사용자의 신원을 확인하는 일종의 접근통제이며, 그 외 모든 시스템 인증은 여기서 이루어진다. SSO를 전체 시스템 수준에서 보면 그 핵심은 다음 3가지이다. . 사용자, 2. 시스템, 3. 인증 센터.

PHP에서 SSO Single Sign-On을 구현하는 방법에 대한 심층 분석

1. 동일한 도메인이지만 다른 하위 도메인에 대해 Single Sign-On을 수행하는 방법

우리 사이트가 다음 도메인 이름에 따라 배포되었다고 가정합니다:

  • sub1.onmpw.com
  • sub2.onmpw .com

이 두 사이트는 mpw.com에서 동일한 도메인을 공유합니다.

기본적으로 브라우저는 쿠키가 속한 도메인에 해당하는 호스트로 쿠키를 보냅니다. 즉, sub1.onmpw.com의 쿠키에 대한 기본 도메인은 .sub1.onmpw.com입니다. 따라서 sub2.onmpw.com은 sub1.onmpw.com에 속한 쿠키 정보를 가져오지 않습니다. 서로 다른 호스트에 있고 하위 도메인도 다르기 때문입니다.

1.1 동일한 도메인에 있는 두 쿠키 정보 설정

  • sub1.onmpw.com 시스템에 로그인
  • 로그인에 성공하면 고유 식별자 토큰이 생성됩니다(토큰을 알면 어느 것이 무엇인지 알 수 있습니다). 사용자가 로그인되어 있습니다). 쿠키 정보 설정 여기서 주의할 점은 토큰은 쿠키에 저장되지만, 설정 시에는 이 쿠키가 속한 도메인을 최상위 도메인인 .onmpw.com으로 설정해야 합니다. 여기에서 setcookie 함수를 사용할 수 있습니다. 이 함수의 네 번째 매개변수는 쿠키의 도메인을 설정하는 데 사용됩니다.
setcookie(‘token’, ’xxx’, '/', ’.onmpw.com’);复制代码
  • sub2.onmpw.com 시스템에 액세스하면 브라우저가 요청과 함께 쿠키에 포함된 정보 토큰을 sub2.onmpw.com 시스템으로 보냅니다. 이때 시스템은 먼저 세션이 로그인되어 있는지 확인합니다. 로그인되어 있지 않은 경우 쿠키의 토큰을 확인하여 자동 로그인을 수행합니다.

  • sub2.onmpw.com 로그인 성공 후 세션 정보를 작성합니다. 향후 확인을 위해 자신의 세션 정보를 사용하여 확인하세요.

1.2 로그아웃

여기서 문제는 sub1 시스템이 로그아웃한 후 자체 세션 정보와 도메인 .onmpw.com의 쿠키 정보를 지울 수 있다는 것입니다. sub2 시스템의 세션 정보는 삭제되지 않습니다. 해당 sub2는 아직 로그인되어 있습니다. 즉, 이 방법은 싱글 사인온을 달성할 수 있지만 동시 로그아웃을 달성할 수는 없습니다. 그 이유는 sub1과 sub2가 setcookie 함수의 설정을 통해 쿠키를 공유할 수는 있지만 sessionId가 다르고 이 sessionId도 브라우저에 쿠키 형태로 저장되지만 그것이 속한 도메인이 .onmpw가 아니기 때문입니다. .

이 문제를 해결하는 방법은 무엇입니까? 이 경우 두 시스템의 sessionId가 동일하면 이 문제가 해결될 수 있다는 것을 알고 있습니다. 즉, sessionId가 저장되어 있는 쿠키가 속한 도메인도 .onmpw.com입니다. PHP에서는 session_start()가 호출된 후에 sessionId가 생성됩니다. sub1과 sub2가 동일한 sessionId를 가지도록 하려면 session_start() 전에 sessionId가 속한 도메인을 설정해야 합니다.

ini_set('session.cookie_path', '/');
ini_set('session.cookie_domain', '.onmpw.com');
ini_set('session.cookie_lifetime', '0');复制代码
  • 1 위 단계를 통해 서로 다른 싱글 사인온 및 로그아웃을 달성할 수 있습니다. 두 번째 수준 도메인 이름.
  • 2. 그러나 sessionId가 동일하면 다른 2차 도메인 이름에 대한 싱글 로그인 및 로그아웃이 가능해집니다.
  • 참고 기사: https://www.onmpw.com/tm/xwzj/network_145.html

2. 서로 다른 도메인 간 Single Sign-On 구현 방법 - CAS

다음 사이트

  • www.onmpw1.com
  • www.onmpw2.com
  • www.onmpw3.com

간에 싱글 사인온을 달성하려면 위의 해결 방법은 작동하지 않습니다.

현재 github에는 오픈 소스 SSO 솔루션이 있습니다. 구현 원칙은 주류 SSO와 유사합니다: https://github.com/jasny/sso

핵심 원칙:

  • 1. 클라이언트는 서로 다른 하위 시스템에 액세스하며, 해당 하위 시스템에 해당하는 SSO 사용자 서비스 센터는 동일한 SessionId를 사용합니다.
  • 2. 하위 시스템 브로커와 서버는 연결을 통해 인증 링크에 바인딩됩니다.

동일한 루트 도메인 이름은 도메인 루트 도메인 이름을 지정하지 않으며 매번 인증 서비스로 이동해야 합니다. 하지만 도메인이 지정되어 있으면 동일한 루트 도메인 이름 중 하나가 성공적으로 인증되면 해당 쿠키를 모두 공유할 수 있으며 다음에 다시 인증할 필요가 없으며 사용자 정보를 직접 요청할 수 있습니다.

첫 번째 방문 A:

PHP에서 SSO Single Sign-On을 구현하는 방법에 대한 심층 분석

두 번째 방문 B:

PHP에서 SSO Single Sign-On을 구현하는 방법에 대한 심층 분석

2.1 로그인 상태 판단

사용자가 인증센터에 로그인한 후 사용자와 사용자 사이에 설정이 이루어집니다. 인증 센터 세션이 시작되면 이 세션을 글로벌 세션이라고 부릅니다. 사용자가 이후에 시스템 애플리케이션에 액세스하면 모든 애플리케이션 요청에 로그인할지 여부를 결정하기 위해 인증 센터에 갈 수 없습니다. 이는 매우 비효율적이며 단일 웹 애플리케이션에서 고려할 필요가 없습니다.

시스템 애플리케이션과 사용자 브라우저 사이에 로컬 세션을 설정할 수 있습니다. 로컬 세션은 클라이언트와 시스템 애플리케이션의 로그인 상태를 유지하며 글로벌 세션은 사라집니다. 로컬 세션이 사라져야 합니다.

사용자가 애플리케이션에 접속하면 먼저 로컬 세션이 존재하는지 확인합니다. 존재하면 로그인된 것으로 간주되며 확인을 위해 인증 센터에 갈 필요가 없습니다. 존재하지 않는 경우 글로벌 세션이 존재하는지 확인하기 위해 인증 센터로 리디렉션됩니다. 존재하는 경우 애플리케이션에 알리고 다음 번에 애플리케이션과 클라이언트 사이에 로컬 세션이 설정됩니다. 신청서를 요청해도 인증센터로 이동하지 않습니다.

2.2 종료

사용자가 한 시스템을 종료하고 다른 하위 시스템에 액세스하는 경우 해당 시스템도 종료 상태여야 합니다. 이를 위해 애플리케이션은 로컬 부분 세션을 종료하는 것 외에도 사용자가 종료했음을 인증 센터에 알려야 합니다.

인증센터에서 종료 알림을 받으면 글로벌 세션을 종료할 수 있습니다. 사용자가 다른 애플리케이션에 접속하면 로그아웃 상태가 표시됩니다.

로컬 세션을 구축한 모든 하위 시스템에 즉시 알리고 해당 로컬 세션을 파기해야 하는지 여부는 실제 프로젝트에 따라 결정될 수 있습니다.

추천 학습: "PHP 비디오 튜토리얼"

위 내용은 PHP에서 SSO Single Sign-On을 구현하는 방법에 대한 심층 분석의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
이 기사는 juejin.cn에서 복제됩니다. 침해가 있는 경우 admin@php.cn으로 문의하시기 바랍니다. 삭제