[Spring Security] 기본 동작 구조 이해

WOOK JONG KIM·2022년 11월 27일
0

패캠_java&Spring

목록 보기
70/103
post-thumbnail

스프링 시큐리티 동작 구조

Spring Security의 의존성을 추가한 경우 위와 같이 WebSecurityConfigurerAdapter클래스가 실행되게 됨

WebSecurityConfigurerAdapter클래스는 스프링 시큐리티의 웹 보안 기능의 초기화 및 설정들을 담당하는 내용이 담겨있으며 내부 적으로 getHttp()메서드가 실행될 때 HTTPSecurity 클래스를 생성
-> 이때 HTTPSecurity는 인증/인가 API들의 설정을 제공

//WebSecurityConfigureAdapter.java

    protected final HttpSecurity getHttp() throws Exception {
		if (this.http != null) {
			return this.http;
		}    
		.....
        
        	if (!this.disableDefaults) {
			applyDefaultConfiguration(this.http); // defualt Configuration 적용	
            		.....   
                    
		}
		configure(this.http);
        // 이곳의 configure 메서드를 override하면 우리가 원하는 보안체계를 만들 수 있습니다.
		return this.http;
	}

	// 기본적으로 적용되는 filter들을 포함한 configuration 대한 메서드
	private void applyDefaultConfiguration(HttpSecurity http) throws Exception {
		http.csrf();
		http.addFilter(new WebAsyncManagerIntegrationFilter());
		http.exceptionHandling();
		http.headers();
		http.sessionManagement();
		http.securityContext();
		http.requestCache();
		http.anonymous();
		http.servletApi();
		http.apply(new DefaultLoginPageConfigurer<>());
		http.logout();
	}

우리가 인증/인가의 설정을 바꾸고자 한다면 WebSecurityConfigurerAdapter클래스를 상속한 SecurityConfig클래스를 생성하여 configure(HttpSecurity http)메서드를 override하며 설정

protected void configure(HttpSecurity http) throws Exception {
		this.logger.debug("Using default configure(HttpSecurity). "
				+ "If subclassed this will potentially override subclass configure(HttpSecurity).");
		http.authorizeRequests((requests) -> requests.anyRequest().authenticated());
		http.formLogin();
		http.httpBasic();
	}

Override 예시

// 메인 홈페이지를 누구나 접근 하게 해주기 위해 풀어주는법
// 다른 페이지는 인증을 통해
    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http.authorizeRequests((requests) ->
                requests.antMatchers("/").permitAll()
                        .anyRequest().authenticated());
        http.formLogin();
        http.httpBasic();
    }

사용자 정의 보안 기능 구현하기

앞서 말했듯이 우리가 인증/인가의 설정을 바꾸고자 한다면 아래와 같아 WebSecurityConfigurerAdapter를 상속한 SecurityConfig클래스를 생성하여 configure(HttpSecurity http)메서드를 override하며 설정해야 함

@Configuration
@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter {

    @Autowired
    UserDetailsService userDetailsService;

    @Override
    protected void configure(HttpSecurity http) throws Exception {
        // 인가 정책 설정
        http
                .authorizeRequests() // 요청에 대한 보안 검사 실행
                .anyRequest().authenticated(); // 어떠한 요청에도 인증을 받도록 설정
        
        // 인증 정책 설정
        http
                .formLogin(); // formLogin인증 방식을 사용하도록 설정
    }
}
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;

}

위의 SecurityConfig에 붙은 @EnableWebSecurity을 보면 WebSecurityConfiguration.class, SpringWebMvcImportSelector.class, OAuth2ImportSelector.class, HttpSecurityConfiguration.class들을 import해서 실행
-> 해당 annotation을 붙여야지 Securiry를 활성화

profile
Journey for Backend Developer

0개의 댓글