100===Dev Ops/SSO

SSO(Single Sign-On) 구축 😋

블로글러 2025. 2. 3. 22:44

오늘은 SSO(Single Sign-On)에 대해 알아보겠습니다!
단 한 번의 로그인으로 여러 서비스나 애플리케이션에 접근할 수 있도록 해주는 기능이 바로 SSO입니다.
이를 통해 사용자의 로그인 편의성을 높이고, 보안이나 계정 관리 측면에서도 강력한 이점을 제공하죠.


1. SSO란? 🤔

SSO(Single Sign-On)는 사용자가 한 번만 인증을 거치면, 동일한 인증 세션을 통해 여러 서비스에 자동으로 로그인 상태를 유지할 수 있게 하는 인증 방식입니다.

  • 개념 요약
    예를 들어, Gmail에 로그인했더니 유튜브나 구글 드라이브 등 Google의 다른 서비스도 자동으로 로그인 상태가 되는 경험이 바로 SSO입니다.
  • 실생활 예시
    회사 인트라넷에서 메일, 메신저, 문서 관리 시스템 등을 각각의 계정으로 로그인해야 한다면 매우 번거롭습니다. 하지만 SSO를 적용하면 한 번의 로그인으로 회사 내 여러 시스템에 자동 접근이 가능해집니다.
  • 어떤 문제를 해결하는지?
    • 사용자 편의성: 하나의 계정(혹은 인증 세션)으로 여러 서비스에 접근 가능
    • 계정 관리 부담 감소: 여러 시스템에 대한 계정을 분산해서 관리하지 않아도 됨
    • 보안 강화: 중앙 집중형 인증 체계를 통해 로그인 정책, MFA, 접근 제어 등을 일관성 있게 적용 가능

2. 어떻게 동작하나요? 🎬

SSO 구현 방식에는 다양한 표준 프로토콜과 접근법이 있습니다. 예를 들어, SAML(Security Assertion Markup Language), OAuth 2.0 / OpenID Connect(OIDC) 등이 대표적입니다. 이 중에서 많이 쓰이는 OAuth 2.0 / OIDC 방식을 간단히 살펴보겠습니다.

1) 기본 개념 (OIDC 기반 예시)

사용자(User) -> [클라이언트(Application)] -> [인증 서버(Authorization Server/Identity Provider)]
  1. 사용자클라이언트(웹/모바일 앱 등)에 접속을 시도합니다.
  2. 클라이언트는 인증이 필요함을 판단하고 인증 서버(Identity Provider, 예: Okta, Keycloak, Auth0 등)에 인증을 요청합니다.
  3. 인증 서버가 사용자의 자격 증명(아이디, 비밀번호, 2FA 등)을 확인합니다.
  4. 인증에 성공하면 액세스 토큰, ID 토큰(OIDC에서는 사용자 정보를 담고 있는 토큰)을 발급해 클라이언트에 전달합니다.
  5. 클라이언트는 받은 토큰을 이용해 여러 자원 서버(Resource Server, 별도의 API나 다른 서비스)에 접근하거나, 추가 인증 절차 없이도 동일 세션으로 다른 서비스에 접근할 수 있습니다.

2) 실제 적용 예시 (Spring Security + OAuth 2.0 / OIDC)

아래는 Spring Boot 애플리케이션에서 OAuth 2.0 / OIDC를 통해 SSO를 구축할 때의 예시 설정입니다.

<!-- build.gradle (혹은 pom.xml) 예시 -->
dependencies {
    implementation 'org.springframework.boot:spring-boot-starter-oauth2-client'
    implementation 'org.springframework.boot:spring-boot-starter-web'
    // 필요에 따라 security starter 포함
}
// application.yml 예시
spring:
  security:
    oauth2:
      client:
        registration:
          my-oidc:
            client-id: your_client_id
            client-secret: your_client_secret
            redirect-uri: "{baseUrl}/login/oauth2/code/{registrationId}"
            scope:
              - openid
              - profile
              - email
            client-name: My OIDC
            authorizationGrantType: authorization_code

        provider:
          my-oidc:
            issuer-uri: https://my-identity-provider.com/
// SecurityConfig.java 예시
@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter {
    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http
          .authorizeRequests()
            .antMatchers("/", "/public/**").permitAll()
            .anyRequest().authenticated()
            .and()
          .oauth2Login(); // OAuth 2.0 / OIDC 기반 로그인
    }
}

