Spring Security는 Spring Framework 기반의 강력하고 유연한 인증(Authentication) 및 권한 부여(Authorization) 프레임워크입니다. 이는 애플리케이션의 보안을 간단하면서도 강력하게 구현할 수 있도록 도와줍니다.
인증 (Authentication)
사용자 또는 시스템의 신원을 확인하는 과정입니다.
예: 사용자 ID와 비밀번호 검증.
권한 부여 (Authorization)
인증된 사용자가 애플리케이션 내에서 어떤 리소스나 작업에 접근할 수 있는지 결정합니다.
예: 특정 API는 관리자만 접근 가능.
보안 정책
URL 패턴, 메서드 호출, 데이터 접근 등에 대한 접근 제어 정책을 제공합니다.
CSRF 보호
CSRF(Cross-Site Request Forgery) 공격을 방지하기 위한 기본적인 보호 기능을 제공합니다.
세션 관리
사용자 세션의 고유성 및 유효성을 관리합니다.
암호화
비밀번호 해싱 및 암호화를 위한 유틸리티를 제공합니다.
예: BCryptPasswordEncoder.
확장성
사용자 정의 보안 요구 사항을 구현할 수 있는 다양한 확장 포인트를 제공합니다.
HTTP 요청을 가로채고 인증 및 권한 부여를 처리합니다.
Spring Boot 3.x 이후에는 WebSecurityConfigurerAdapter가 더 이상 사용되지 않고, SecurityFilterChain을 사용한 DSL 기반 설정이 주로 사용됩니다.
인증 과정을 처리하는 핵심 컴포넌트입니다.
UserDetailsService 또는 AuthenticationProvider를 통해 사용자 인증을 수행합니다.
사용자 정보를 가져오는 데 사용됩니다.
보통 데이터베이스에서 사용자 정보를 조회하는 로직을 구현합니다.
비밀번호를 안전하게 저장하기 위해 암호화를 수행합니다.
Spring Security는 기본적으로 BCryptPasswordEncoder를 권장합니다.
현재 인증된 사용자의 정보를 저장합니다.
일반적으로 SecurityContextHolder를 통해 접근합니다.
다양한 보안 필터(예: UsernamePasswordAuthenticationFilter, BasicAuthenticationFilter)를 통해 요청 흐름을 제어합니다.
기본적인 보안 설정 (Spring Boot 3.x 기준)
@Configuration
@EnableWebSecurity
public class SecurityConfig {
@Bean
public SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception {
http
.csrf().disable() // CSRF 보호 비활성화 (테스트 시만)
.authorizeHttpRequests(auth -> auth
.requestMatchers("/auth/**").permitAll() // 인증 없이 접근 가능
.anyRequest().authenticated() // 그 외 요청은 인증 필요
)
.formLogin(login -> login
.loginPage("/login") // 커스텀 로그인 페이지 설정
.defaultSuccessUrl("/") // 로그인 성공 시 이동할 URL
.permitAll()
)
.logout(logout -> logout
.logoutUrl("/logout") // 로그아웃 URL
.logoutSuccessUrl("/login?logout") // 로그아웃 성공 시 이동 URL
.permitAll()
);
return http.build();
}
}