1. 서론
현대 애플리케이션의 인증(Authentication) 및 인가(Authorization) 메커니즘은 매우 중요합니다. OAuth2는
다양한 플랫폼에서 인증 및 인가를 처리하기 위한 널리 사용되는 프레임워크입니다. 본 강좌에서는 스프링 부트
와 스프링 시큐리티를 사용하여 OAuth2를 통한 로그인 및 로그아웃 과정을 단계별로 설명하겠습니다. 목표는
사용자 인증 기능을 포함한 안전한 API를 구축하는 것입니다.
2. 스프링 부트 및 스프링 시큐리티 프로젝트 설정
2.1. 설치 요구 사항
본 강좌를 진행하기 위해서는 다음의 소프트웨어가 필요합니다:
- JDK 11 이상
- Apache Maven
- IDE (IntelliJ IDEA, Eclipse 등)
2.2. 프로젝트 생성
먼저, Spring Initializr
를 사용하여 새로운 스프링 부트 프로젝트를 생성합니다. 의존성으로는
Spring Web
, Spring Security
, OAuth2 Client
를 추가합니다.
mvn clean install
3. OAuth2 인증 설정
3.1. OAuth2 제공자 구성
다양한 OAuth2 제공자가 있으며, 이번 강좌에서는 Google OAuth2를 사용할 것입니다. Google Cloud Console에서
새로운 프로젝트를 생성하고 OAuth 2.0 클라이언트 ID를 생성합니다.
필요한 정보는 클라이언트 ID와 클라이언트 비밀입니다.
3.2. 애플리케이션 프로퍼티 설정
src/main/resources/application.yml
파일에 다음과 같은 설정을 추가합니다:
spring:
security:
oauth2:
client:
registration:
google:
client-id: YOUR_CLIENT_ID
client-secret: YOUR_CLIENT_SECRET
scope:
- profile
- email
redirect-uri: "{baseUrl}/login/oauth2/code/{registrationId}"
provider:
google:
authorization-uri: https://accounts.google.com/o/oauth2/auth
token-uri: https://oauth2.googleapis.com/token
user-info-uri: https://www.googleapis.com/userinfo/email
user-name-attribute: email
4. 스프링 시큐리티 설정
4.1. 시큐리티 설정 클래스 생성
스프링 시큐리티의 기본 설정을 위해 SecurityConfig
라는 클래스를 생성합니다. 이 클래스는
WebSecurityConfigurerAdapter
를 확장하여 시큐리티 구성을 정의합니다.
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;
@Configuration
@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter {
@Override
protected void configure(HttpSecurity http) throws Exception {
http
.authorizeRequests()
.antMatchers("/", "/login", "/oauth2/**").permitAll() // 로그인과 관련된 경로는 모든 사용자에게 허용
.anyRequest().authenticated() // 그 외의 요청은 인증된 사용자만 접근 가능
.and()
.oauth2Login(); // OAuth2 로그인 설정
}
}
5. 로그인 및 로그아웃
5.1. 로그인 처리
OAuth2 로그인 처리는 스프링 시큐리티가 자동으로 관리합니다. 사용자가 /login 경로로 접근하면 로그인 페이지를
제공하고, 로그인 후에는 Redirect URI
로 설정한 경로로 리다이렉트 됩니다.
5.2. 로그아웃 처리
로그아웃은 logout
경로를 설정하여 간단하게 처리할 수 있습니다. 로그아웃 후 사용자를
홈 페이지로 리다이렉트 할 수 있습니다.
http.logout()
.logoutSuccessUrl("/") // 로그아웃 시 홈으로 리다이렉트
.invalidateHttpSession(true); // 세션 무효화
6. 클라이언트 애플리케이션 생성
로그인과 로그아웃을 테스트하기 위해 간단한 클라이언트 애플리케이션을 생성합니다. 사용자는 Google
계정을 통해 인증한 후 본인 정보를 확인할 수 있습니다.
import org.springframework.security.oauth2.client.registration.ClientRegistrationRepository;
import org.springframework.security.oauth2.client.web.userdetails.OAuth2UserService;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
public class UserController {
private final OAuth2UserService oAuth2UserService;
private final ClientRegistrationRepository clientRegistrationRepository;
public UserController(OAuth2UserService oAuth2UserService, ClientRegistrationRepository clientRegistrationRepository) {
this.oAuth2UserService = oAuth2UserService;
this.clientRegistrationRepository = clientRegistrationRepository;
}
@GetMapping("/user")
public String getUserInfo(Principal principal) {
return "User Info: " + principal.getName(); // 사용자 정보 리턴
}
}
7. 테스트 및 결론
모든 설정이 완료되었으면 애플리케이션을 실행하여
/login 페이지로 접속합니다. Google 로그인 버튼을 클릭하여 인증 과정이 올바르게 진행되는지 확인하세요.
로그인이 성공하면 /user 경로에서 사용자 정보를 확인할 수 있습니다.
이번 강좌를 통해 스프링 부트를 사용한 OAuth2 로그인/로그아웃 기초를 배웠습니다. 향후에는 JWT를
활용한 더 복잡한 인증 메커니즘으로 확장할 수 있으며, 회사의 요구 사항에 맞는 사용자 정의 기능을 추가할
수 있습니다.