분류 php

싱글 사인온 (SSO) 미확인 : JWT를 사용하여 사용자 정의 SSO 설정

컨텐츠 정보

  • 조회 134 (작성일 )

본문

이전 프로젝트에서는 두 개의 기존 응용 프로그램과 독립 응용 프로그램간에 싱글 사인온 (SSO)을 설정해야 했습니다. 내가 진행한 방법을 설명하는 이 기사는 이를 이해하고 Symfony로 설정하는 것을 목표로 합니다.


https://blog.theodo.com/2019/07/single-sign-on/ 


싱글 사인온 (SSO)이란 무엇입니까? 


SSO (Single Sign-On)는 사용자가 인증 서버 (ID 공급자)에 한 번 로그인하여 여러 응용 프로그램 (서비스 공급자)에 액세스 할 수 있도록 하는 프로세스입니다.

Intro-2.png 


많은 응용 프로그램은 이 인증 시스템을 사용하여 사용자가 Google 또는 Facebook과 같은 다른 응용 프로그램 계정을 통해 로그인하여 세션을 계속 열어 두도록 합니다. 예를 들어 WordPress의 인증 서버 또는 Google 계정으로 SSO를 통해 WordPress에 로그인 할 수 있습니다.


Wordpress-1.png 


Google 자체는 사용자가 SSO를 사용하여 고유한 중앙 인증 서버인 Google 계정 – 자격 증명 공급자 덕분에 서비스 제공 업체 : Gmail, Youtube 등 여러 응용 프로그램에 SSO로 로그인 할 수 있습니다.


SSO Flow 


Gmail과 같은 서비스 제공 업체에서 SSO를 통해 인증을 받으려면 비밀번호 기반 인증을 제공하는 ID 제공 업체 (Google 계정)에 로그인 해야 합니다. 이를 염두에 두고 사용자 여정은 다음과 같습니다.

sso_flow-2.png 


  1. 사용자는 SSO를 사용하는 서비스 제공 업체 (www.service-provider-1.com)를 탐색합니다.
  2. www.service-provider-1.com은 기본 인증 서버 (www.identity-provider.com)로 리디렉션합니다.

    주의 : SSO 프로세스는 www.service-provider-1.com을 탐색 할 때 리디렉션을 통해 자동으로 실행하거나“Google에서 계속”과 같은 버튼을 클릭하여 수동으로 실행할 수 있습니다.

  3. www.identity-provider.com에 열린 세션이 없습니다 : 사용자가 아직 자격 증명을 입력하지 않았습니다.
  4. 따라서 www.identity-provider.com의 로그인 페이지가 사용자에게 프롬프트됩니다.
  5. 사용자는 www.identity-provider.com의 로그인 페이지에서 자격 증명을 입력합니다.
  6. www.identity-provider.com은 사용자를 인증합니다.
  7. 서명 된 토큰을 사용하여 www.service-provider-1.com으로 리디렉션 합니다.
  8. www.service-provider-1.com은 토큰을 해독하고 사용자를 인증합니다.
  9. www.service-provider-1.com은 사용자의 홈페이지를 표시합니다.

    주의 : 사용자는 자신의 서비스 제공 업체 -1 자격 증명을 입력하지 않아도 됩니다. 그는 자신의 자격 증명 공급자 자격 증명을 입력하여 SSO를 사용하여 다른 서비스 공급자에 액세스 할 수 있게 합니다.

  10. 사용자는 SSO를 사용하는 다른 서비스 제공 업체 (www.service-provider-2.com)를 탐색합니다.
  11. www.service-provider-2.com은 기본 인증 서버 (www.identity-provider.com)로 리디렉션합니다.
  12. www.identity-provider.com은 이전에 사용자를 인증했지만 여전히 세션이 열려 있습니다.
  13. www.identity-provider.com은 서명 된 토큰을 사용하여 www.service-provider-2.com으로 리디렉션합니다.
  14. www.service-provider-2.com은 토큰을 해독하고 사용자를 인증합니다.
  15. www.service-provider-2.com은 사용자의 홈페이지를 표시합니다.

싱글 사인온에서는 서비스 제공자가 ID 제공자와 통신해야 합니다. 사용자 정보를 교환하는 한 가지 방법은 JWT (Json Web Tokens)를 사용하는 것입니다.


NB :이 경우 정보는 기밀이 아니어야 합니다. XSS 공격으로 토큰에 쉽게 액세스하고 디코딩 할 수 있습니다. JWT를 통해 비밀번호를 통신하지 마십시오!


JWT (JSON Web Token) 란 무엇입니까? 


이 기사에서 정확하게 설명한 바와 같이 JSON 웹 토큰 (JWT)은 다음과 같습니다.


