스프링 시큐리티로 로그인/로그아웃, 회원 가입 구현
안녕하세요! 이번 강좌에서는 스프링 부트를 이용한 백엔드 개발에 대해 알아보겠습니다. 본 강좌의 주요 목표는 스프링 시큐리티를 사용하여 login/logout 및 회원 가입 기능을 구현하는 것입니다. 전체 과정은 다음과 같은 단계로 진행됩니다.
- 스프링 부트 프로젝트 설정
- 스프링 시큐리티 설정
- 회원가입 기능 구현
- 로그인 및 로그아웃 기능 구현
1. 스프링 부트 프로젝트 설정
먼저, 스프링 부트 프로젝트를 설정하겠습니다. [Spring Initializr](https://start.spring.io/)를 사용하여 프로젝트를 생성할 수 있습니다. 다음과 같은 설정을 선택해 주세요.
프로젝트 설정
- Project: Maven Project
- Language: Java
- Spring Boot: 2.5.x (최신 안정 버전 선택)
- Dependencies:
- Spring Web
- Spring Security
- Spring Data JPA
- H2 Database (개발 및 테스트 용도로 사용할 수 있는 인메모리 데이터베이스)
설정을 완료하면 GENERATE 버튼을 클릭하여 ZIP 파일을 다운로드 받을 수 있습니다. 다운로드한 후 압축을 해제하고 원하는 IDE로 프로젝트를 엽니다.
2. 스프링 시큐리티 설정
스프링 시큐리티를 설정하기 위해, SecurityConfig.java
클래스를 생성합니다. 이 클래스에서는 사용자의 인증 및 권한 부여를 위해 필요한 설정을 정의합니다.
package com.example.demo.config;
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");
}
@Override
protected void configure(HttpSecurity http) throws Exception {
http.csrf().disable()
.authorizeRequests()
.antMatchers("/register").permitAll()
.anyRequest().authenticated()
.and()
.formLogin()
.loginPage("/login")
.permitAll()
.and()
.logout()
.permitAll();
}
@Bean
public PasswordEncoder passwordEncoder() {
return new BCryptPasswordEncoder();
}
}
위 코드는 인메모리 사용자 저장소를 포함하여 사용자 인증 및 권한 부여를 설정하는 방법을 보여줍니다. BCryptPasswordEncoder를 사용하여 비밀번호를 암호화합니다.
3. 회원 가입 기능 구현
회원 가입 기능을 구현하기 위해, 사용자의 정보를 저장할 User
엔티티와 사용자 정보를 저장할 UserRepository
인터페이스를 작성합니다.
package com.example.demo.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 username;
private String password;
// getters and setters
}
package com.example.demo.repository;
import com.example.demo.model.User;
import org.springframework.data.jpa.repository.JpaRepository;
public interface UserRepository extends JpaRepository {
User findByUsername(String username);
}
다음으로, 회원가입을 처리할 서비스와 컨트롤러를 작성합니다.
package com.example.demo.service;
import com.example.demo.model.User;
import com.example.demo.repository.UserRepository;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.security.crypto.password.PasswordEncoder;
import org.springframework.stereotype.Service;
@Service
public class UserService {
@Autowired
private UserRepository userRepository;
@Autowired
private PasswordEncoder passwordEncoder;
public void register(User user) {
user.setPassword(passwordEncoder.encode(user.getPassword()));
userRepository.save(user);
}
}
package com.example.demo.controller;
import com.example.demo.model.User;
import com.example.demo.service.UserService;
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;
@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(User user) {
userService.register(user);
return "redirect:/login";
}
}
이제 회원가입을 위한 HTML 양식을 작성하겠습니다.
<!DOCTYPE html>
<html lang="ko">
<head>
<meta charset="UTF-8">
<title>회원가입</title>
</head>
<body>
<h1>회원가입</h1>
<form action="/register" method="post">
<label for="username">사용자 이름</label>
<input type="text" id="username" name="username" required><br>
<label for="password">비밀번호</label>
<input type="password" id="password" name="password" required><br>
<input type="submit" value="가입">
</form>
</body>
</html>
4. 로그인 및 로그아웃 기능 구현
이제 로그인 페이지와 로그아웃 기능을 구현하겠습니다. 로그인 페이지를 위해 다시 한 번 HTML을 작성합니다.
<!DOCTYPE html>
<html lang="ko">
<head>
<meta charset="UTF-8">
<title>로그인</title>
</head>
<body>
<h1>로그인</h1>
<form action="/login" method="post">
<label for="username">사용자 이름</label>
<input type="text" id="username" name="username" required><br>
<label for="password">비밀번호</label>
<input type="password" id="password" name="password" required><br>
<input type="submit" value="로그인">
</form>
<a href="/register">회원가입하기</a>
</body>
</html>
로그아웃 기능은 스프링 시큐리티가 기본적으로 제공하므로 별도의 추가 구현이 필요하지 않습니다. 로그아웃 킬을 호출하면 세션이 종료되고 로그인 페이지로 리다이렉트됩니다.
5. 마무리
이번 강좌를 통해 스프링 부트를 이용한 백엔드 개발의 기초를 다지며 스프링 시큐리티를 활용한 로그인, 로그아웃 및 회원가입 기능을 구현하는 방법을 배웠습니다. 이 과정은 여러분이 웹 애플리케이션에서 사용자 인증을 어떻게 처리하고 관리하는지 이해하는 데 도움이 될 것입니다. 앞으로 더 발전된 기능으로 나아가기 위한 기초를 확보하셨기를 바랍니다. 다음 강좌에서는 REST API 및 JWT 인증에 대해 알아보겠습니다.
감사합니다!