스프링 부트 백엔드 개발 강좌, OAuth2로 로그인 로그아웃 구현, 글에 글쓴이 추가하기

안녕하세요! 이번 글에서는 스프링 부트를 사용하여 백엔드 개발을 하는 방법에 대해 자세히 알아보겠습니다. 특히 OAuth2를 활용하여 사용자 인증 기능을 구현하고, 사용자가 작성한 글에 글쓴이 정보를 추가하는 방법을 다루겠습니다.

1. 스프링 부트란?

스프링 부트는 복잡한 설정을 최소화하고 빠른 애플리케이션 개발을 가능하게 해주는 프레임워크입니다. 스프링 프레임워크를 기반으로 하며, 자주 사용되는 라이브러리와 설정을 내장하고 있어 매우 효율적으로 웹 애플리케이션을 개발할 수 있습니다.

1.1. 스프링 부트의 장점

  • 제공되는 스타터 의존성으로 빠르고 쉽게 시작할 수 있습니다.
  • 자동 구성 기능으로 복잡한 설정을 줄일 수 있습니다.
  • 내장 서버를 통해 별도의 서버 설정 없이도 실행할 수 있습니다.
  • 스프링에 대한 깊은 이해가 없더라도 개발이 가능합니다.

2. OAuth2란 무엇인가?

OAuth2는 리소스 소유자가 자원에 대한 접근을 제3자 애플리케이션에 허가할 수 있도록 도와주는 인증 및 권한 부여 프로토콜입니다. 웹 애플리케이션, 모바일 애플리케이션 등 다양한 환경에서 사용자 인증을 쉽게 구현할 수 있게 해줍니다.

2.1. OAuth2의 주요 구성 요소

  • Resource Owner: 보호된 리소스에 대한 접근을 허가하는 사용자.
  • Client: 자원 소유자의 권한을 받아서 자원에 접근하는 애플리케이션.
  • Authorization Server: 인증을 처리하고, 토큰을 발급하는 서버.
  • Resource Server: 보호된 리소스를 저장하고 있는 서버.

3. 프로젝트 설정

스프링 부트를 이용한 프로젝트 개발을 시작하기 위해 Spring Initializr를 사용합니다. 다음과 같은 의존성을 선택해 주세요:

  • Spring Web
  • Spring Security
  • Spring Data JPA
  • H2 Database (테스트 목적)
  • OAuth2 Client

프로젝트를 생성한 후, 필요한 라이브러리를 Maven 또는 Gradle을 통해 추가합니다.

3.1. 주요 의존성 추가 (pom.xml 예시)


<dependencies>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
    </dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-security</artifactId>
    </dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-data-jpa</artifactId>
    </dependency>
    <dependency>
        <groupId>com.h2database</groupId>
        <artifactId>h2</artifactId>
        <scope>runtime</scope>
    </dependency>
    <dependency>
        <groupId>org.springframework.security.oauth.boot</groupId>
        <artifactId>spring-security-oauth2-autoconfigure</artifactId>
    </dependency>
</dependencies>

4. 사용자 인증을 위한 OAuth2 설정

4.1. application.yml 설정

OAuth2를 사용할 외부 서비스 (예: Google, GitHub 등)에 대한 클라이언트 정보를 application.yml 파일에 설정합니다.


spring:
  security:
    oauth2:
      client:
        registration:
          google:
            client-id: YOUR_CLIENT_ID
            client-secret: YOUR_CLIENT_SECRET
            scope: profile, email
        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/v2/me

4.2. Security Configuration 설정

스프링 시큐리티를 설정하여 OAuth2 로그인 기능을 구현합니다.


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(authorizeRequests ->
                authorizeRequests
                    .antMatchers("/", "/login", "/perform_login").permitAll()
                    .anyRequest().authenticated()
            )
            .oauth2Login(oauth2 -> oauth2
                .loginPage("/login")
            );
    }
}

5. 로그인 및 로그아웃 기능 구현

5.1. Custom Login Page 만들기

HTML과 CSS를 이용하여 커스텀 로그인 페이지를 생성합니다. 예제는 다음과 같습니다:


<!DOCTYPE html>
<html lang="ko">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>로그인 페이지</title>
</head>
<body>
    <h1>로그인 페이지</h1>
    <a href="/oauth2/authorization/google">Google로 로그인</a>
</body>
</html>

5.2. 로그아웃 처리하기

로그아웃 기능을 설정하려면, 다음과 같이 SecurityConfig를 수정합니다.


@Override
protected void configure(HttpSecurity http) throws Exception {
    http
        .authorizeRequests(authorizeRequests ->
            authorizeRequests
                .antMatchers("/", "/login", "/perform_login").permitAll()
                .anyRequest().authenticated()
        )
        .oauth2Login(oauth2 -> oauth2
            .loginPage("/login")
        )
        .logout(logout -> logout
            .logoutUrl("/logout")
            .logoutSuccessUrl("/login?logout")
        );
}

6. 글쓰기 기능 구현

이제 사용자가 작성한 글을 데이터베이스에 저장하기 위한 기능을 구현합니다.

6.1. Entity 클래스 생성

글 작성자를 포함한 글(Post)을 위한 Entity 클래스를 생성합니다.


import javax.persistence.*;

@Entity
public class Post {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    private String title;
    private String content;

    @ManyToOne
    @JoinColumn(name = "author_id")
    private User author;

    // Getters and Setters
}

6.2. User Entity 생성


import javax.persistence.*;

@Entity
public class User {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    private String username;
    private String email;

    // Getters and Setters
}

6.3. Repository 및 Service 생성

글 작성을 위한 Repository와 Service 클래스를 생성합니다.


// PostRepository.java
import org.springframework.data.jpa.repository.JpaRepository;

public interface PostRepository extends JpaRepository<Post, Long> {
}

// PostService.java
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.List;

@Service
public class PostService {
    @Autowired
    private PostRepository postRepository;

    public List<Post> findAll() {
        return postRepository.findAll();
    }

    public Post save(Post post) {
        return postRepository.save(post);
    }
}

6.4. Controller 생성

사용자가 글을 작성하고 조회할 수 있도록 Controller를 생성합니다.


import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;

import java.util.List;

@RestController
@RequestMapping("/posts")
public class PostController {
    @Autowired
    private PostService postService;

    @GetMapping
    public List<Post> getAllPosts() {
        return postService.findAll();
    }

    @PostMapping
    public Post createPost(@RequestBody Post post) {
        return postService.save(post);
    }
}

7. 결론

이번 글에서는 스프링 부트를 이용한 백엔드 개발의 기초와 OAuth2를 활용한 사용자 인증 및 글쓰기 기능 구현 방법에 대해 알아보았습니다. OAuth2를 통해 다양한 소셜 미디어 로그인 기능을 쉽게 구현할 수 있으며, 사용자 친화적인 웹 어플리케이션 개발에 큰 도움이 될 것입니다. 다음 강좌에서는 프론트엔드와의 연동, 더 나아가 배포에 대한 내용을 다룰 예정입니다. 이 글이 도움이 되셨길 바라며, 질문 사항이 있으면 언제든지 댓글로 남겨주세요!