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를 직접 등록함으로써, 기본 사용자 생성 설정은 자동으로 비활성화됩니다.