스프링 부트 백엔드 개발 강좌, OAuth2로 로그인 로그아웃 구현, 토큰 발급받기

최근 몇 년 동안 웹 애플리케이션의 보안성과 사용자 인증 방식은 급격히 변화하였습니다. 특히, OAuth2는 많은 웹 서비스에서 사용자 인증을 처리하는 표준으로 자리 잡았습니다. 본 강좌에서는 스프링 부트를 이용하여 OAuth2로 로그인 및 로그아웃 구현 방법과 토큰 발급 절차에 대해 자세히 설명드리겠습니다. 이 글을 통해 OAuth2의 기본 원리와 함께, 실제 애플리케이션 구축에 필요한 기술을 익히실 수 있을 것입니다.

1. OAuth2란 무엇인가?

OAuth2는 사용자 인증을 위한 프로토콜로, 사용자가 제삼자 서비스에 자신의 정보를 제공하지 않고도 권한을 부여할 수 있게 해줍니다. 이를 통해 앱이나 서비스가 사용자의 리소스에 접근할 수 있게 되는 것입니다. OAuth2의 주요 구성 요소는 다음과 같습니다:

  • 사용자(Resource Owner): 자신의 정보를 보호하고 관리하는 주체입니다.
  • 클라이언트(Client): 사용자 대신 리소스에 접근하려는 애플리케이션입니다.
  • 자원 서버(Resource Server): 보호된 리소스를 제공하는 서버입니다.
  • 인증 서버(Authorization Server): 사용자의 인증을 처리하고 클라이언트에 접근 토큰을 발급합니다.

2. 스프링 부트란?

스프링 부트(Spring Boot)는 자바의 스프링 프레임워크를 기반으로 한 프로젝트로, 빠르게 애플리케이션을 개발할 수 있도록 도와주는 플랫폼입니다. 스프링 부트는 다음과 같은 장점을 제공합니다:

  • 설정의 간소화: 기본값으로 설정된 다양한 설정 덕분에 복잡한 설정 없이도 빠르게 시작할 수 있습니다.
  • 자동 구성: 필요한 라이브러리를 간단히 추가함으로써 자동으로 구성할 수 있습니다.
  • 스타터 패키지: 여러 종속성과 설정을 규합한 스타터 패키지를 제공하여 개발 속도를 높입니다.

3. OAuth2 로그인 시스템 구축 준비하기

3.1 프로젝트 설정

스프링 부트 프로젝트를 시작하기 위해 먼저 Spring Initializr를 이용하여 기본 프로젝트를 생성합니다. 다음과 같은 의존성을 추가합니다:

  • Spring Web
  • Spring Security
  • OAuth2 Client
  • Spring Data JPA
  • H2 Database (개발용)

3.2 프로젝트 구조

        /src
        └── main
            ├── java
            │   └── com
            │       └── example
            │           └── oauth2demo
            │               ├── controller
            │               ├── model
            │               ├── repository
            │               ├── security
            │               └── service
            └── resources
                ├── application.properties
                └── static
    

3.3 application.properties 설정

OAuth2를 사용하기 위해 아래와 같은 설정을 해줍니다. Google 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.redirect-uri={baseUrl}/login/oauth2/code/{registrationId}
        spring.security.oauth2.client.registration.google.scope=profile, email
        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. 스프링 시큐리티 설정

스프링 시큐리티를 사용하여 인증 및 권한 부여를 관리합니다. 아래는 기본적인 보안 설정 예시입니다:

    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;

    @Configuration
    @EnableWebSecurity
    public class SecurityConfig extends WebSecurityConfigurerAdapter {
        @Override
        protected void configure(HttpSecurity http) throws Exception {
            http
                .authorizeRequests()
                .anyRequest().authenticated()
                .and()
                .oauth2Login();
        }
    }
    

5. 사용자 정보 가져오기

사용자가 로그인을 완료하면, 클라이언트 애플리케이션에서 인증 정보를 얻을 수 있습니다. 사용자의 정보를 가져오기 위해 아래의 서비스를 구현합니다:

    import org.springframework.security.core.Authentication;
    import org.springframework.security.oauth2.core.user.OAuth2User;
    import org.springframework.stereotype.Service;

    @Service
    public class UserService {
        public String getCurrentUserName(Authentication authentication) {
            OAuth2User oauth2User = (OAuth2User) authentication.getPrincipal();
            return oauth2User.getAttribute("name");
        }
    }
    

6. 로그아웃 구현하기

로그아웃도 공통된 요구 사항입니다. 아래의 설정을 통해 간단한 로그아웃 기능을 구현할 수 있습니다:

    http
        .logout()
        .logoutSuccessUrl("/login")
        .invalidateHttpSession(true)
        .clearAuthentication(true);
    

7. 애플리케이션 실행 및 테스트

모든 설정을 마친 후, 애플리케이션을 실행하고 웹 브라우저에서 http://localhost:8080로 접속해 주세요. 정상적으로 설정되었다면 Google 로그인 화면이 나타납니다. 로그인 후 사용자의 이름을 가져오는 화면도 확인할 수 있습니다.

8. 마무리

본 강좌에서는 스프링 부트를 활용하여 OAuth2 기반의 로그인 및 로그아웃 기능을 구현하는 방법에 대해 살펴보았습니다. OAuth2는 현대 웹 애플리케이션에서 매우 일반적으로 사용되는 인증 방식이며, 스프링 부트를 통해 손쉽게 설정할 수 있음을 알 수 있었습니다. 앞으로 더 발전된 기능들을 추가함으로써, 보다 안전하고 편리한 사용자 인증 시스템을 구축할 수 있기를 바랍니다.

추가 자료

더 많은 정보를 원하신다면 아래의 링크를 참고하시기 바랍니다: