오늘은 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)]
- 사용자가 클라이언트(웹/모바일 앱 등)에 접속을 시도합니다.
- 클라이언트는 인증이 필요함을 판단하고 인증 서버(Identity Provider, 예: Okta, Keycloak, Auth0 등)에 인증을 요청합니다.
- 인증 서버가 사용자의 자격 증명(아이디, 비밀번호, 2FA 등)을 확인합니다.
- 인증에 성공하면 액세스 토큰, ID 토큰(OIDC에서는 사용자 정보를 담고 있는 토큰)을 발급해 클라이언트에 전달합니다.
- 클라이언트는 받은 토큰을 이용해 여러 자원 서버(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 기반 로그인
}
}
🚀 동작 원리
- 사용자가 웹 애플리케이션에 접근: 인증되지 않은 사용자는 로그인 페이지로 리디렉션됩니다.
- 인증 서버와의 연결: Spring Security가 설정값에 따라 인증 서버(Identity Provider)로 인증을 요청합니다.
- 인증 결과 토큰 발급: 인증 서버가 사용자 인증에 성공하면 Authorization Code를 클라이언트로 전송, 이후 클라이언트는 해당 코드를 이용해 액세스 토큰과 ID 토큰을 발급받습니다.
- 사용자 세션/권한 확인: 발급된 토큰을 통해 사용자를 식별하고, 사용자 정보를 세션에 저장합니다. 이제 사용자는 추가 로그인 없이도 여러 서비스에 액세스가 가능합니다.
3. 주요 장점 🌟
- 사용자 경험 개선: 여러 서비스 이용 시 매번 로그인할 필요가 없어 사용자 만족도가 높아집니다.
- 중앙 집중형 보안: 보안 정책을 통합 관리하기 쉽고, MFA(멀티 팩터 인증) 등 고도화된 인증 방식도 일관되게 적용할 수 있습니다.
- 운영 효율성: 계정 관리와 로그인 로그 모니터링을 한 곳에서 처리할 수 있으므로 운영 비용이 절감됩니다.
4. 주의할 점 ⚠️
- 단일 장애점(SPoF, Single Point of Failure): 인증 서버가 다운되면 전체 시스템의 로그인이 불가능해질 수 있으므로, HA(고가용성) 구성이 필수입니다.
- 토큰 보안 관리: 토큰 탈취 방지를 위해 HTTPS 적용, 토큰 만료 시간 관리, Refresh 토큰 사용 시 보안 강화 등이 필요합니다.
- 프로토콜 준수: 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
4) SSO 테스트// 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(); } }
- Spring Boot 애플리케이션에 접근 시 Keycloak 로그인 페이지로 이동
- 로그인 성공 후, 동일 Realm 내 다른 애플리케이션에도 로그인 없이 접근 가능
6. 마치며 🎁
SSO는 사용자 경험을 극대화하고 중앙 집중형 계정 및 보안 관리를 가능하게 해주는 강력한 솔루션입니다. OAuth 2.0, OpenID Connect, SAML 등 표준 프로토콜에 기반해 설계되므로, 다양한 환경과 통합하기도 쉽습니다.
SSO를 잘 도입하면 한 번의 인증으로 여러 서비스에 대한 편리한 접근이 가능하며, 보안과 운영 효율성도 동시에 잡을 수 있습니다.
참고 자료 및 출처
여러분도 위 내용을 바탕으로 다양한 인증 시나리오를 설계해보세요!
"SSO로 로그인은 한 번이면 충분합니다!"
'100===Dev Ops > SSO' 카테고리의 다른 글
Keycloak 인증 후 어떤 정보가 반환되나요? 😋 (0) | 2025.02.03 |
---|---|
Keycloak SSO 연동 방법 😋 (0) | 2025.02.03 |