Programming/Web

SSO(Single Sign-On) jwt 동작 이론 살펴보기

Jan92 2022. 7. 24. 15:36

Single Sign-On

SSO란,

SSO(Single Sign-On)은 하나의 시스템(인증 서버)에서 클라이언트에 대한 인증을 수행하고, 그 인증 정보를 가지고 추가적인 인증 없이 다른 서비스들도 사용할 수 있도록 하는 기능입니다.

(통합 인증, 단일 인증, 단일 계정 로그인, 싱글 사인온 등으로 다양하게 불리고 있습니다.)

 

Single Sign-On을 사용하면 여러 서비스에 대한 로그인 처리가 간소해지기 때문에 편리하다는 장점이 있는데요.

하지만 하나의 인증 정보로 여러 서비스를 사용하기 때문에 보안적인 부분에 대해 더욱 신경을 써야 하며, 결제, 개인정보 등 중요 요청의 경우에는 이중 인증 등의 절차를 추가하는 등의 과정이 필요합니다.

 

 


 

 

SSO의 다양한 방식,

SSO에서는 인증 서버를 거친 사용자의 인증 정보에 대한 유효성을 다른 서버에서 어떻게 확인할 것인지도 중요한 부분이 되는데요.

이때 사용되는 방식(프로토콜)으로는 SAML / OAuth /  OIDC / JWT 등이 있습니다.

이어지는 내용을 통해 각각의 방식(프로토콜)에 대해서 간단하게 살펴본 뒤, 이어서 JWT를 사용한 싱글사인온의 동작 원리를 살펴보겠습니다.

(방식은 여러 가지지만, 기본적인 패턴은 동일하며, 인증 서버를 통한 사용자 인증 정보를 다른 서비스로 넘길 수 있게 해 준다는 것에 있습니다.)

 

 

1. SAML

보안 검증 마크업 언어(Security Assertion Markup Language)는 싱글사인온 초기에 많이 사용된 방식으로, 네트워크를 통해 여러 컴퓨터에서 보안 자격 증명을 공유할 수 있도록 하는 공개 표준입니다.

 

<saml:Subject>
    <saml:NameID Format=”urn:oasis:names:tc:SAML:2.0:nameid-format:unsepcified”>_ab3d2943b2fc10636dab0a0b2ad5f68b6fc28f62d7</saml:NameID>
    <saml:SubjectConfirmation Method=”urn:oasis:names:tc:SAML:2.0:cm:bearer”>
        <saml:SubjectConfirmationData NotOnOrAfter=”2022-05-20T14:02:21Z” Recipient=”http://localhost:8088”/>
    </saml:SubjectConfirmation>
</saml:Subject>

해당 방식은 위 예시와 같이 XML을 기반으로 한 방식이며, 전달되는 정보에 비해 많은 태그가 사용된다는 비효율성이 있습니다.

(이 XML 데이터를 암호화하여 제 3자에게 내용을 노출시키지 않고 최종 수신자에게 전달할 수 있습니다.)

 

SAMLRequest, SAMLResponse는 XML 형식이기 때문에 브라우저를 통해서만 동작이 가능하며, 모바일 환경이나 Native Application에서는 사용할 수 없다는 문제가 있습니다.

 

 

2. OAuth

OAuth는 (정확하게는 OAuth 2.0 / Open Authorization2.0) 인가(Authorization)를 위한 개방형 표준 프로토콜입니다.

OAuth는 모바일 환경에서 사용할 수 없다는 SAML의 단점을 보안하기 위해 개발되었으며, XML이 아닌 JSON 형식을 기반으로 합니다.

또한 SAML은 인증과 인가(Authentication, Authorization)를 둘 다 다루는데 반해 OAuth는 인가(Authorization)를 목적으로 설계되었습니다.

 

 

3. OIDC

OIDC(OpenID Connect)는 OAuth 2.0을 이용하여 만들어진 인증 레이어입니다.

OAuth가 인가를 목적으로 설계되었기 때문에 인증(Authentication)을 사용하기가 어려운데요. OIDC에서는 인증을 위해 JWT 형식의 ID Token이라고 하는 토큰을 추가하여 인가와 인증 모두를 다룰 수 있도록 한 기능입니다.

 

 


 

 

JWT를 사용한 SSO 동작 이론

 

JWT 토큰 기반 인증 시스템 (JSON Web Token)

Spring Boot + Security + JWT + Redis 를 기본으로한 RESTful API를 구현하기로 계획하며 토큰 기반 인증 시스템 JWT에 대해서 다시 한번 정리합니다. 토큰 기반 인증 시스템이란, 먼저 웹 보안은 요청하는 사

wildeveloperetrain.tistory.com

(토큰 기반 인증 시스템 JWT에 대한 내용입니다. JWT가 무엇인지에 대한 개념이 부족하시다면 참고하시면 좋을 것 같습니다.)

 

 

jwt sso 인증 과정

(jwt를 활용한 sso 인증 과정에 대한 이론입니다.)

 

  1. 클라이언트가 Service A에 로그인을 시도합니다.
  2. Service A는 인증 서버(idP: Identity Provider)로 해당 요청을 Redirect 합니다.
  3. 인증 서버(idP)는 클라이언트에게 로그인 화면을 제공합니다.
  4. 사용자는 ID/PW (또는 OAuth 2.0)으로 로그인을 시도합니다.
  5. 인증 서버는 클라이언트의 인증 과정을 거쳐, 올바른 경우 인증 토큰(여기서는 JWT)을 발급하여 Service A로 돌려보냅니다.
  6. Service A는 발급된 인증 토큰을 확인하고, 올바른 인증일 경우 클라이언트의 로그인을 허용합니다.

해당 과정이 동작하기 위해서는 인증 서버(idP)와 각 서비스들이 사전에 JWT에 대한 비밀키(private key)를 공유하는 것이 필요합니다.

 

 

 

추가적으로 이 과정에서 보안을 위해 세션을 같이 사용하는 경우도 있는데요.

어떤 서비스는 인증 토큰이 유효하더라도 사용자의 IP가 바뀌면 로그인을 다시 하도록 하는 경우도 있습니다.

또 AccessToken의 경우 보안을 위해 만료 기간을 짧게 두고, 대신 AccessToken 재발급 시, 세션 정보를 담은 RefreshToken을 통해 재발급을 요청함으로써 토큰 탈취에 대한 보안을 강화할 수 있습니다.

 

 

 

< 참고 자료 >

 

인증 토큰을 활용한 SSO의 구현

SSO(Single Sign-On) 구현을 위한 토큰(Token)의 활용 | SSO(Single Sign-On)는 무엇인가? SSO(Single Sign-On)은 한 번의(Single) 로그인 인증(Sign-On)으로 여러 개의 서비스를 추가적인 인증 없이 사용할 수 있는 기술

brunch.co.kr

 

 

호다닥 공부해보는 SSO와 친구들 (SAML, OAuth, OIDC)

Overview 우리는 여러 사이트를 돌아다니면서 내가 “나”임을 증명하기 위해 계정을 만들고 로그인을 하게 됩니다. 예전에는 여러 사이트마다 각자 계정을 만드는 일이 잦았는데 최근엔 대형 회

gruuuuu.github.io