- Spring Security 를 Spring boot 에서 처음 설정하고 로그창을 보면 이런 내용이 나온다
Using generated security password: 7844c50b-9523-4d49-b9d0-d161515dc187 This generated password is for development use only. Your security configuration must be updated before running your application in production
- 이건 왜 뜨는걸까, 그냥 의문이 들어서 대충 분석해봤다.
- 위 로그가 뜨는 파일은
UserDetailsServiceAutoConfiguration
이라는 클래스이다. - 해당 클래스는 Spring Security가 아니라 Spring Boot 에서 제공하는 자동 설정 파일이다.
- 해당 설정은 그러면 언제 자동으로 실행되는가?
UserDetailsServiceAutoConfiguration.java
파일을 분석해보자 ConditionalOnMissingClass
에 해당하는 Bean이 등록되지 않으면 실행되는 조건으로 설정되어 있는 것으로 볼 수 있다.
@ConditionalOnClass(AuthenticationManager.class) @ConditionalOnMissingClass({ "org.springframework.security.oauth2.client.registration.ClientRegistrationRepository", "org.springframework.security.oauth2.server.resource.introspection.OpaqueTokenIntrospector", "org.springframework.security.saml2.provider.service.registration.RelyingPartyRegistrationRepository" }) @ConditionalOnBean(ObjectPostProcessor.class) @ConditionalOnMissingBean(value = { AuthenticationManager.class, AuthenticationProvider.class, UserDetailsService.class, AuthenticationManagerResolver.class }, type = "org.springframework.security.oauth2.jwt.JwtDecoder") public class UserDetailsServiceAutoConfiguration
보통 Security를 처음으로 설치하면 아래 4가지 클래스로 등록된 Bean이 당연히 없을 것이다. 그래서 위와 같이 로그가 뜨는 것이다.
얘네는 따로 등록하지 않으면 당연히 Bean 으로 찾을 수 없다.
참고로 코드 상으로는 Security의 User 프로퍼티가 제공되지 않으면, 자동으로 기본 값이 채워지는데 User 프로퍼티의 password가 따로 설정되지 않아도 마찬가지로 자동적으로 패스워드를 생성한다.
- UserDetailsService를 Bean으로 등록하거나
- 일반적으로 인증을 구현할 때 UserDetailsService를 당연하게도 보통 구현한다.
- AuthenticationManager를 Bean으로 등록하거나 하면 된다.
- AuthenticationManager는 결국 인터페이스이므로, 이를 구현한 ProviderManager(대표적인 구현체)를 쓰거나 하면 된다.
- 이를 위해 WebSecurityConfigurerAdapter를 쓰면 되지만, 이는 스프링 시큐리티 5.7.0-M2 버전 부터 Deprecated 되어서WebSecurityCustomizer Bean을 구현하면 된다.
@Bean fun webSecurityCustomizer(): WebSecurityCustomizer { return WebSecurityCustomizer { web -> web.ignoring().requestMatchers("/auth/**") } }
요약
요약: 인증 설정을 안해서 자동으로 뜨는 것