Spring-Security
SecurityFilterChain 등록 / 사용자 설정
neal89
2025. 5. 20. 08:54
✅ 요약: SecurityFilterChain 커스터마이징 시 자동 설정 무효화
🔸 핵심 개념
- SecurityFilterChain 빈을 직접 등록하면, Spring Boot의 기본 보안 설정(자동 설정)은 적용되지 않습니다.
- 이유: Spring Security의 **자동 설정 조건(@ConditionalOnMissingBean)**이 깨지기 때문입니다.
- 따라서, 개발자가 필터 체인을 명시적으로 구성하면, 모든 설정(로그인, 인증 방식, 패스워드 정책 등)을 직접 지정해야 합니다.
✅ 기본 동작: 자동 Security 설정
아무 설정도 하지 않으면, Spring Boot는 다음과 같은 기본 보안을 제공합니다:
- 모든 요청은 인증 필요
- 기본 로그인 페이지 제공
- 기본 사용자 계정 생성: user / password는 UUID로 매번 변경되어 콘솔에 출력됨
Using generated security password: 9d1a5b2e-2182-4a4d-b42d-5f7a8d2c6f58
✅ 문제점
기본 계정이 매번 바뀌므로 로그인 시 불편함. 이를 해결하기 위해 사용자 계정을 명시적으로 설정할 수 있음.
✅ 해결 방법 1: application.yml 또는 application.properties
# application.yml
spring:
security:
user:
name: teo
password: 1234
이렇게 하면 자동 설정을 유지하면서도 고정된 계정으로 로그인할 수 있습니다.
✅ 해결 방법 2: Java 설정으로 직접 UserDetailsService 등록
@Configuration
public class SecurityConfig {
@Bean
public SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception {
http
.authorizeHttpRequests(auth -> auth.anyRequest().authenticated())
.formLogin(Customizer.withDefaults());
return http.build();
}
@Bean
public UserDetailsService userDetailsService() {
UserDetails user = User.builder()
.username("teo")
.password("{noop}1234") // 비밀번호 암호화 없이 저장 (noop)
.roles("USER")
.build();
return new InMemoryUserDetailsManager(user);
}
}
- {noop}은 비밀번호를 암호화하지 않겠다는 의미입니다.
- UserDetailsService를 직접 등록함으로써, 기본 사용자 생성 설정은 자동으로 비활성화됩니다.