Spring Boot SSO 통합: SAML2와 OIDC 적용 사례
Spring Boot 애플리케이션에서 SAML2와 OIDC 기반 SSO를 함께 구성하고 테스트하는 구현 사례
목차
개요
단일 로그인(SSO)은 사용자 경험을 크게 개선한다. 본문은 Spring Boot 환경에서 SAML2와 OIDC를 병행 적용하는 실제 사례를 다룬다. 처음 접하는 개발자도 전체 흐름을 이해할 수 있도록 구성했다.
SSO 개념과 선택 기준
SSO 기본 개념
SSO는 한 번의 인증으로 여러 서비스에 접근할 수 있게 한다. SAML2는 주로 기업 내부와 연동할 때, OIDC는 현대 웹·모바일 앱과의 토큰 기반 연동에 적합하다. 두 방식을 동시에 지원하면 다양한 아이덴티티 제공자(IdP)에 대응 가능하다.
언제 SAML2와 OIDC를 함께 쓰는가
- 레거시 엔터프라이즈 IdP는 SAML2를 사용
- 클라우드 기반 인증 또는 소셜 로그인을 위해 OIDC가 필요
- 서비스별 요구사항으로 두 방식이 공존해야 할 때
사전 준비
필수 요소는 다음과 같다. Spring Boot 2.7 이상 또는 Spring Boot 3.x, Spring Security의 SAML2 및 OAuth2 클라이언트 의존성, 인증서(또는 메타데이터)와 리디렉션 URI 등록이다.
설정 예제: application.yml
아래 예제는 SAML2와 OIDC 클라이언트를 동시에 등록하는 설정이다. 실제 값은 IdP에서 발급한 메타데이터나 클라이언트 정보로 대체한다. spring boot saml2 설정과 spring boot oidc sso 연동을 모두 반영한 구성 예시이다.
spring:
security:
saml2:
relyingparty:
registration:
my-saml:
identityprovider:
metadata-uri: "https://idp.example.com/metadata"
assertion-consumer-service-location: "https://app.example.com/login/saml2/sso/my-saml"
oauth2:
client:
registration:
oidc-client:
client-id: your-client-id
client-secret: your-client-secret
scope: openid,email,profile
redirect-uri: "{baseUrl}/login/oauth2/code/{registrationId}"
provider: oidc-provider
provider:
oidc-provider:
issuer-uri: https://accounts.example.com"
보안 설정: SecurityConfig 예제
Spring Security에서 SAML2와 OIDC를 동시에 허용하도록 HttpSecurity를 구성한다. sso spring boot 예제 관점에서 핵심은 로그인 엔드포인트와 성공 핸들러 처리이다.
import org.springframework.context.annotation.Configuration;
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
import org.springframework.security.web.SecurityFilterChain;
import org.springframework.context.annotation.Bean;
@Configuration
public class SecurityConfig {
@Bean
public SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception {
http
.authorizeHttpRequests(auth -> auth
.requestMatchers("/public/**").permitAll()
.anyRequest().authenticated()
)
.saml2Login(withDefaults())
.oauth2Login(withDefaults());
return http.build();
}
}
IdP 연동 및 테스트 흐름
테스트 절차는 다음과 같다.
- IdP에 애플리케이션 메타데이터 또는 리디렉션 URI 등록
- 애플리케이션에서 metadata-uri 또는 issuer-uri 설정 적용
- 브라우저로 로그인 시도: SAML2 리디렉션 또는 OIDC 인증 페이지로 이동
- 인증 성공 후 애플리케이션에 전달된 사용자 정보 확인
핵심 고려사항
사용자 매핑
IdP로부터 받은 어트리뷰트와 애플리케이션의 사용자 엔티티를 매핑하는 로직이 필요하다. 이메일 또는 고유 ID를 기준으로 매칭하는 것이 일반적이다.
세션 및 토큰 수명
SAML2는 세션 기반 흐름이 강하고 OIDC는 액세스 토큰과 리프레시 토큰을 사용한다. 세션 만료와 토큰 갱신 정책을 일관성 있게 설계해야 한다.
문제 해결 체크리스트
- 메타데이터 URL 또는 issuer-uri 오타 여부 확인
- 리디렉션 URI가 IdP에 정확히 등록되어 있는지 확인
- 클라이언트 비밀키나 인증서 유효성 확인
- 로그에서 SAML Assertion 또는 토큰 오류 메시지 확인
마무리와 추천 구조
SAML2와 OIDC를 동시에 지원하면 다양한 IdP와의 호환성이 높아진다. 서비스 요구에 따라 우선 인증 방식을 정하고 공통 사용자 매핑 계층을 두는 것이 유지보수에 유리하다. 예제를 통해 spring boot saml2 설정과 spring boot oidc sso 연동의 전체 흐름을 파악할 수 있다.