암호화 프로토콜과 SSO를 구현하기 위한 표준 모델들에 대해 공부하여 정리해보려 한다.
무인 주정차 단속프로젝트에서 Admin 페이지를 위해 SpringSecurity를 활용한 인증/인가체계를 구현했었다. SP와 IdP 서버를 따로 분리하지 않고, Spring 서버(SP)가 IdP의 역활도 담당했다.
이후 MSA에 대해 공부하며 Spring Cloud를 통해 IdP용 인증 서버와 SP를 분리했었는데 이게 SSO랑 연관이 있는 것을 지금 알았따..
클라우드 컴퓨팅과 MSA같은 도메인 분산 환경에서 SSO가 아주 효율적으로 사용될 수 있다는데, 한 번 알아보자!
Sign On이란 "인증받고 들어가다" 라는 의미가 있다. 사용자는 서비스에 접근하여 내가 누구인지 인증(Authentication)과 필요한 리소스에 접근하기 위한 인가(Authorization) 과정을 거쳐야 한다.
SSO는 단일 인증이라는 뜻으로, 하나의 서비스에서 로그인(인증) 정보를 통해 다른 서비스에서도 로그인(인증)처리를 하는 것이다.
즉, 한 번 자격 증명이 검증된 사용자에게는 반복되는 로그인 없이 모든 암호 보호 리소스에 액세스하도록 하여 보안과 사용자 겨험을 모두 충족시키는 것이다.
만약, SSO가 없다면 각 서비스마다 로그인(인증) 과정을 일일히 거쳐야하는 번거로움이 있을 것 이다.
SSO가 도입된다면, 서비스마다 개별로 계정을 만드는 대신 하나의 계정으로 관련 서비스들을 모두 사용할 수 있다.
naver.com 이라는 루트 도메인에서 "mail.naver.com, shopping.naver.com, webtoon.naver.com"과 같이 서브 도메인만 변경되는 경우, 쿠키 기반의 SSO가 주로 사용된다. 아예 다른 서비스간의 SSO는 별도의 프로콜과 보안 설정 등이 필요하다.
ex)
1. 네이버 웹툰(Service Provider)에서 만화를 볼래! 서비스 접근 고고싱~
2. 네이버 도메인(IdP)에서 로그인 하고 자격 증명을 받아와,
3. 네이버(IdP) 서버에서 자격 증명을 확인받았다! (id_token: 사용자를 식별하기 위한 정보, Authorize_code: 해당 SP는 User에게 리소스 사용 허락을 인가받은 증서)
4. 네이버 웹툰(Service Provider)은 필요한 정보(ex. 사용자 정보, Naver 포인트 등..)에 접근하기 위한 Access/RefreshToken 요청
따라서, 다음과 같은 세 가지 주요 특징이 있다.
특히, 현대모터그룹(HMG)의 프로젝트에서도 이러한 SSO가 유용하게 사용되고 있다고 한다. 통합 관리 앱에 로그인을 하면 HMG의 다른 서비스인 MyHyundai, MyKia, MY GENESIS 등의 서비스를 이용하려 별도의 로그인 과정을 거칠 필요가 없다. 이 얼마나 편리한가!
이러한 SSO 인증 체계에서 인증을 통합 관리하는 IDP에 대해 알아보자.
IdP는 Id의 공급자라는 뜻으로, 사용자의 ID를 관리하는 서비스를 말한다. 아래와 같은 주요 기능을 담당한다.
IdP는 사용자의 인증 정보를 이용하여 SSO와 같은 다른 서비스의 인증 처리를 도와주며, 클라우드 컴퓨팅(분산) 환경에서 사용자 ID를 관리하는데 자주 사용된다고 한다.
다음은 IdP를 활용하는 두 가지 Model이다.
두 모델 모두 인증을 중앙화 하여 관리하는 공통적인 특징이 있지만, Delegation Model은 중앙화 관리 시스템이 인증을 대신하고 Propagation Model은 인증토큰을 발급받은 유저가 각각의 서비스에 인증을 전파한다는 차이점이 있다.
ex) 사용자가 구글 계정으로 로그인하면, 구글(IdP)이 인증을 대신 처리하고, 다른 서비스는 구글에서 발급한 인증 정보를 신뢰합니다.
ex) 사용자가 IdP에서 인증을 수행하고 발급받은 토큰(Access Token)을 각 서비스에 직접 전달하여 인증을 수행합니다.
로그인 요청:
사용자가 SP1에 접속하여 로그인을 요청한다.
IdP로 redirection:
서비스는 사용자를 IdP의 로그인 페이지로 redirect 하며 인증 요청을 IdP로 전송한다.
사용자 인증:
IdP는 사용자에게 로그인 페이지를 보여준다. 인증정보(아이디, 비밀번호)를 입력하면 IdP는 정보가 valid한지 검증한다.
IdP 토큰 생성:
인증이 성공하면, IdP는 JWT와 같은 인증 토큰을 생성한다.
IdP에서 서비스로 응답:
IdP는 생성된 토큰을 포함한 Response를 서비스로 전송. 사용자는 IdP에서 로그인을 시도했던 SP1로 redirect 된다. 이 때, IdP에는 세션이 생성된다 (서버측 세션, 클라이언트가 브라우저를 종료해도 서버에 인증정보가 남아있음).
서비스의 토큰 검증:
SP1는 IdP에서 전달받은 토큰(AccessToken)을 검증한다. SP1과 IdP가 공유한 비밀키를 사용하여 토큰의 무결성을 검증하고, 만료 여부등을 확인하는 valid 검사를 진행한다.
사용자 접근 허용:
서비스는 사용자가 요청한 리소스(API 호출 등)에 대한 접근을 허용한다.
다른 서브 도메인으로 이동시의 처리:
사용자는 동일한 SSO 서비스를 사용하는 다른 서비스에 접근할 경우, 해당 서비스는 IdP에 토큰 발급을 요청한다. 이 때, IdP는 로그인 요청한 사용자의 세션이 유효한지 검증을 통해 해당 서비스에 적합한 새 토큰을 발행한다.
이러한 과정을 통해서 단건의 로그인으로 여러 서비스를 이용할 수 있다. 이는 동일한 SSO 도메인과 IdP를 사용해야하며, 등록되지 않은 다른 서비스에서는 유효하지 않다.
또한, 헷갈릴 수 있는데 SSO와 IdP는 별개로 구분된다. SSO는 인증과정을 제공하는 ServiceProvider, IdP는 인증 처리를 담당하는 Provider로 생각하면 된다.
이러한 중앙 집중식 인증 IdP를 통해 일관된 보안 정책이 적용 가능하며, 2단계 인증 등의 다중 인증(MFA)과 같은 추가적인 보안 기능을 구현할 수 있다!
[참고문헌]
https://www.cloudflare.com/ko-kr/learning/access-management/what-is-an-identity-provider/
https://it-ist.tistory.com/251
https://developers.hyundaimotorgroup.com/blog/525
https://www.authgear.com/post/customer-sso