스프링 부트 백엔드 개발 강좌, OAuth2로 로그인 로그아웃 구현, 권한 부여 코드 승인 타입이란

현대의 웹 애플리케이션에서는 보안과 사용자 인증이 매우 중요한 요소입니다. 특히 소셜 로그인, API 연동 등 다양한 방식으로 사용자 인증을 진행해야 하는 경우가 많습니다. 이때 많이 사용되는 프로토콜 중 하나가 바로 OAuth2입니다. 본 강좌에서는 스프링 부트를 이용하여 OAuth2를 통한 로그인 및 로그아웃 기능을 구현하고, 권한 부여 코드 승인 타입에 대해 자세히 알아보겠습니다.

1. OAuth2란?

OAuth2는 인터넷 사용자들이 비밀번호를 제공하지 않고도 제3자 애플리케이션이 자신들의 정보를 보도록 허용할 수 있게 해주는 인기 있는 인증 프로토콜입니다. 애플리케이션이 사용자의 정보를 안전하게 접근할 수 있도록 권한 위임을 가능하게 합니다.

2. OAuth2 프로세스 이해하기

OAuth2의 주요 프로세스는 다음과 같은 단계로 나뉩니다:

  • 1) 클라이언트 등록: 클라이언트 애플리케이션이 OAuth 제공자에게 등록되어 고유 클라이언트 ID와 비밀키를 발급받습니다.
  • 2) 인증 요청: 사용자가 클라이언트 애플리케이션에서 인증 버튼을 클릭하면, OAuth 서버로 인증 요청이 전달됩니다.
  • 3) 사용자 인증: OAuth 서버에서는 사용자가 인증을 수행하고, 권한을 부여하는 화면을 표시합니다.
  • 4) 권한 부여 코드 발급: 사용자가 권한을 부여하면 OAuth 서버는 클라이언트로 권한 부여 코드를 반환합니다.
  • 5) 액세스 토큰 발급: 클라이언트는 권한 부여 코드를 사용하여 액세스 토큰을 요청합니다.
  • 6) API 접근: 클라이언트는 액세스 토큰을 이용해 API에 접근하여 사용자의 데이터에 접근합니다.

3. 스프링 부트에서 OAuth2 설정하기

스프링 부트를 이용하여 OAuth2를 설정하는 과정은 다음과 같습니다. 먼저, 필요한 종속성을 추가해야 합니다.

pom.xml
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-oauth2-client</artifactId>
</dependency>
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-security</artifactId>
</dependency>
    

3.1. application.yml 설정

OAuth2 인증 프로바이더의 정보와 클라이언트 정보를 설정 파일에 추가합니다. 일반적으로 Google과 같은 소셜 로그인 제공자의 정보를 설정합니다.

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
            user-name-attribute: sub
    

3.2. 보안 설정

스프링 시큐리티를 사용하여 보안 설정을 적용합니다.

WebSecurityConfig.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 WebSecurityConfig extends WebSecurityConfigurerAdapter {
    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http
            .authorizeRequests()
            .antMatchers("/", "/login").permitAll() // 모든 사용자에게 / 및 /login 접근 허용
            .anyRequest().authenticated() // 나머지 모든 요청은 인증 필요
            .and()
            .oauth2Login(); // OAuth2 로그인 지원
    }
}
    

4. 로그인 및 로그아웃 처리하기

이제 기본적인 로그인 및 로그아웃 기능을 구현할 수 있습니다. 사용자가 /login URL에 접근했을 때, OAuth2 제공자를 통해 인증을 시도합니다. 인증이 성공적으로 완료되면, 사용자는 주요 대시보드로 리다이렉션 됩니다.

4.1. 로그인 페이지

인증 버튼을 포함한 간단한 로그인 페이지를 만들어 봅시다.

login.html
<html>
<head>
  <title>로그인 페이지</title>
</head>
<body>
  <h1>로그인</h1>
  <a href="/oauth2/authorization/google">구글로 로그인</a> 
</body>
</html>
    

4.2. 로그아웃

로그아웃 처리를 위해 추가적인 설정이 필요합니다.

WebSecurityConfig.java
@Override
protected void configure(HttpSecurity http) throws Exception {
    http
        .authorizeRequests()
        .antMatchers("/", "/login", "/logout").permitAll()
        .anyRequest().authenticated()
        .and()
        .oauth2Login()
        .and()
        .logout()
        .logoutSuccessUrl("/"); // 로그아웃 후 홈으로 리다이렉트
}
    

5. 권한 부여 코드 승인 타입이란?

OAuth2는 여러 가지 승인 타입(Grant Types)을 제공하며, 그 중에서도 가장 인기 있는 방식 중 하나가 바로 권한 부여 코드 방식(Authorization Code Grant)입니다.

5.1. 권한 부여 코드 승인 타입 설명

권한 부여 코드 방식은 일반적으로 다음과 같은 흐름을 따릅니다:

  • 사용자가 클라이언트 애플리케이션에서 로그인 버튼을 클릭합니다.
  • 클라이언트 애플리케이션은 사용자에게 OAuth2 서버의 인증 화면으로 리다이렉트합니다.
  • 사용자는 인증 정보를 입력하고 이를 OAuth2 서버에 전달합니다.
  • OAuth2 서버는 사용자가 인증되면, 권한 부여 코드를 클라이언트에 전달합니다.

5.2. 권한 부여 코드의 장점

권한 부여 코드 방식의 주요 장점은 다음과 같습니다:

  • 주요 보안 수준: 권한 부여 코드는 클라이언트 비밀과 함께 서버에만 저장되므로, 리소스 서버와의 통신 과정에서 더 안전합니다.
  • 리프레시 토큰 지원: 액세스 토큰이 만료되면 리프레시 토큰을 통해 새로 고칠 수 있습니다.

6. 마무리

이번 강좌에서는 스프링 부트를 이용해 OAuth2를 통한 로그인 및 로그아웃 기능을 구현하는 방법과 권한 부여 코드 승인 타입에 대해 알아보았습니다. OAuth2는 현대 웹 애플리케이션에서 필수적인 인증 및 권한 부여 프로토콜로, 보안성과 사용자 편의성을 제공하기 위한 중요한 도구입니다. 사용자의 필요에 맞게 다양한 인증 방법을 조합하여 더 안전하고 편리한 서비스를 만들 수 있습니다.

추천 자료