스프링 부트 백엔드 개발 강좌, OAuth2로 로그인 로그아웃 구현, OAuth란

안녕하세요! 이번 블로그 포스트에서는 스프링 부트를 사용하여 OAuth 2.0을 통해 안전하게 로그인 및 로그아웃 기능을 구현하는 방법을 알아보겠습니다. OAuth란 무엇인지부터 시작해 그 기본 개념을 이해한 후, 실제 코드 예제를 통해 스프링 부트에서 OAuth2를 사용하는 방법을 자세히 살펴보겠습니다.

1. OAuth란 무엇인가?

OAuth(오픈 인증)는 사용자가 자신의 정보를 제3의 서비스에 안전하게 공유할 수 있도록 허용하는 인증 프로토콜입니다. 예를 들어, 사용자가 서비스 A에서 자신의 정보를 서비스 B와 공유하고자 할 때, 서비스 A의 로그인 정보를 직접 제공하지 않고 서비스 B에 접근 권한을 부여할 수 있습니다.

1.1 OAuth의 배경

과거에는 사용자가 여러 서비스에 가입할 때마다 각각의 로그인 정보를 따로 관리해야 했습니다. 이는 보안상의 문제를 일으킬 수 있으며, 사용자의 번거로운 경험을 초래했습니다. OAuth는 이러한 문제를 해결하기 위해 설계된 프로토콜로, 토큰 기반 인증 및 권한 부여를 통해 더 안전한 방법으로 서로의 정보를 공유할 수 있게 합니다.

1.2 OAuth의 작동 원리

OAuth는 일반적으로 다음과 같은 과정을 통해 작동합니다:

  • 인증 요청: 클라이언트가 사용자를 대신하여 리소스 서버에 접근하기 위해 요청을 보냅니다.
  • 사용자 인증: 사용자 디스플레이에 로그인 화면이 표시되며, 사용자는 자신의 인증 정보를 입력합니다.
  • 토큰 발급: 사용자 인증이 성공하면 인증 서버는 클라이언트에 접근 토큰을 발급합니다.
  • 리소스 요청: 클라이언트는 발급받은 토큰을 사용하여 리소스 서버에 요청을 보냅니다.

2. OAuth 2.0의 주요 구성 요소

OAuth 2.0에는 다음과 같은 구성 요소가 있습니다:

  • 클라이언트(Client): 리소스에 접근하려는 애플리케이션입니다.
  • 리소스 서버(Resource Server): 보호된 데이터를 호스팅하는 서버입니다.
  • 인증 서버(Authorization Server): 클라이언트에게 인증 토큰을 발급하는 서버입니다.
  • 사용자(User): 클라이언트가 접근하려는 데이터의 소유자입니다.

3. 스프링 부트로 OAuth2 구현하기

이제 스프링 부트를 사용하여 OAuth2를 구현해 보겠습니다. 이 예제에서는 Google OAuth2를 사용하여 로그인과 로그아웃을 구현할 것입니다.

3.1 프로젝트 설정

스프링 부트 프로젝트를 생성하기 위해 Spring Initializr(https://start.spring.io/)를 사용합니다. 다음과 같은 종속성을 추가합니다:

  • Spring Web
  • Spring Security
  • Spring Boot DevTools
  • OAuth2 Client

3.2 application.yml 설정

프로젝트가 생성된 후, src/main/resources/application.yml 파일에 Google OAuth2 클라이언트 ID와 클라이언트 비밀번호를 설정합니다.

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/oauth2/v3/userinfo
            user-info-authentication-method: header

3.3 WebSecurityConfigurerAdapter 설정

스프링 시큐리티를 설정하여 OAuth2 지원을 활성화합니다. 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").permitAll()
                .anyRequest().authenticated()
                .and()
            .oauth2Login()
                .loginPage("/login")
                .defaultSuccessUrl("/home", true);
    }
}

3.4 로그인 컨트롤러 추가

로그인 후 리디렉션할 컨트롤러를 추가합니다.

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;

@Controller
public class HomeController {
    
    @GetMapping("/")
    public String index() {
        return "index"; // 인덱스 페이지 뷰 반환
    }

    @GetMapping("/home")
    public String home() {
        return "home"; // 홈 페이지 뷰 반환
    }
}

3.5 HTML 뷰 만들기

스프링 부트에서 사용할 두 개의 HTML 파일을 만듭니다. src/main/resources/templates/index.html 파일을 생성합니다.

<!DOCTYPE html>
<html lang="ko">
<head>
    <meta charset="UTF-8">
    <title>OAuth 로그인</title>
</head>
<body>
    <h1>환영합니다!</h1>
    <a href="/oauth2/authorization/google">Google로 로그인</a>
</body>
</html>

다음으로 src/main/resources/templates/home.html 파일을 생성합니다.

<!DOCTYPE html>
<html lang="ko">
<head>
    <meta charset="UTF-8">
    <title>홈</title>
</head>
<body>
    <h1>안녕하세요, <span th:text="${#authentication.details.name}"></span>!</h1>
    <a href="/logout">로그아웃</a>
</body>
</html>

3.6 애플리케이션 실행

프로젝트를 빌드하고 실행하면, 애플리케이션의 메인 페이지에서 Google 로그인 링크를 볼 수 있습니다. 이를 클릭하면 Google 로그인 페이지로 리디렉션되며, 로그인이 성공하면 홈 페이지로 돌아갑니다.

4. 마무리

이제 스프링 부트와 OAuth2를 사용하여 로그인 및 로그아웃 기능을 성공적으로 구현해보았습니다. OAuth2는 다양한 서비스 간에 안전하게 데이터 공유를 가능하게 하며, 이를 통해 더욱 향상된 사용자 경험을 제공할 수 있습니다. 또한, OAuth2의 다양한 기능을 활용하여 비즈니스 로직에 맞는 인증 방식을 선택할 수 있습니다.

더 많은 자료와 정보를 원하신다면, 스프링 부트 공식 문서와 OAuth2에 대한 다양한 자료를 참고하시기 바랍니다. 언제든지 댓글로 질문해 주시면, 제가 아는 한에서 최대한 도움을 드리도록 하겠습니다. 감사합니다!