SSO란 무엇인가! 이해해봅시다


서론

안녕하세요. 이번 포스팅에서는 Web에서의 인증 방식의 하나인 SSO(Single Sign On)가 무엇인지, 어떤 불편함을 해소 하기 위한 기술인지 설명드리려고 합니다. 세세하고 딱딱한 기술적인 사항을 설명 드리기 보다는, 시간내서 포스팅 읽으시는 분들이 정말로 SSO가 무엇인지 이해하고, 머리속에 큰 그림을 그릴 수 있도록 돕고 싶어요.


SSO가 왜 필요한가

SSO가 없을 때의 상황을 먼저 머리속에 그려볼게요.

우선 카카오톡, 페이스북, 넷플릭스 라는 세 가지 서비스를 생각해볼까요. 세 개의 서비스는 각자의 방식으로 로그인을 요구합니다. 아래 사진 처럼요. 카카오톡을 쓰려면 카카오톡 아이디로 로그인을 해야하고, 넷플릭스를 쓰려면 넷플릭스 계정으로 로그인을 해야 해요. 또, 세 어플리케이션이 로그인을 처리하는 방식, 사용자 정보를 저장하는 방식 또한 각자 다를거에요.

without-sso-1

그런데! 만약 세 어플리케이션이 독립적으로 작동하기는 하지만 서로 연관된 무언가 가 있다고 상상해보세요. 예를들어 모두 같은 회사에서 제공하는 서비스라면? 만약 지메일, 구글 드라이브, 구글 행아웃에 대해 각자 다른 아이디로 로그인을 해야 한다면? 사용하려고 생각해봐도, 만드려고 상상만 해봐도 몸서리치게 불편하네요..

without-sso-2

  • 사용자 입장에서는 <아이디-비밀번호> 세 쌍을 기억해야 하죠.
  • 서비스를 만드는 입장에서는 로그인 화면 세 개, 데이터 베이스 세 개, 로그인 프로세스 세 개를 각자 구현 해야 합니다. 서비스끼리 데이터 싱크라도 구현 하려고 하면..;;

맞아요. 이렇게 되면 양쪽에게 다 불편하게 된 상황입니다.

SSO란 무엇인가

위에 기술한 것과 같은 불편을 해소할 수 있는 인증 방식이 SSO이고, Single Sign On의 약자입니다. 여러 서비스를 '로그인 한 번' 으로 이용하도록 하는 기술이에요. 각 어플리케이션에서 로그인/인증 부분만 떼어서 한 군데로 모아두는 방식입니다. 대략적인 그림을 일단 구경해주세요.

sso

SP는 Service Provider의 약자입니다. 제가 위에서 얘기해온 '서비스', '어플리케이션'을 SSO 용어로는 SP라고 부릅니다. '전체 인증 흐름에서 무슨 역할을 담당하는 요소인가'의 관점에서 provider라는 단어가 따라붙은게 아닐까 생각합니다. 가운데에 IdP가 새로 생겼어요. IdP는 Identity Provider의 약자로, 각 SP들의 인증 관련 부분만 모아서 구현 해 놓은 것이라고 생각하시면 됩니다. '구현 해 놓은 것'이라고 적었지만 IdP 자체도 하나의 웹 서비스죠.

SSO는 어떻게 동작하는가

이제 준비운동이 끝났습니다. 제 생각엔 이제 나오는 부분을 읽으셔야 비로소, SSO가 이런 거구나, 하고 감이 오실 것 같아요. SSO가 어떤 흐름으로 동작하는지 예시를 드리겠습니다. 물론 실제 구글에서의 로그인 처리 방식과는 상관 없는, 제 상상 속의 시나리오 입니다.

먼저 구글 드라이브를 사용하는 시나리오를 생각 해 볼게요.

  1. 사용자가 SP(구글 드라이브)를 사용하려 합니다.
  2. 사용자의 세션 정보가 SP에 남아있지 않아서, SP는 사용자를 IdP(구글 통합 로그인 페이지)로 redirect 시킵니다
  3. 사용자의 세션 정보가 IdP에 남아있지 않아서, 사용자는 IdP에서 로그인(또는 어떤 방식으로든 '인증') 합니다.
  4. 인증이 완료되면, IdP는 사용자를 SP로 다시 redirect 시키며, 동시에 사용자의 '인증 정보'를 SP에게 전달합니다.
  5. 로그인 처리가 완료 되어 구글 드라이브를 사용할 수 있습니다.

그리고 이 직후에, 지메일을 사용하면 사용자 흐름은 아래와 같을 거에요.

  1. 사용자가 SP(지메일)을 사용하려 합니다.
  2. 사용자의 세션 정보가 SP에 남아있지 않아서, SP는 사용자를 IdP로 redirect 시킵니다.
  3. 사용자의 세션 정보가 IdP에 남아있습니다! 그러면 IdP는 사용자를 SP로 다시 redirect 시키며, 동시에 사용자의 '인증 정보'를 SP에게 전달합니다.
  4. 로그인 처리가 완료 되어 지메일을 사용할 수 있습니다.

SSO를 어떻게 구현할까

SSO 시스템을 구현할 때의 가장 중요한 포인트는, 제 생각에, IdP에서 SP로 사용자 인증 정보 전달을 처리할 때 의 보안 입니다. 이 부분은 여러 표준, 프레임워크 등에 의해 구현할 수 있는데요, 그 중에 대표적으로 SAML, OAuth, JWT등이 있습니다. 이 부분에 대해서는 따로 포스팅을 할 계획입니다.

References


도무지 저를 시원하게 이해시키는 한글 포스팅을 찾을 수가 없어서, 제가 원하는 대로 직접 쓰게 되었습니다. 하지만 영어 자료는 정말 많아요. 구글 검색 바 하단에 설정 > 언어(Languages)를 꼭꼭 English로 해놓고 영어 검색하시면 더더더 잘나옵니다.

어려운 주제라서 잘못된 부분이 있을까봐, 다 써놓고 걱정되네요. 혹시나 발견하시면 꼭꼭 댓글 남겨주세요.

긴 글 읽어주셔서 감사해요.