🚀 동작 원리

  1. 사용자가 웹 애플리케이션에 접근: 인증되지 않은 사용자는 로그인 페이지로 리디렉션됩니다.
  2. 인증 서버와의 연결: Spring Security가 설정값에 따라 인증 서버(Identity Provider)로 인증을 요청합니다.
  3. 인증 결과 토큰 발급: 인증 서버가 사용자 인증에 성공하면 Authorization Code를 클라이언트로 전송, 이후 클라이언트는 해당 코드를 이용해 액세스 토큰ID 토큰을 발급받습니다.
  4. 사용자 세션/권한 확인: 발급된 토큰을 통해 사용자를 식별하고, 사용자 정보를 세션에 저장합니다. 이제 사용자는 추가 로그인 없이도 여러 서비스에 액세스가 가능합니다.

3. 주요 장점 🌟

  1. 사용자 경험 개선: 여러 서비스 이용 시 매번 로그인할 필요가 없어 사용자 만족도가 높아집니다.
  2. 중앙 집중형 보안: 보안 정책을 통합 관리하기 쉽고, MFA(멀티 팩터 인증) 등 고도화된 인증 방식도 일관되게 적용할 수 있습니다.
  3. 운영 효율성: 계정 관리와 로그인 로그 모니터링을 한 곳에서 처리할 수 있으므로 운영 비용이 절감됩니다.

4. 주의할 점 ⚠️

  1. 단일 장애점(SPoF, Single Point of Failure): 인증 서버가 다운되면 전체 시스템의 로그인이 불가능해질 수 있으므로, HA(고가용성) 구성이 필수입니다.
  2. 토큰 보안 관리: 토큰 탈취 방지를 위해 HTTPS 적용, 토큰 만료 시간 관리, Refresh 토큰 사용 시 보안 강화 등이 필요합니다.
  3. 프로토콜 준수: SAML, OAuth 2.0, OIDC 등 프로토콜의 세부 규격을 준수해야 호환성이 보장됩니다. 설정 오류로 인한 인증 불일치나 취약점이 발생하지 않도록 주의해야 합니다.

5. 실제 사용 예시 📱

아래는 Keycloak으로 간단한 SSO 환경을 구성하는 예시입니다.

1) Keycloak 서버 설치 및 실행

   docker run -p 8080:8080 \
     -e KEYCLOAK_ADMIN=admin \
     -e KEYCLOAK_ADMIN_PASSWORD=admin \
     quay.io/keycloak/keycloak:latest start-dev

2) Realm/Client 생성

  • Keycloak Admin 콘솔에서 새로운 Realm 생성
  • Client(SSO를 사용하려는 애플리케이션) 등록, Redirect URI 설정
    3) Spring Boot 애플리케이션에 Keycloak 연동
    // application.yml
    keycloak:
    realm: myrealm
    auth-server-url: http://localhost:8080/
    resource: myclient
    credentials:
      secret: myclient-secret
    bearer-only: false
    ssl-required: external
    // SecurityConfig.java (Keycloak Spring Adapter 사용 시)
    @Configuration
    @EnableWebSecurity
    @KeycloakConfiguration
    public class SecurityConfig extends KeycloakWebSecurityConfigurerAdapter {
      @Override
      protected void configure(HttpSecurity http) throws Exception {
          super.configure(http);
          http
            .authorizeRequests()
            .anyRequest().authenticated();
      }
    }
    4) SSO 테스트
  • Spring Boot 애플리케이션에 접근 시 Keycloak 로그인 페이지로 이동
  • 로그인 성공 후, 동일 Realm 내 다른 애플리케이션에도 로그인 없이 접근 가능

6. 마치며 🎁

SSO는 사용자 경험을 극대화하고 중앙 집중형 계정 및 보안 관리를 가능하게 해주는 강력한 솔루션입니다. OAuth 2.0, OpenID Connect, SAML 등 표준 프로토콜에 기반해 설계되므로, 다양한 환경과 통합하기도 쉽습니다.
SSO를 잘 도입하면 한 번의 인증으로 여러 서비스에 대한 편리한 접근이 가능하며, 보안운영 효율성도 동시에 잡을 수 있습니다.


참고 자료 및 출처

여러분도 위 내용을 바탕으로 다양한 인증 시나리오를 설계해보세요!
"SSO로 로그인은 한 번이면 충분합니다!"

728x90

'100===Dev Ops > SSO' 카테고리의 다른 글

Keycloak 인증 후 어떤 정보가 반환되나요? 😋  (0) 2025.02.03
Keycloak SSO 연동 방법 😋  (0) 2025.02.03