스프링 부트 백엔드 개발 강좌, OAuth2로 로그인 로그아웃 구현, 의존성 추가하기

저자: 조광형

날짜: [현재 날짜]

1. 서론

현대 애플리케이션은 사용자 인증과 권한 부여를 위해 OAuth2 프로토콜을 많이 사용합니다. 이 프로토콜은 다양한 클라이언트 애플리케이션에서 안전하고 유연한 방식으로 사용자 정보를 처리할 수 있도록 도와줍니다. 본 강좌에서는 스프링 부트를 활용하여 OAuth2를 기반으로 한 로그인과 로그아웃 기능을 구현하는 방법을 단계별로 안내합니다.

2. 스프링 부트 프로젝트 시작하기

스프링 부트 프로젝트를 시작하기 위해서는 첫 단계로 Spring Initializr를 이용하여 기본 프로젝트 구조를 생성합니다. 다음은 초기 설정 절차입니다.

  1. 웹 브라우저를 열고 Spring Initializr에 접속합니다.
  2. 프로젝트 메타데이터를 설정합니다:
    • Project: Maven Project
    • Language: Java
    • Spring Boot: 최신 안정 버전
    • Group: com.example
    • Artifact: oauth2-demo
    • Name: oauth2-demo
    • Description: OAuth2 예제 애플리케이션
  3. Dependencies 섹션에서 다음 의존성을 추가합니다:
    • Spring Web
    • Spring Security
    • Spring Boot DevTools
    • Spring Data JPA
    • H2 Database (개발 및 테스트를 위한 인메모리 데이터베이스)
  4. ‘Generate’를 클릭하여 ZIP 파일을 다운로드하고, 이를 원하는 디렉터리에 압축 해제합니다.

3. 의존성 추가하기

이제 Maven의 pom.xml 파일을 열고 OAuth2 관련 의존성을 추가합니다. 다음 코드를 pom.xml의 `` 섹션에 추가하십시오.

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

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

                    <dependency>
                        <groupId>org.springframework.security</groupId>
                        <artifactId>spring-security-oauth2-jose</artifactId>
                    </dependency>
                
            

위의 의존성을 추가하면 OAuth2 클라이언트의 기본 설정을 사용할 수 있습니다. 그 다음으로는 JpaRepository를 사용하여 사용자 정보를 저장할 수 있는 엔티티를 생성해야 합니다.

4. 사용자 엔티티 및 리포지토리 설정하기

애플리케이션의 사용자 정보를 저장하기 위한 엔티티 클래스를 생성합니다. 아래 코드는 사용자 정보를 담을 User 엔티티의 예입니다.

                
                    package com.example.oauth2demo.model;

                    import javax.persistence.Entity;
                    import javax.persistence.GeneratedValue;
                    import javax.persistence.GenerationType;
                    import javax.persistence.Id;

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

                        private String email;
                        private String name;

                        // Getters and Setters
                    }
                
            

다음으로, User 엔티티에 대한 JpaRepository를 생성합니다.

                
                    package com.example.oauth2demo.repository;

                    import com.example.oauth2demo.model.User;
                    import org.springframework.data.jpa.repository.JpaRepository;

                    public interface UserRepository extends JpaRepository<User, Long> {
                        User findByEmail(String email);
                    }
                
            

5. OAuth2 설정하기

OAuth2 로그인 기능을 추가하기 위해, application.yml 파일에 OAuth2 클라이언트를 설정해야 합니다. 아래의 예시를 참고하세요.

                
                    spring:
                      security:
                        oauth2:
                          client:
                            registration:
                              google:
                                client-id: YOUR_CLIENT_ID
                                client-secret: YOUR_CLIENT_SECRET
                                scope:
                                  - email
                                  - profile
                            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-name-attribute: sub
                
            

여기에 본인의 Google API 클라이언트를 등록해야 합니다. Google Cloud Console에서 클라이언트를 생성하여 client-id와 client-secret을 얻을 수 있습니다.

6. 보안 구성하기

스프링 시큐리티를 설정하여 OAuth2 로그인과 로그아웃을 처리하는 방법을 다루겠습니다. SecurityConfig 클래스를 작성하고, HTTP 보안 관련 설정을 추가합니다.

                
                    package com.example.oauth2demo.config;

                    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()
                                    .antMatchers("/", "/login", "/oauth2/**").permitAll()
                                    .anyRequest().authenticated()
                                .and()
                                    .oauth2Login()
                                        .defaultSuccessUrl("/home", true)
                                .and()
                                    .logout()
                                        .logoutSuccessUrl("/");
                        }
                    }
                
            

이 설정을 통해 루트와 로그인 페이지, 그리고 OAuth2 관련 URL은 누구나 접근할 수 있으며, 인증된 사용자만 다른 페이지에 접근할 수 있도록 구성합니다.

7. 컨트롤러 작성하기

사용자가 OAuth2 로그인을 하고 나서 적절한 페이지로 리다이렉트되도록 컨트롤러를 작성해야 합니다. 아래는 기본적인 컨트롤러의 예입니다.

                
                    package com.example.oauth2demo.controller;

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

                    @Controller
                    public class MainController {
                        @GetMapping("/")
                        public String index() {
                            return "index"; // index.html 페이지 반환
                        }

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

이 컨트롤러는 기본 루트 경로와 home 경로를 위해 각각 index.html과 home.html 페이지를 반환합니다.

8. 뷰 템플릿 설정하기

Thymeleaf를 사용하여 View 템플릿을 설정합니다. resources/templates 폴더에 index.html과 home.html을 생성합니다. 아래는 각 파일의 샘플 코드입니다.

                
                    <!-- index.html -->
                    <!DOCTYPE html>
                    <html xmlns:th="http://www.thymeleaf.org">
                    <head>
                        <title>OAuth2 로그인 예제</title>
                    </head>
                    <body>
                        <h1>환영합니다!</h1>
                        <a th:href="@{/oauth2/authorization/google}">구글 로그인</a>
                    </body>
                    </html>
                
            
                
                    <!-- home.html -->
                    <!DOCTYPE html>
                    <html xmlns:th="http://www.thymeleaf.org">
                    <head>
                        <title>홈 화면</title>
                    </head>
                    <body>
                        <h1>홈에 오신 것을 환영합니다!</h1>
                        <a href="/logout">로그아웃</a>
                    </body>
                    </html>
                
            

9. 애플리케이션 실행하기

모든 설정이 완료되었다면 애플리케이션을 실행해보세요. IDE에서 메인 클래스를 실행하거나, 터미널에서 다음 명령어를 통해 실행할 수 있습니다.

                
                    mvn spring-boot:run
                
            

애플리케이션이 정상적으로 실행되면 웹 브라우저에서 http://localhost:8080에 접속하여 로그인 화면을 확인할 수 있습니다.

10. 결론

본 강좌에서는 스프링 부트를 이용한 OAuth2 로그인/로그아웃 기능의 구현 과정을 살펴보았습니다. 이 예제는 기본적인 설정에 대한 소개이며, 실제 프로젝트에서는 추가적인 보안 설정이나 사용자 데이터의 저장 및 관리를 고려해야 합니다. 여러분의 프로젝트에 맞는 방식으로 OAuth2를 확장하고 사용자 인증 기능을 구현해 보시길 바랍니다.

이 강좌가 도움이 되었기를 바랍니다. 질문이나 피드백은 댓글에 남겨주세요.