Spring Security 기본 설정 및 내부 흐름 정리
Spring Security를 사용하여 애플리케이션의 보안을 설정하는 방법과 내부적인 인증 및 인가 과정을 간략히 정리해 보았습니다. 이 글은 Spring Boot 3.x와 Spring Security 6.x 버전을 기준으로 작성되었습니다.
groovy
코드 복사
implementation 'org.springframework.boot:spring-boot-starter-security'
2. 기본 보안 설정
Spring Security 3.0 이상에서는 SecurityFilterChain 빈을 사용하여 보안 구성을 수행합니다. 예시 코드는 다음과 같습니다.
java
코드 복사
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.core.userdetails.User;
import org.springframework.security.core.userdetails.UserDetailsService;
import org.springframework.security.provisioning.InMemoryUserDetailsManager;
import org.springframework.security.web.SecurityFilterChain;
import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;
import org.springframework.security.crypto.password.PasswordEncoder;
@Configuration
public class SecurityConfig {
@Bean
public SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception {
http
.authorizeHttpRequests(authorize -> authorize
.requestMatchers("/", "/home").permitAll()
.anyRequest().authenticated()
)
.formLogin(form -> form
.loginPage("/login")
.permitAll()
)
.logout(logout -> logout
.permitAll()
);
return http.build();
}
@Bean
public UserDetailsService userDetailsService() {
UserDetails user = User.builder()
.username("user")
.password(passwordEncoder().encode("password"))
.roles("USER")
.build();
return new InMemoryUserDetailsManager(user);
}
@Bean
public PasswordEncoder passwordEncoder() {
return new BCryptPasswordEncoder();
}
}
3. 사용자 정의 로그인 페이지
사용자 정의 로그인 페이지를 설정하기 위해서는 다음과 같은 컨트롤러와 HTML 파일을 준비해야 합니다.
LoginController.java
java
코드 복사
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
@Controller
public class LoginController {
@GetMapping("/login")
public String login() {
return "login";
}
}
login.html
html
코드 복사
1) 요청(Request)
사용자가 웹 애플리케이션에 요청을 보냅니다.
2) 필터 체인(FilterChainProxy)
요청은 FilterChainProxy를 통해 여러 보안 필터를 거칩니다. 중요한 필터는 SecurityContextPersistenceFilter, UsernamePasswordAuthenticationFilter, BasicAuthenticationFilter, AuthorizationFilter 등이 있습니다.
3) SecurityContext
SecurityContext는 현재 사용자에 대한 보안 정보를 저장합니다.
4) AuthenticationManager 및 AuthenticationProvider
AuthenticationManager는 인증을 주관하며, AuthenticationProvider를 통해 실제 인증을 수행합니다.
5) UserDetailsService
UserDetailsService는 사용자 정보를 로드하는 역할을 합니다. 주로 데이터베이스나 메모리에서 사용자 정보를 조회합니다.
6) 인증(Authentication)
인증이 성공하면 Authentication 객체가 SecurityContext에 저장됩니다.
7) 인가(Authorization)
인증 후, 사용자가 요청한 자원에 접근할 권한이 있는지 확인합니다.
8) 응답(Response)
인증과 인가가 완료되면 요청한 자원에 대한 접근이 허용되고, 서버는 응답을 반환합니다.
5. Spring Security 필터
Spring Security에서 사용하는 주요 필터는 다음과 같습니다.
UsernamePasswordAuthenticationFilter: 사용자의 로그인 요청을 처리.
BasicAuthenticationFilter: HTTP 기본 인증 처리.
SecurityContextPersistenceFilter: SecurityContext 관리.
AuthorizationFilter: 권한 부여 처리.
6. 마무리
Spring Security는 강력한 보안 프레임워크로, 애플리케이션의 인증 및 권한 관리를 간편하게 할 수 있도록 도와줍니다. 이번 포스트에서는 기본적인 설정과 내부 흐름을 알아보았으며, 이를 바탕으로 다양한 보안 시나리오에 맞게 Spring Security를 활용해 보시길 바랍니다.