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

이번 강좌에서는 스프링 부트를 사용하여 백엔드 애플리케이션을 개발하는 방법을 배워보겠습니다. 특히, 스프링 시큐리티를 활용한 로그인/로그아웃 기능과 회원 가입 시스템을 구현하고, 뷰 작성하는 데 필요한 내용들을 다룰 것입니다. 이 과정을 통해 웹 애플리케이션의 기본 구조와 보안적인 측면에 대해 이해할 수 있게 될 것입니다.

1. 스프링 부트 소개

스프링 부트(Spring Boot)는 자바 기반의 프레임워크로, 간단하고 빠르게 스프링 애플리케이션을 개발할 수 있는 도구입니다. 스프링 부트는 전통적인 스프링 개발에서 자주 발생하는 복잡한 설정들을 간소화하여, 개발자가 비즈니스 로직에 집중할 수 있도록 해줍니다.

1.1 스프링 부트의 장점

  • 자동 구성: 스프링 부트는 애플리케이션을 실행할 때 필요한 설정을 자동으로 구성합니다.
  • 독립 실행형: 스프링 부트 애플리케이션은 내장형 톰캣 서버를 포함하여 독립적으로 실행될 수 있습니다.
  • 편리한 의존성 관리: Maven 또는 Gradle을 통해 라이브러리 의존성을 쉽게 관리할 수 있습니다.

2. 스프링 시큐리티로 보안 설정하기

스프링 시큐리티(Spring Security)는 스프링 기반 애플리케이션의 보안을 위한 강력한 인증 및 권한 부여 기능을 제공합니다. 이번 섹션에서는 스프링 시큐리티를 설정하고 로그인, 로그아웃 기능을 구현하는 방법을 배워보겠습니다.

2.1 의존성 추가하기

스프링 시큐리티를 사용하기 위해, build.gradle 파일에 다음과 같은 의존성을 추가합니다:

dependencies {
    implementation 'org.springframework.boot:spring-boot-starter-security'
    implementation 'org.springframework.boot:spring-boot-starter-data-jpa'
    implementation 'org.springframework.boot:spring-boot-starter-web'
    runtimeOnly 'com.h2database:h2'
}

2.2 스프링 시큐리티 설정 클래스 작성하기

스프링 시큐리티 설정을 위해 SecurityConfig 클래스를 작성합니다. 아래 코드는 기본적인 로그인 및 로그아웃 설정을 포함합니다:

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.security.config.annotation.authentication.builders.AuthenticationManagerBuilder;
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;
import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;
import org.springframework.security.crypto.password.PasswordEncoder;

@Configuration
@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter {

    @Override
    protected void configure(AuthenticationManagerBuilder auth) throws Exception {
        auth.inMemoryAuthentication()
            .withUser("user").password(passwordEncoder().encode("password")).roles("USER")
            .and()
            .withUser("admin").password(passwordEncoder().encode("admin")).roles("ADMIN");
    }

    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http
            .authorizeRequests()
                .antMatchers("/", "/register").permitAll()
                .anyRequest().authenticated()
                .and()
            .formLogin()
                .loginPage("/login")
                .permitAll()
                .and()
            .logout()
                .permitAll();
    }

    @Bean
    public PasswordEncoder passwordEncoder() {
        return new BCryptPasswordEncoder();
    }
}

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

회원 가입 기능을 구현하기 위해 사용자 정보를 저장할 엔티티와 DB 연동을 위한 리포지토리를 생성합니다. 그 후, 회원 가입 처리를 위한 컨트롤러를 만들어 보겠습니다.

3.1 User 엔티티 생성하기

User 정보를 저장하기 위한 User 클래스를 작성합니다:

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 username;
    private String password;
    private String email;

    // getters and setters
}

3.2 UserRepository 작성하기

JPA를 사용하여 User 정보를 관리하기 위한 리포지토리를 생성합니다:

import org.springframework.data.jpa.repository.JpaRepository;

public interface UserRepository extends JpaRepository {
    User findByUsername(String username);
}

3.3 회원 가입 폼 및 컨트롤러 작성하기

회원 가입을 위한 HTML 폼을 작성하고 이를 처리하는 컨트롤러를 만듭니다. RegisterController를 생성하여 회원 가입 요청을 처리합니다:

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;

@Controller
@RequestMapping("/register")
public class RegisterController {

    @Autowired
    private UserRepository userRepository;

    @GetMapping
    public String showRegisterForm(Model model) {
        model.addAttribute("user", new User());
        return "register";
    }

    @PostMapping
    public String registerUser(User user) {
        user.setPassword(new BCryptPasswordEncoder().encode(user.getPassword()));
        userRepository.save(user);
        return "redirect:/login";
    }
}

3.4 회원 가입 HTML 폼 작성하기

회원 가입을 위한 폼을 작성합니다:





    회원가입


    

회원가입




4. 로그인/로그아웃 기능 구현하기

로그인 및 로그아웃 기능을 구현하여 사용자가 안전하게 시스템에 접근할 수 있도록 합니다.

4.1 로그인 HTML 폼 작성하기

로그인 폼을 작성합니다:





    로그인


    

로그인



4.2 로그아웃 처리하기

로그아웃 기능은 스프링 시큐리티에서 기본적으로 제공되는 기능으로, 로그아웃 URL을 지정하고 이를 통해 로그아웃 처리가 됩니다. 기본적으로 /logout 경로를 사용합니다.

5. 뷰 작성하기

이제 회원 가입 및 로그인 기능을 구현했으니, 사용자에게 보여질 뷰를 작성합니다. 스프링 부트를 사용할 때는 주로 Thymeleaf라는 템플릿 엔진을 사용합니다.

5.1 Thymeleaf 설정하기

Thymeleaf를 사용하려면 build.gradle 파일에 다음 의존성을 추가합니다:

dependencies {
    implementation 'org.springframework.boot:spring-boot-starter-thymeleaf'
}

5.2 기본 홈 페이지 만들기

홈 페이지를 표시하기 위한 컨트롤러와 뷰를 작성합니다. 아래는 홈 페이지를 나타내는 HTML 코드입니다:





    


    

홈 페이지

안녕하세요, 사용자님! 로그아웃

로그인
회원가입

6. 마무리

이렇게 하여 스프링 부트를 사용하여 간단한 회원 가입 및 로그인/로그아웃 기능을 가진 웹 애플리케이션을 구축했습니다. 프로젝트를 통해 스프링 부트의 기본적인 사용법과 스프링 시큐리티를 활용한 보안 기능 구현에 대해 이해할 수 있습니다.

6.1 다음 단계

이제 더 복잡한 기능을 추가해 보거나, RESTful API를 개발하여 프론트엔드와 통신하는 방식으로 확장해 볼 수 있습니다. 모바일 애플리케이션이나 다른 클라이언트와의 통합을 고려해보는 것도 좋습니다. 필요하다면 OAuth2와 같은 외부 인증 서비스를 연동하는 것도 좋은 방향입니다.

6.2 추가 자료

더 많은 정보를 원하신다면, 공식 스프링 부트 문서와 스프링 시큐리티 문서를 참조하시기 바랍니다: