본문 바로가기
Spring Boot/Spring Security

[Spring Security][v5.7+] 설정 정리

by Lee David 2022. 10. 17.
반응형
왜 v5.7 버전 이상에서는 새로운 설정을 진행하는건가요?

WebSecurityConfigurerAdapter를 상속받아 사용하게 되는 spring security 설정에서 component를 bean으로 등록하는 방식으로 특정 class의 의존성을 줄이고 필요한 bean 등을 블럭의 형태와 같이 필요로한 클래스들을 제정의 하여 사용하기 위해 버전이 올라가면서 구성이 변경 되었습니다.

WebSecurityConfigurerAdapter class를 사용하여도 현재까지는 크게 이슈는 없지만 향후 라이브러리 버전이 올라감에 따라 해당 버전의 리스크는 개발자가 떠앉는 상황을 피하기위해 정리해 보았습니다.

@Configuration
@ComponentScan
@EnableWebSecurity
@EnableGlobalMethodSecurity(prePostEnabled = true)
@RequiredArgsConstructor
public class SecurityCustomConfig {

    private final JwtAccessDeniedHandler jwtAccessDeniedHandler;
    private final JwtAuthorizationFilter jwtAuthorizationFilter;
    private final JwtAuthenticationEntryPoint jwtAuthenticationEntryPoint;

	// 1. 기존에 filter 내용 설정
    @Bean
    public SecurityFilterChain filterChain(HttpSecurity http) throws Exception {
        http.csrf().disable()
            .authorizeRequests()
            	// 유저 권한 별 접근 가능 url
                .antMatchers("/", "/signIn", "/signUp").permitAll()
                .antMatchers("/admin").hasAnyAuthority("ROLE_ADMIN")
                .antMatchers("/auth").authenticated()
        .and()
            .exceptionHandling()
            	// 권한 및 토큰에 대한 exception 처리 필터 등록
                .accessDeniedHandler(jwtAccessDeniedHandler)
                .authenticationEntryPoint(jwtAuthenticationEntryPoint)
        .and()
        	// jwt token 사용시 session에 대한 정책을 따로 설정해 주어야 합니다.
            .sessionManagement().sessionCreationPolicy(SessionCreationPolicy.STATELESS);
		
        // jwt 토큰에 대한 validation 필터를 등록 합니다.
        http.addFilterAfter(jwtAuthorizationFilter, UsernamePasswordAuthenticationFilter.class);

        return http.build();
    }

	// 2. CORS url 정책 허용 범위 작성
    @Bean
    public WebMvcConfigurer corsConfigurer() {
        return new WebMvcConfigurer() {
            @Override
            public void addCorsMappings(CorsRegistry registry) {
                registry.addMapping("/**").allowedMethods("*");
            }
        };
    }

}

기존 WebSecurityConfigurerAdapter class를 상속 받았을 때보다는 훨씬 간결해졌습니다.

 

@Component
public class CustomPasswordEncoder {
    // 패스워드 인코더 Bean 등록
    @Bean
    public PasswordEncoder pEncoder() {
        return new BCryptPasswordEncoder();
    }
}
@Component
@RequiredArgsConstructor
public class CustomAuthenticationManager implements AuthenticationManager {

    private final JwtUserDetailService jwtUserDetailService;
    private final CustomPasswordEncoder customPasswordEncoder;

    // 유저 로그인시 등록되는 Credential 코드입니다.
    @Override
    public Authentication authenticate(Authentication authentication) throws AuthenticationException {
        UserDetails userDetails = jwtUserDetailService.loadUserByUsername(authentication.getName());
        if (!customPasswordEncoder.pEncoder().matches(authentication.getCredentials().toString(), userDetails.getPassword()))
            throw new BadCredentialsException("Wrong Password");

        return new UsernamePasswordAuthenticationToken(userDetails.getUsername(), userDetails.getPassword());
    }
}

위 두개의 코드들을 component로 따로 등록하여 구성해 주시면 됩니다.

jwt 토큰 등록등은 이전 버전과 동일하여 제외하고 새로운 Spring Security 사용에 대해서 정리해 보았습니다.

전체 코드를 확인하고 싶으시다면 git에 Boilerplate로 공유 하였습니다.

 

피드백은 언제든 환영 합니다!!

다들 즐코딩 하세요!

 

 

GitHub - lwj1370/spring_security_5.7: Spring Security v.5.7+ Configuration Boilerplate

Spring Security v.5.7+ Configuration Boilerplate. Contribute to lwj1370/spring_security_5.7 development by creating an account on GitHub.

github.com

반응형