참조사이트 1
@EnableWebSecurity는 URL이 스프링 시큐리티의 제어를 받도록 만드는 어노테이션이다.
@EnableWebSecurity 어노테이션을 사용하면 내부적으로 SpringSecurityFilterChain이 동작하여 URL 필터가 적용된다. 스프링 시큐리티의 세부 설정은 SecurityFilterChain 빈을 생성하여 설정할 수 있다.
공식문서에는 시큐리티 설정은 이렇게 짜는것이라고 예시가 되어있는데
Add this annotation to an @Configuration class to have the Spring Security configuration defined in any WebSecurityConfigurer or more likely by exposing a SecurityFilterChain bean:
@Configuration
@EnableWebSecurity
public class MyWebSecurityConfiguration {
@Bean
public WebSecurityCustomizer webSecurityCustomizer() {
return (web) -> web.ignoring()
// Spring Security should completely ignore URLs starting with /resources/
.antMatchers("/resources/**");
}
@Bean
public SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception {
http.authorizeRequests().antMatchers("/public/**").permitAll().anyRequest()
.hasRole("USER").and()
// Possibly more configuration ...
.formLogin() // enable form based log in
// set permitAll for all URLs associated with Form Login
.permitAll();
return http.build();
}
@Bean
public UserDetailsService userDetailsService() {
UserDetails user = User.withDefaultPasswordEncoder()
.username("user")
.password("password")
.roles("USER")
.build();
UserDetails admin = User.withDefaultPasswordEncoder()
.username("admin")
.password("password")
.roles("ADMIN", "USER")
.build();
return new InMemoryUserDetailsManager(user, admin);
}
// Possibly more bean methods ...
}
설명은 아래와 같다.
Add this annotation to an @Configuration class to have the Spring Security configuration defined in any WebSecurityConfigurer or more likely by exposing a SecurityFilterChain bean:
@EnableWebSecurity를 @Configuration 클래스에 추가하면, SecurityFilterChain 빈을 노출하여 모든 WebSecurityConfigurer에 SpringSecurity 구성이 정의되거나 더 가능성이 높아진다.
@EnableWebSecurity의 내부를 살펴보자
@Retention(RetentionPolicy.RUNTIME) @Target(ElementType.TYPE) @Documented @Import({ WebSecurityConfiguration.class, SpringWebMvcImportSelector.class, OAuth2ImportSelector.class, HttpSecurityConfiguration.class }) @EnableGlobalAuthentication @Configuration public @interface EnableWebSecurity { /** * Controls debugging support for Spring Security. Default is false. * @return if true, enables debug support with Spring Security */ boolean debug() default false; }
SpringWebMvcImportSelector, OAuth2ImportSelctor는 특정 클래스를 import 하는 Selector이다. 내부 코드를 살펴보면 WebMvcSecurityConfiguration에서 정보를 읽어서 적용시키거나 OAuth2와 관련된 ClientRegistration을 가져오는 것을 알 수 있다.
HttpSecurityConfiguration은 HttpSecurity Bean을 주입해주는 클래스이다.
WebSecurityConfiguration는 스프링 시큐리티 자동설정 중 가장 중요한 부분이다. 개발자가 등록한 SecurityFilterChain과 WebSecurityCustomizer를 WebSecurity 객체로 만들어준다. 내부 코드의 양이 많아서 가져오지는 않았지만, Adapter를 등록하고 개발자가 등록한 SecurityFiterChain 빈들을 받아와 FilterInterceptor, WebSecurityCustomizer.customize와 같은 동작들을 수행한 뒤 WebSecurity 객체를 생성한다.
마지막으로 WebSecurity는 WebSecurityConfiguration에서 SpringSecurityFilterChain(springSecurityFilterChain)으로 알려진 FilterChainProxy를 생성하기 위해 생성된다. FilterChainProxy는 고정된 빈 이름(bean name)으로 springSecurityFilterChain이며 빈으로 등록된다.
WebSecurity 클래스는 FilterChainProxy를 만들어서 DelegatingFilterProxy의 실제 처리를 담당한다.
@Retention, @Target, @Component 설명?
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.TYPE)
@Import, @Configuration설명?
@Import({ WebSecurityConfiguration.class, SpringWebMvcImportSelector.class, OAuth2ImportSelector.class,
HttpSecurityConfiguration.class })
@Configuration
참조사이트1
@Documented
@Documented이 없을때와
어노테이션을 추가하는 데 사용되는 사용자 지정 어노테이션은 설명서에 표시되지 않으며 아래 표시된 스냅숏에 표시됩니다.
어노테이션을 추가하는 데 사용되는 사용자 지정 어노테이션은 @Documented 어노테이션을 사용했기 때문에 설명서에 표시됩니다 아래 표시된 스냅숏에 표시됩니다.
@Documented이 있을때