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

소개

스프링 부트(Spring Boot)는 스프링 프레임워크를 기반으로 한 강력한 백엔드 개발 도구입니다.
스프링 부트를 사용하면 신속하게 애플리케이션을 구축할 수 있으며, 복잡한 설정 없이도
다양한 기능을 제공 받습니다. 본 강좌에서는 스프링 시큐리티(Spring Security)를 활용하여
로그인, 로그아웃, 회원 가입 기능을 구현하는 방법을 배우겠습니다. 이 과정은
초보자부터 중급 개발자까지 모두에게 유익할 것입니다.

스프링 부트 및 스프링 시큐리티 개요

스프링 부트란?

스프링 부트는 스프링 프레임워크를 쉽게 사용하도록 도와주는 도구로, 기본 설정을 자동으로
구성해 줍니다. 이를 통해 개발자는 복잡한 XML 설정 없이 주로 애노테이션 기반으로
프로젝트를 구성할 수 있습니다. 스프링 부트는 다양한 스타터(Starter)를 제공하여
개발자가 원하는 라이브러리 및 의존성을 쉽게 추가할 수 있도록 지원합니다.

스프링 시큐리티란?

스프링 시큐리티는 스프링 기반 애플리케이션의 보안을 위해 설계된 강력하고 유연한 인증 및
권한 부여 프레임워크입니다. 본 프레임워크를 통해 애플리케이션의 로그인, 회원 가입, 권한
체크 등을 쉽게 구현할 수 있습니다. 스프링 시큐리티는 다양한 인증 방식(예: 폼 기반
로그인, OAuth2 등)을 지원합니다.

프로젝트 생성 및 의존성 추가

스프링 부트 기반의 프로젝트를 생성하려면 다음 단계를 따라주세요.

  1. Spring Initializr를 사용하여 새 프로젝트 생성하기:

    Web, Spring Security, JPA 및 H2 Database를 포함한 Gradle 기반의 프로젝트를 생성합니다.

  2. build.gradle 의존성 추가:

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

회원 가입 구현

회원 가입 기능을 구현하기 위해서는 다음 단계를 따라주세요.

  1. 회원 엔티티 생성하기:

                        @Entity
                        public class User {
                            @Id
                            @GeneratedValue(strategy = GenerationType.IDENTITY)
                            private Long id;
                            private String username;
                            private String password;
                            private String email;
                            // getters and setters
                        }
                        
  2. 회원 Repository 인터페이스 생성하기:

                        public interface UserRepository extends JpaRepository {
                            Optional findByUsername(String username);
                        }
                        
  3. 회원 가입 서비스 구현하기:

                        @Service
                        public class UserService {
                            @Autowired
                            private UserRepository userRepository;
    
                            public void registerNewUser(User user) {
                                // 비밀번호 암호화 및 사용자 저장 로직
                                user.setPassword(passwordEncoder.encode(user.getPassword()));
                                userRepository.save(user);
                            }
                        }
                        

로그인 및 로그아웃 구현

로그인 및 로그아웃 기능을 구현하기 위해 다음 단계를 따라주세요.

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

                        @Configuration
                        @EnableWebSecurity
                        public class SecurityConfig extends WebSecurityConfigurerAdapter {
                            @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();
                            }
                        }
                        
  2. 로그인 및 회원 가입 컨트롤러 구현하기:

                        @Controller
                        public class AuthController {
                            @Autowired
                            private UserService userService;
    
                            @GetMapping("/register")
                            public String showRegistrationForm(Model model) {
                                model.addAttribute("user", new User());
                                return "register";
                            }
    
                            @PostMapping("/register")
                            public String registerUser(@ModelAttribute User user) {
                                userService.registerNewUser(user);
                                return "redirect:/login";
                            }
    
                            @GetMapping("/login")
                            public String showLoginForm() {
                                return "login";
                            }
                        }
                        

최종 설정 및 테스트

위의 단계들을 완료한 후, 다음과 같은 설정을 적용하고 테스트를 진행합니다:

  1. application.properties 설정:

                        spring.h2.console.enabled=true
                        spring.datasource.url=jdbc:h2:mem:testdb
                        spring.datasource.driverClassName=org.h2.Driver
                        spring.datasource.username=sa
                        spring.datasource.password=password
                        
  2. 애플리케이션 실행 및 테스트:

    애플리케이션을 실행하고, /register에서 회원 가입을 시도한 후 /login 페이지로 이동하여 로그인 과정을 테스트합니다.

마무리

지금까지 스프링 부트와 스프링 시큐리티를 사용하여 회원 가입과 로그인/로그아웃 절차를
구현하는 방법에 대해 알아보았습니다. 이 과정을 통해 기본적인 인증 시스템을 구축할 수
있었길 바랍니다. 스프링 프레임워크는 매우 다재다능하며, 이를 통해 더욱 복잡한 시스템을
구축하는 것도 가능합니다. 추가적으로 JWT(제이슨 웹 토큰) 인증 방식 등 더 많은 보안 조치를
고려해보는 것도 좋은 경험이 될 것입니다.

© 2023 스프링 부트 백엔드 개발 강좌