스프링 부트 백엔드 개발 강좌, 스프링 시큐리티로 로그인 로그아웃, 회원 가입 구현, 시큐리티 설정하기

안녕하세요, 이번 강좌에서는 스프링 부트를 이용하여 백엔드 개발을 하고, 특히 스프링 시큐리티를 활용한 로그인 및 회원 가입 기능을 구현하는 방법에 대해 자세히 알아보겠습니다. 이 강좌는 초급자와 중급자 모두를 위한 내용으로 구성되어 있으며, 실습을 통해 이해를 돕고자 합니다.

1. 스프링 부트란?

스프링 부트(Spring Boot)는 스프링 프레임워크를 기반으로 한 피쳐로, 복잡한 설정 없이 빠르게 애플리케이션을 개발할 수 있도록 돕습니다. 기본적으로 설정을 자동으로 해주고, 그 덕분에 생산성을 높이고 배포를 쉽게 할 수 있습니다.

1.1 스프링 부트의 특징

  • 자동 설정: 개발자가 직접 설정하지 않아도 필요한 설정을 자동으로 제공합니다.
  • 의존성 관리: Maven 또는 Gradle을 통해 필요한 라이브러리를 손쉽게 관리할 수 있습니다.
  • 외부 설정: 프로퍼티 파일을 외부에 두고 관리할 수 있어 환경에 따라 설정을 쉽게 바꿀 수 있습니다.
  • 독립 실행형: 내장 서버를 제공하므로, 별도의 서버에 배포하지 않고도 애플리케이션을 실행할 수 있습니다.

2. 스프링 시큐리티란?

스프링 시큐리티(Spring Security)는 스프링 애플리케이션을 위한 인증과 권한 부여 기능을 제공하는 강력한 프레임워크입니다. 이 라이브러리를 사용하면 로그인 기능, 사용자 권한 관리, 보안 필터링 등을 쉽게 구현할 수 있습니다.

2.1 스프링 시큐리티의 주요 개념

  • Authentication: 사용자의 신원 확인 (로그인).
  • Authorization: 인증된 사용자에게 특정 자원에 대한 접근 권한 부여.
  • Security Filter Chain: 요청을 가로채고, 보안 정책을 적용하기 위한 필터 체인.

3. 개발 환경 설정

스프링 부트 애플리케이션을 개발하기 위해 기본적인 개발 환경을 설정해야 합니다. 아래는 필요한 도구들입니다:

  • Java Development Kit (JDK) 11 이상
  • IDE: IntelliJ IDEA, Eclipse 등
  • Maven 또는 Gradle
  • Git (선택 사항)

3.1 프로젝트 구조


    my-spring-boot-app
    ├── src
    │   ├── main
    │   │   ├── java
    │   │   │   └── com
    │   │   │       └── example
    │   │   │           └── demo
    │   │   │               ├── DemoApplication.java
    │   │   │               └── security
    │   │   │                   └── SecurityConfig.java
    │   │   ├── resources
    │   │   │   ├── application.properties
    │   └── test
    └── pom.xml
    

4. 스프링 부트 애플리케이션 만들기

아래 단계에 따라 스프링 부트 애플리케이션을 생성하세요.

4.1 Spring Initializr 활용하기

Spring Initializr에 접속하여 아래와 같은 설정으로 프로젝트를 생성합니다:

  • Project: Maven Project
  • Language: Java
  • Spring Boot: 2.5.4 (또는 최신 버전)
  • Group: com.example
  • Artifact: demo
  • Dependencies: Spring Web, Spring Security, Spring Data JPA, H2 Database

4.2 생성된 프로젝트 다운로드 후 IDE에서 열기

생성된 프로젝트 zip 파일을 다운로드 받고, IDE에서 엽니다. 그러면 기본적인 스프링 부트 애플리케이션 구조가 설정된 것을 볼 수 있습니다.

5. 회원 가입 기능 구현하기

이제 회원 가입 기능을 구현해 보겠습니다. 사용자가 회원가입을 할 수 있도록 등록 양식과 로그인을 위한 엔드포인트를 설정합니다.

5.1 회원 가입 DTO 만들기


    package com.example.demo.dto;

    public class SignUpDto {
        private String username;
        private String password;
        private String email;

        // Getters and Setters
    }
    

5.2 회원 가입 서비스 만들기


    package com.example.demo.service;

    import com.example.demo.dto.SignUpDto;
    import com.example.demo.entity.User;

    public interface UserService {
        User registerNewUserAccount(SignUpDto signUpDto);
    }
    

5.3 User Entity 생성하기


    package com.example.demo.entity;

    import javax.persistence.*;

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

        private String username;
        private String password;

        @Column(unique = true)
        private String email;

        // Getters and Setters
    }
    

6. 스프링 시큐리티 설정하기

스프링 시큐리티를 설정하여 사용자 인증 및 권한 관리를 구현합니다.

6.1 SecurityConfig 클래스 생성하기


    package com.example.demo.security;

    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
                .csrf().disable()
                .authorizeRequests()
                .antMatchers("/signup", "/").permitAll()
                .anyRequest().authenticated()
                .and()
                .formLogin()
                .loginPage("/login")
                .permitAll()
                .and()
                .logout()
                .permitAll();
        }
    }
    

6.2 로그인, 로그아웃 엔드포인트 구현하기


    package com.example.demo.controller;

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

    @Controller
    public class AuthController {

        @GetMapping("/login")
        public String login() {
            return "login";
        }

        @GetMapping("/signup")
        public String signup() {
            return "signup";
        }
    }
    

7. 결론

이번 강좌에서는 스프링 부트를 활용하여 간단한 백엔드 애플리케이션을 개발하고, 스프링 시큐리티를 통하여 사용자 인증 및 회원 가입 기능을 구현하는 방법을 배웠습니다. 실제로 프로젝트에 적용하고, 실습을 통해 더 나아가볼 수 있습니다.

추가 참고 자료