본문 바로가기
스프링 부트3

OAuth2를 사용한 스프링 부트 3 인증 구현

by 굿센스굿 2024. 12. 4.
반응형

 

OAuth2는 현대 애플리케이션에서 안전하고 간편한 인증 및 권한 부여를 제공하는 표준 프로토콜입니다. 스프링 부트 3는 OAuth2를 활용한 인증 구현을 간단하고 효율적으로 지원합니다. 이번 글에서는 OAuth2를 활용하여 사용자 인증을 구현하는 방법을 단계별로 설명합니다.


1. 프로젝트 설정

OAuth2 인증 구현을 시작하기 위해 Spring Initializr에서 프로젝트를 생성합니다.

  • 프로젝트: Maven
  • 언어: Java
  • 스프링 부트 버전: 3.x.x
  • 종속성: Spring Web, Spring Security, Spring Boot Starter OAuth2 Client, Thymeleaf

생성이 완료되면 pom.xml에 필요한 의존성이 추가되었는지 확인하세요.

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

2. 애플리케이션 설정

OAuth2 인증을 위해 application.yml 파일에 클라이언트 세부 정보를 추가합니다. 여기서는 Google OAuth2를 예로 들겠습니다.

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}"
            client-name: Google
        provider:
          google:
            authorization-uri: https://accounts.google.com/o/oauth2/v2/auth
            token-uri: https://oauth2.googleapis.com/token
            user-info-uri: https://www.googleapis.com/oauth2/v3/userinfo

위에서 client-id와 client-secret은 Google Cloud Console에서 애플리케이션을 등록하여 얻을 수 있습니다.


3. Security 설정

OAuth2 인증을 활성화하려면 Spring Security를 설정해야 합니다.

package com.example.demo.config;

import org.springframework.context.annotation.Bean;
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
import org.springframework.security.web.SecurityFilterChain;

import static org.springframework.security.config.Customizer.withDefaults;

public class SecurityConfig {

    @Bean
    public SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception {
        http
            .authorizeHttpRequests(auth -> auth
                .requestMatchers("/", "/login").permitAll()
                .anyRequest().authenticated()
            )
            .oauth2Login(withDefaults()); // OAuth2 로그인 활성화
        return http.build();
    }
}

위 설정은 /와 /login 경로를 누구나 접근 가능하도록 하고, 나머지 요청은 인증이 필요하도록 합니다.


4. 컨트롤러 작성

OAuth2 인증 후 사용자 정보를 확인하기 위해 간단한 컨트롤러를 작성합니다.

package com.example.demo.controller;

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 HomeController {

    @GetMapping("/")
    public String home() {
        return "index"; // 기본 화면
    }

    @GetMapping("/profile")
    public String profile(@AuthenticationPrincipal OAuth2User principal, Model model) {
        model.addAttribute("name", principal.getAttribute("name"));
        model.addAttribute("email", principal.getAttribute("email"));
        return "profile"; // 사용자 프로필 화면
    }
}

5. HTML 템플릿 작성

src/main/resources/templates 폴더에 index.html과 profile.html 파일을 작성합니다.
index.html

<!DOCTYPE html>
<html>
<head>
    <title>Home</title>
</head>
<body>
    <h1>OAuth2 인증 예제</h1>
    <a href="/oauth2/authorization/google">Google 로그인</a>
</body>
</html>

profile.html

<!DOCTYPE html>
<html>
<head>
    <title>Profile</title>
</head>
<body>
    <h1>사용자 정보</h1>
    <p>이름: ${name}</p>
    <p>이메일: ${email}</p>
    <a href="/">홈으로</a>
</body>
</html>

6. 실행 및 테스트

  1. 애플리케이션을 실행합니다.
  2. 브라우저에서 http://localhost:8080으로 이동합니다.
  3. "Google 로그인" 버튼을 클릭하고 OAuth2 인증 과정을 진행합니다.
  4. 로그인 완료 후 /profile 페이지에서 사용자 정보를 확인합니다.

예제 확장

예제 1: GitHub OAuth2
GitHub OAuth2를 사용하려면 application.yml에 GitHub 등록 정보를 추가합니다.

github:
  client-id: your-github-client-id
  client-secret: your-github-client-secret
  scope: read:user
  redirect-uri: "{baseUrl}/login/oauth2/code/{registrationId}"

예제 2: 다중 OAuth2 공급자 지원
Google과 GitHub 모두를 지원하려면 spring.security.oauth2.client.registration에 두 공급자를 추가하고 Security 설정을 유지합니다.
예제 3: JWT 통합
OAuth2 인증 후 JWT를 생성하여 API 보안에 활용할 수 있습니다. 이 경우, Spring Security의 JWT 관련 설정을 추가로 구성하면 됩니다.


결론

스프링 부트 3에서 OAuth2 인증은 클라이언트 설정과 최소한의 코드로 구현할 수 있습니다. OAuth2를 사용하면 사용자가 외부 인증 제공자를 통해 안전하게 인증을 수행할 수 있습니다. 이를 기반으로 추가적인 권한 관리, API 보호 등을 구현하여 더 안전하고 확장 가능한 애플리케이션을 개발할 수 있습니다.

반응형