스프링 부트 백엔드 개발 강좌, OAuth2로 로그인 로그아웃 구현, OAuth2 설정 파일 작성하기

1. 서론

최근 마이크로서비스 아키텍처와 클라우드 서비스를 기반으로 한 웹 애플리케이션 개발이 증가함에 따라, 스프링 부트(Spring Boot)와 같은 프레임워크의 인기도 높아지고 있습니다.
스프링 부트는 복잡한 설정 없이도 애플리케이션을 신속하게 개발할 수 있도록 도와주는 프레임워크입니다.
이번 강좌에서는 스프링 부트를 이용한 백엔드 개발에서 OAuth2를 사용하여 로그인 및 로그아웃 기능을 구현하는 방법을 자세히 알아보겠습니다.

2. OAuth2란?

OAuth2는 사용자가 클라이언트 애플리케이션에 대한 접근 권한을 제어할 수 있도록 해주는 인증 프로토콜입니다.
OAuth2를 사용하면 사용자가 자신의 자격 증명을 애플리케이션과 공유하지 않고도 특정 자원에 대한 인증 및 인가를 수행할 수 있습니다.
이는 보안을 강화하고 사용자 경험을 크게 개선할 수 있는 방법입니다.

2.1 OAuth2의 주요 구성 요소

  • Resource Owner: 클라이언트 애플리케이션에 권한을 부여하는 사용자
  • Client: Resource Owner의 자원에 접근하려는 애플리케이션
  • Resource Server: 사용자의 자원이 저장된 서버
  • Authorization Server: 사용자의 인증 정보를 처리하고 클라이언트에게 토큰을 발급하는 서버

3. 스프링 부트 프로젝트 설정

스프링 부트 애플리케이션을 시작하기 위해 먼저 새로운 프로젝트를 생성합니다.
Spring Initializr를 사용하여 Maven 또는 Gradle 기반의 프로젝트를 생성할 수 있습니다.

3.1 의존성 추가

OAuth2 인증을 구현하기 위해, 다음 의존성을 추가해야 합니다:

dependencies {
    implementation 'org.springframework.boot:spring-boot-starter-web'
    implementation 'org.springframework.boot:spring-boot-starter-security'
    implementation 'org.springframework.security.oauth.boot:spring-security-oauth2-autoconfigure:2.1.0.RELEASE'
}

3.2 application.properties 설정

다음으로, src/main/resources/application.properties 파일을 열어 OAuth2 인증에 필요한 설정을 추가합니다.
아래의 설정 예시를 참조하세요.


spring.security.oauth2.client.registration.google.client-id={YOUR_CLIENT_ID}
spring.security.oauth2.client.registration.google.client-secret={YOUR_CLIENT_SECRET}
spring.security.oauth2.client.registration.google.scope=profile, email
spring.security.oauth2.client.registration.google.redirect-uri=http://localhost:8080/login/oauth2/code/google
spring.security.oauth2.client.provider.google.authorization-uri=https://accounts.google.com/o/oauth2/auth
spring.security.oauth2.client.provider.google.token-uri=https://oauth2.googleapis.com/token
spring.security.oauth2.client.provider.google.user-info-uri=https://www.googleapis.com/oauth2/v3/userinfo

4. OAuth2 로그인 구현

이제 애플리케이션에서 OAuth2 로그인을 구현해 보겠습니다. 스프링 시큐리티(Spring Security)를 통해 간단하게 설정할 수 있습니다.

4.1 Security Configuration

새로운 Java 클래스를 생성하여 보안 설정을 구성합니다.

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**", "/error**").permitAll()
                .anyRequest().authenticated()
                .and()
            .oauth2Login();
    }
}

5. 사용자 프로필 조회

사용자가 로그인하면 OAuth2 서버로부터 사용자 정보를 요청하여 프로필을 받아올 수 있습니다.
이를 위한 컨트롤러를 작성합니다.

import org.springframework.security.core.annotation.AuthenticationPrincipal;
import org.springframework.security.oauth2.core.user.OAuth2User;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.GetMapping;

@Controller
public class UserProfileController {
    @GetMapping("/user")
    public String user(@AuthenticationPrincipal OAuth2User principal, Model model) {
        model.addAttribute("name", principal.getAttribute("name"));
        model.addAttribute("email", principal.getAttribute("email"));
        return "userProfile";
    }
}

6. 로그아웃 구현

로그아웃 기능은 스프링 시큐리티에서 기본적으로 제공되며, 설정을 통해 손쉽게 구현할 수 있습니다.
아래와 같이 로그아웃 URL과 관련된 설정을 추가합니다.

    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http
            .authorizeRequests()
                .antMatchers("/", "/login**", "/error**").permitAll()
                .anyRequest().authenticated()
                .and()
            .oauth2Login()
                .and()
            .logout()
                .logoutSuccessUrl("/")
                .invalidateHttpSession(true)
                .deleteCookies("JSESSIONID");
    }

7. 결론

본 강좌에서는 스프링 부트를 이용하여 OAuth2를 통해 로그인 및 로그아웃 기능을 구현하는 간단한 방법을 살펴보았습니다.
스프링 부트와 OAuth2를 사용하면 외부 인증 시스템과 쉽게 연동할 수 있으며, 이는 애플리케이션의 보안을 강화하고 사용자 경험을 개선하는 데에 크게 기여합니다.
앞으로 자신의 프로젝트에 OAuth2를 적용하여 보다 안전하고 편리한 서비스를 제공해 보세요!

8. 추가 자료

더 많은 정보를 원하시면 공식 문서와 기타 자료를 참조하시기 바랍니다.