SSO(Single Sign-On)는 하나의 로그인으로 여러 서비스에 접근할 수 있게 해주는 인증 방식
SSO 어떻게?
- 사용자가 SSO 시스템에 로그인 (예: 중앙 인증 서버)
- 로그인 성공 시 토큰/세션/쿠키 발급
- 사용자가 다른 서비스 접근 시,
- 로그인 정보를 공유받거나
- 중앙 인증 서버로 리다이렉트되어 로그인 상태 확인
- 인증이 확인되면 서비스 이용 가능
구현목표
- 하나의 Keycloak 서버로 여러 Spring Boot 애플리케이션의 로그인 처리
- 사용자 입장에서는 한 번 로그인으로 모든 서비스 접근 가능
시스템 구성
- Keycloak: 인증 서버 (SSO Provider)
- Service A / B: Spring Boot 앱 (OAuth2 Client)
- 사용자 브라우저: Keycloak 세션으로 SSO 유지
Keycloak 설정 요약
- Realm 생성: myrealm
- Client 등록:
- client_id: service-a, service-b
- Redirect URI: http://localhost:8081/login/oauth2/code/*
- Access Type: confidential
- 사용자 생성:
- 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();
}
}
로그인 흐름
- 사용자가 서비스 A 접근 → Keycloak 로그인 화면으로 리디렉션
- 로그인 성공 후 서비스 A 접근 가능
- 서비스 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 |