Spring Boot와 OAuth 2.0을 사용한 SSO (Single Sign-On) 구현
Overview
Single Sign-On (SSO) 시스템은 사용자가 여러 애플리케이션에 대해 하나의 인증만으로 접근할 수 있도록 하는 인증 프로세스입니다. 이를 구현하기 위해서는 여러 가지 기술적 요소가 필요하며, Spring Boot와 OAuth 2.0은 그 중 핵심적인 도구들입니다. 이번 설명에서는 Spring Boot와 OAuth 2.0을 사용하여 SSO 시스템을 구현하는 방법을 상세히 알아보겠습니다.
1. SSO 시스템의 이해
SSO 시스템의 기본 개념은 사용자가 한 번의 로그인만으로 여러 애플리케이션에 접근할 수 있게 하는 것입니다. SSO는 사용자 경험을 향상시키고, 여러 시스템에서 동일한 사용자 정보를 유지할 수 있도록 해줍니다.
OAuth 2.0은 인증 및 권한 부여 프레임워크로, SSO를 구현하는 데 사용됩니다. OAuth 2.0을 통해 사용자는 중앙 인증 서버에서 로그인하고, 애플리케이션은 이 인증 서버로부터 액세스 토큰을 받아 사용자의 인증을 확인합니다.
2. Spring Boot와 OAuth 2.0을 이용한 SSO 구현
2.1. Spring Boot 프로젝트 설정
Spring Boot를 사용하여 SSO를 구현하기 위해서는 먼저 Spring Boot 프로젝트를 설정해야 합니다. 이 과정에서 필요한 의존성을 설정하고, 인증 서버 및 리소스 서버를 구성하는 것이 필요합니다.
2.1.1. Spring Boot 의존성 추가
pom.xml
파일에 OAuth 2.0 관련 의존성을 추가합니다. 예를 들어, Spring Security와 OAuth 2.0 관련 의존성은 다음과 같습니다:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-security</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-oauth2-client</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-oauth2-resource-server</artifactId>
</dependency>
2.2. 인증 서버 설정
SSO 시스템의 핵심 요소는 인증 서버입니다. 인증 서버는 사용자의 로그인 정보를 관리하고, 액세스 토큰을 발급합니다.
2.2.1. 인증 서버 구성
Spring Boot를 사용하여 인증 서버를 설정하는 방법은 다음과 같습니다. 먼저, SpringSecurityOAuth2AuthorizationServer
를 설정합니다:
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity;
import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter;
import org.springframework.security.oauth2.config.annotation.web.configuration.EnableAuthorizationServer;
import org.springframework.security.oauth2.config.annotation.web.configuration.WebSecurityConfigurerAdapter;
import org.springframework.security.oauth2.config.annotation.web.configuration.WebSecurityConfigurerAdapter;
@Configuration
@EnableWebSecurity
@EnableAuthorizationServer
public class AuthorizationServerConfig extends WebSecurityConfigurerAdapter {
@Override
protected void configure(HttpSecurity http) throws Exception {
http
.csrf().disable()
.authorizeRequests()
.anyRequest().authenticated();
}
@Bean
public PasswordEncoder passwordEncoder() {
return new BCryptPasswordEncoder();
}
}
여기서는 인증 서버의 보안 설정을 정의합니다. PasswordEncoder
를 사용하여 비밀번호를 안전하게 암호화합니다.
2.2.2. 클라이언트 및 토큰 설정
클라이언트와 토큰 설정을 추가하여 클라이언트 애플리케이션이 인증 서버에 접근할 수 있도록 합니다:
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity;
import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter;
import org.springframework.security.oauth2.config.annotation.web.configuration.EnableAuthorizationServer;
import org.springframework.security.oauth2.config.annotation.web.configuration.WebSecurityConfigurerAdapter;
@Configuration
@EnableAuthorizationServer
public class AuthorizationServerConfig extends WebSecurityConfigurerAdapter {
@Override
protected void configure(HttpSecurity http) throws Exception {
http
.csrf().disable()
.authorizeRequests()
.anyRequest().authenticated();
}
@Bean
public PasswordEncoder passwordEncoder() {
return new BCryptPasswordEncoder();
}
}
2.3. 리소스 서버 설정
리소스 서버는 인증 서버에서 발급한 토큰을 검증하고, 보호된 리소스에 접근할 수 있도록 합니다.
2.3.1. 리소스 서버 구성
리소스 서버는 인증 서버로부터 발급받은 액세스 토큰을 사용하여 요청을 인증합니다. 이를 위해 Spring Boot에서 ResourceServerConfigurerAdapter
를 설정합니다:
import org.springframework.context.annotation.Configuration;
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity;
import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter;
import org.springframework.security.oauth2.config.annotation.web.configuration.ResourceServerConfigurerAdapter;
import org.springframework.security.oauth2.config.annotation.web.configuration.EnableResourceServer;
@Configuration
@EnableWebSecurity
@EnableResourceServer
public class ResourceServerConfig extends ResourceServerConfigurerAdapter {
@Override
public void configure(HttpSecurity http) throws Exception {
http
.authorizeRequests()
.antMatchers("/public/**").permitAll()
.anyRequest().authenticated();
}
}
이 설정은 /public/**
경로는 모든 사용자에게 공개하고, 나머지 경로는 인증된 사용자만 접근할 수 있도록 설정합니다.
2.4. 클라이언트 애플리케이션 설정
클라이언트 애플리케이션은 인증 서버를 통해 로그인하고, 액세스 토큰을 받아서 리소스 서버에 접근합니다.
2.4.1. 클라이언트 애플리케이션 구성
클라이언트 애플리케이션은 application.yml
또는 application.properties
파일에서 OAuth 2.0 클라이언트 설정을 추가합니다:
spring:
security:
oauth2:
client:
registration:
my-client:
client-id: my-client-id
client-secret: my-client-secret
authorization-grant-type: authorization_code
redirect-uri: "{baseUrl}/login/oauth2/code/{registrationId}"
scope: read, write
provider:
my-provider:
authorization-uri: http://localhost:8080/oauth/authorize
token-uri: http://localhost:8080/oauth/token
user-info-uri: http://localhost:8080/userinfo
jwk-set-uri: http://localhost:8080/oauth/jwks
이 설정은 OAuth 2.0 클라이언트의 세부 정보를 정의하며, 인증 서버의 URI와 클라이언트 ID, 클라이언트 비밀번호 등을 포함합니다.
2.5. 테스트 및 디버깅
구성 후에는 시스템이 제대로 작동하는지 테스트하고, 발생할 수 있는 문제를 디버깅해야 합니다.
2.5.1. 일반적인 에러 및 해결 방법
에러 코드:
401 Unauthorized
원인: 토큰이 유효하지 않거나 누락됨.
해결 방법: 클라이언트 애플리케이션에서 유효한 액세스 토큰을 전달하고 있는지 확인하고, 인증 서버의 토큰 발급 과정을 점검합니다.
에러 코드:
403 Forbidden
원인: 사용자가 요청한 리소스에 대한 권한이 없음.
해결 방법: 리소스 서버의 권한 설정을 검토하고, 클라이언트 애플리케이션의 요청이 적절한 권한을 가지고 있는지 확인합니다.
참고문서
- Spring Security OAuth2 Documentation
- Spring Boot Reference Documentation
- Spring Security OAuth2 Authorization Server
이 문서들은 Spring Boot와 OAuth 2.0을 사용하여 SSO 시스템을 구현하는 데 유용한 정보를 제공합니다. 자세한 설정과 구성 방법을 이해하고 적용하는 데 도움이 될 것입니다.
'Study Information Technology' 카테고리의 다른 글
Spring Boot와 RESTful API 구축하기 (1) | 2024.08.13 |
---|---|
Spring Boot와 Docker를 활용한 애플리케이션 배포 (0) | 2024.08.13 |
Spring Boot와 Mockito 단위 테스트의 이상적인 조합 (1) | 2024.08.13 |
Spring Boot와 JUnit 단위 테스트를 위한 완벽한 조합 (0) | 2024.08.13 |
Spring Boot DevTools 개발을 더 편리하게 만드는 도구 (0) | 2024.08.13 |