이번 강좌에서는 스프링 부트와 스프링 시큐리티를 활용한 백엔드 개발 방법을 알아보겠습니다. 주제는 로그인/로그아웃 및 회원 가입 구현으로 하며, 요구되는 사전 지식으로는 스프링 시큐리티의 기본 개념을 이해하고 있어야 합니다.
1. 스프링 부트 소개
스프링 부트는 스프링 프레임워크의 설정 및 배포를 단순화하기 위해 만들어진 프레임워크입니다. 기존 스프링의 복잡한 설정을 줄이고, 빠르게 애플리케이션을 개발할 수 있도록 도와줍니다. 스프링 부트를 사용하면 미리 설정된 규칙 및 구성 요소를 통해, 수많은 보일러플레이트 코드를 줄이고, 강력한 애플리케이션을 만드는 것이 훨씬 쉬워집니다.
스프링 부트는 여러 기능을 기본적으로 제공합니다. 예를 들어, 애플리케이션을 실행하기 위한 내장 서버, 자동 구성, 외부 설정 파일 관리 등을 포함하고 있습니다. 이러한 특징들은 개발자들이 애플리케이션의 비즈니스 로직에 더욱 집중할 수 있도록 만듭니다.
2. 스프링 시큐리티 개요
스프링 시큐리티는 Java 애플리케이션의 인증 및 인가를 위한 강력하고 사용자 정의 가능한 보안 프레임워크입니다. 스프링 시큐리티를 통해 애플리케이션의 접근 제어를 구현할 수 있으며, 사용자 인증, 권한 부여 및 보안 관련 기능을 쉽게 통합할 수 있습니다.
스프링 시큐리티의 주요 기능으로는 HTTP 기본 인증, 폼 기반 로그인, OAuth2.0 지원 및 여러 사용자 인증 제공자와의 통합 등을 들 수 있습니다. 이를 통해 인증 요구 사항에 맞는 유연한 통제를 할 수 있습니다.
3. 사전 지식: 스프링 시큐리티
이 강좌를 따라하기 위해서는 스프링 시큐리티의 기본 개념을 이해하고 있어야 합니다. 특히, 인증(Authentication)과 인가(Authorization)의 차이를 명확히 알고 있어야 합니다. 인증은 사용자가 누구인지 확인하는 과정인 반면, 인가는 사용자가 특정 리소스에 접근할 수 있는 권한이 있는지를 검증하는 과정입니다.
스프링 시큐리티는 필터 체인 구조를 가지고 있으며, 이를 통해 HTTP 요청을 처리하여 보안을 적용합니다. 보안 설정은 Java Config 클래스를 통해 구현되며, 사용자에 대한 인증 및 인가는 이 설정에 따라 작동합니다.
4. 프로젝트 설정
이번 강좌의 예제를 위해 IntelliJ IDEA 또는 Eclipse와 같은 IDE를 사용하여 스프링 부트 프로젝트를 생성하겠습니다. 프로젝트 생성 시 “Web”, “Security”, “JPA” 및 “H2″와 같은 의존성을 추가합니다.
org.springframework.boot
spring-boot-starter-security
org.springframework.boot
spring-boot-starter-data-jpa
com.h2database
h2
runtime
5. 데이터베이스 모델링
회원 가입 구현을 위해 사용자 정보를 저장할 User 엔티티를 정의합니다. 이 엔티티는 데이터베이스 테이블에 매핑되며, 사용자 이름, 비밀번호 및 역할 등의 속성을 가집니다.
import javax.persistence.*;
import java.util.Set;
@Entity
public class User {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
private String username;
private String password;
@ElementCollection(fetch = FetchType.EAGER)
private Set roles;
// 게터 및 세터
}
6. Spring Security 설정
Spring Security를 설정하기 위해 SecurityConfig 클래스를 생성합니다. 해당 클래스에서는 HTTP 요청에 대한 보안 설정 및 사용자 인증 서비스를 구성합니다.
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;
@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();
}
@Override
protected void configure(AuthenticationManagerBuilder auth) throws Exception {
auth.inMemoryAuthentication()
.withUser("user").password(passwordEncoder().encode("password")).roles("USER");
}
@Bean
public PasswordEncoder passwordEncoder() {
return new BCryptPasswordEncoder();
}
}
7. 로그인 및 회원 가입 화면 구현
Thymeleaf를 사용하여 로그인 페이지와 회원 가입 페이지를 구성합니다. 이들 페이지는 사용자에게 입력 폼을 제공하고, 사용자로부터 필요한 정보를 입력받습니다.
로그인 페이지
<!DOCTYPE html>
<html xmlns:th="http://www.thymeleaf.org">
<head>
<title>로그인</title>
</head>
<body>
<h1>로그인</h1>
<form th:action="@{/login}" method="post">
<label>사용자 이름</label>
<input type="text" name="username"/>
<label>비밀번호</label>
<input type="password" name="password"/>
<button type="submit">로그인</button>
</form>
</body>
</html>
회원 가입 페이지
<!DOCTYPE html>
<html xmlns:th="http://www.thymeleaf.org">
<head>
<title>회원 가입</title>
</head>
<body>
<h1>회원 가입</h1>
<form th:action="@{/register}" method="post">
<label>사용자 이름</label>
<input type="text" name="username"/>
<label>비밀번호</label>
<input type="password" name="password"/>
<button type="submit">회원 가입</button>
</form>
</body>
</html>
8. 회원 가입 로직 구현
회원 가입 기능을 위해 UserController를 생성하여 요청을 처리합니다. 이 컨트롤러에서는 사용자의 입력을 받아 새로운 사용자를 생성하고, 데이터베이스에 저장합니다.
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.security.crypto.password.PasswordEncoder;
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.RequestParam;
@Controller
public class UserController {
@Autowired
private UserRepository userRepository;
@Autowired
private PasswordEncoder passwordEncoder;
@GetMapping("/register")
public String showRegistrationForm(Model model) {
return "register";
}
@PostMapping("/register")
public String registerUser(@RequestParam String username, @RequestParam String password) {
User user = new User();
user.setUsername(username);
user.setPassword(passwordEncoder.encode(password));
user.getRoles().add("USER");
userRepository.save(user);
return "redirect:/login";
}
}
9. 애플리케이션 실행
모든 설정이 완료되었으면 애플리케이션을 실행합니다. 브라우저를 열고, 로그인 페이지에 접속하여 그동안 구현한 기능을 테스트합니다. 회원 가입 페이지에서 사용자를 등록하고, 성공적으로 로그인되는지 확인합니다.
10. 결론
이번 강좌를 통해 스프링 부트와 스프링 시큐리티를 활용하여 기본적인 로그인 및 회원 가입 기능을 구현하는 방법을 배웠습니다. 스프링 시큐리티는 강력한 보안 프레임워크로, 이를 활용하여 다양한 인증 및 인가 시나리오를 설계할 수 있습니다. 앞으로 더 발전된 기능을 추가하여 애플리케이션의 보안을 강화해 나가는 것이 중요합니다.