[스프링(spring)]시큐리티는 어떻게 동작할까??(4/6) @EnableWebSecurity

allnight5·2023년 1월 5일
0

스프링

목록 보기
27/62

참조사이트 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이 있을때

profile
공부기록하기

0개의 댓글