CS 정리

Spring Security + Keycloak으로 SSO 구현하기

문쿼리 2025. 7. 13. 12:56

SSO(Single Sign-On)는 하나의 로그인으로 여러 서비스에 접근할 수 있게 해주는 인증 방식

 

SSO 어떻게?

  1. 사용자가 SSO 시스템에 로그인 (예: 중앙 인증 서버)
  2. 로그인 성공 시 토큰/세션/쿠키 발급
  3. 사용자가 다른 서비스 접근 시,
    • 로그인 정보를 공유받거나
    • 중앙 인증 서버로 리다이렉트되어 로그인 상태 확인
  4. 인증이 확인되면 서비스 이용 가능

 

구현목표

  • 하나의 Keycloak 서버로 여러 Spring Boot 애플리케이션의 로그인 처리
  • 사용자 입장에서는 한 번 로그인으로 모든 서비스 접근 가능

 

시스템 구성

  • Keycloak: 인증 서버 (SSO Provider)
  • Service A / B: Spring Boot 앱 (OAuth2 Client)
  • 사용자 브라우저: Keycloak 세션으로 SSO 유지

 

Keycloak 설정 요약

  1. Realm 생성: myrealm
  2. Client 등록:
    • client_id: service-a, service-b
    • Redirect URI: http://localhost:8081/login/oauth2/code/*
    • Access Type: confidential
  3. 사용자 생성:
    • user1 / pass1
spring:
  security:
    oauth2:
      client:
        registration:
          keycloak:
            client-id: service-a
            client-secret: xxxxx
            scope: openid
            authorization-grant-type: authorization_code
            redirect-uri: "{baseUrl}/login/oauth2/code/{registrationId}"
        provider:
          keycloak:
            issuer-uri: http://localhost:8080/realms/myrealm

 

SecurityConfig.java

@EnableWebSecurity
public class SecurityConfig {
    @Bean
    public SecurityFilterChain filterChain(HttpSecurity http) throws Exception {
        http
          .authorizeHttpRequests(auth -> auth
              .anyRequest().authenticated()
          )
          .oauth2Login(); // Keycloak과 OAuth2 연동
        return http.build();
    }
}

 

로그인 흐름

  1. 사용자가 서비스 A 접근 → Keycloak 로그인 화면으로 리디렉션
  2. 로그인 성공 후 서비스 A 접근 가능
  3. 서비스 B 접근 시 → 이미 Keycloak 세션 유지 → 자동 로그인 처리 (SSO)

참고 사항

  • Keycloak은 세션 기반 인증이라 브라우저 쿠키로 인증 상태를 공유함
  • 서비스별 client-id만 다르게 설정해도 Realm과 사용자 정보가 같다면 SSO 적용 가능
  • 로그아웃 동기화는 frontchannel-logout 설정으로 구현 가능

'CS 정리' 카테고리의 다른 글

HTTPS(HyperText Transfer Protocol + SSL/TLS)  (0) 2025.07.23
OAuth2의 4가지 Grant Type  (0) 2025.07.21
네트워크 프록시  (0) 2025.07.08
트랜잭션 격리 수준  (1) 2025.07.07
트리 인덱스, B- B+  (2) 2025.07.05