RFC 7519에서 두 당사자 간의 정보 세트를 표시하는 안전한 방법으로 정의 된 JSON 오브젝트. 토큰은 헤더, 페이로드 및 서명으로 구성됩니다. 


SSO 컨텍스트에서 서비스 공급자는 인증 서버로부터 신뢰할 수 있는 정보를 받을 수 있습니다. 실제로, 서비스 제공자는 아이덴티티 제공자와 비밀 키를 공유함으로써 토큰의 일부를 해시하고 토큰의 서명과 비교할 수 있습니다. 결과가 서명과 일치하면 서비스 공급자는 정보가 키를 소유 한 다른 엔터티 (아이덴티티 공급자)에서 온 것임을 알고 있습니다.


sso_jwt-2.png 


NB : 우리가 "정보"라고 부르는 것은 실제로 두 부분으로 구성됩니다 : 헤더와 페이 로드는 처음에 별도로 인코딩됩니다.


NB : openssl 키 생성기로 RSA 키 페어를 생성하는 방법에 대한 자세한 정보는 여기를 참조하십시오.


내 사용 사례 : 자체 사용자 데이터베이스를 사용하여 2 개의 기존 웹 사이트와 독립 웹 사이트간에 사용자 지정 SSO를 만듭니다. 


이 부분에서는 프로젝트에서 사용자 지정 SSO 인증을 설정하기 위해 선택한 방법에 중점을 둡니다. 왜 관습입니까? 코드 레거시를 처리하고 클라이언트의 사양을 따라야 했기 때문입니다. 예를 들어, 사용자가 서비스 공급자에서 SSO를 통해 로그인하려고 하지만 아이디 공급자에서 인증되지 않은 경우 서비스 공급자의 로그인 페이지로 리디렉션되어야합니다.


Context 


내 고객은 전 세계에 특정 제품을 판매하는 국제 회사이며 웹 사이트는 여러 국가 / 언어로 제공됩니다.


러시아 자회사는 도메인 이름이 다른 러시아어 드라이버 전용 독립 플랫폼을 개발하기 시작했습니다. 법적인 이유 때문에 러시아에서 운전사 데이터베이스를 관리해야 했기 때문에 두 응용 프로그램을 병합하는 것은 선택 사항이 아닙니다.


sso_context-2.jpg 


Specifications 


내가 고려해야 할 주요 사양은 응용 프로그램 간의 독립성에서 비롯된 것입니다. 서비스 공급자는 이미 자체 사용자 데이터베이스에 대한 암호 기반 인증 시스템을 가지고 있었습니다.


sso_specs-2.png 


주의 :이 마지막 사양은 일반적이지 않습니다. 일반적으로 자격 증명 공급자에서 로그 아웃 한 사용자는 관련 서비스 공급자에서 로그 아웃됩니다. 

이는 우리의 맥락에서 서비스 제공 업체가 사용자의 비밀번호가 identity-provider.com의 비밀번호와 다를 수 있는 자체 인증 시스템을 이미 가지고 있다는 사실을 강조합니다 (이메일 주소는 두 애플리케이션에서 동일해야 함).


Solution 


시간이 많이 걸리고 사용자 지정이 가능한 이유 때문에 사용자 지정 인증 시스템을 구현하는 데 도움이되는 Symfony 구성 요소 인 Guard를 사용하여 Symfony에서 SSO 인증을 설정하기로 결정했습니다. 간단히 말해서 Guard는 모든 요청에 ​​대해 호출되는 'supports'메소드의 결과에 따라 일부 코드를 실행합니다. 예를 들어 : 현재 요청에 토큰이 있습니까? 아니오 –> 초기 요청을 계속하십시오. 예 –> 토큰을 해독하십시오.


우리의 맥락에서 사용자는 SSO를 통해 또는 서비스 공급자에 자신의 자격 증명을 입력하여 로그인을 선택합니다. 따라서 사용자 여정은 사용자가 자동으로 자격 증명 공급자로 리디렉션 되는 Google과 같은 다른 서비스를 제공하는 회사와 관련이 있는 소개와 약간 다릅니다.


두 응용 프로그램 모두에 계정이 있는 사용자에게 서비스 공급자에서 싱글 사인온이 성공하려면 먼저 ID 공급자에 로그인해야 합니다. 그렇지 않으면 오류 메시지가 나타납니다.

sso_flow_1-2.png 


NB : SSO 인증 실패시 오류 메시지 구현에 대해서는 아래에서 더 이상 설명하지 않습니다.


그런 다음 사용자는 자격 증명 공급자에 로그인하기로 결정합니다.


sso_flow_2-2.jpg 


… 그리고 SSO 버튼을 클릭하여 서비스 제공 업체에 로그인하십시오.


sso_flow_3-2.png