[TIL] 22.12.29[ permitAll()하면 SecurityFilterChain을 안타는줄 알았지 뭐야~]

조성현·2022년 12월 29일
3

문:

  • Security 적용 중, permitAll()을 하면 SecurityFilterChain을 안타고 그냥 넘어갈 것이라 생각했다.
  • 그러나 현실은 forbidden의 늪이었다.(내가 추가한 JwtAuthFilter에서 자꾸 막힘)
    -permitAll()을 했을 때 어떻게 동작하는지를 몰랐던 것 / 이로 인해 JwtAuthFilter를 설계할 때부터 잘못된 tokenNullCheck 함수를 넣게 되었다는 점
  • permitAll()로부터 시작된 환장의 시큐리티 입문기

시:

  • 깊은 고뇌(왜 이게 안될까, 뭐가 문제일까, 논리적 가설 세우기)
  • 구글링(논리적 가설이 맞는지 구글링하며 확인해보기)
  • 최후의 방법 -> 튜터님께 여쭤보기

해:

  • 포스트맨에서 오류발생
  • ide 에러코드 확인
  • 에러가 발생한 코드 확인
  • permitAll()해도 FilterChain을 탄다는 것을 확인.
  • nullCheck 방식을 바꾸고
  • 해결..

  • 주말간 해봐야할 것: 완성된 코드를 기반으로 token에 null을 넣었을 때 어떻게 되는지?
  • 어떤 예외가 발생할지 == 어느 필터에서 null에 대한 예외가 발생할지 궁금하다.

  • 포스트맨 forbidden

  • ide err code

  • JwtAuthFilter:31라인 ->
    if(token == null) throw new TokenNotExistException();

이상하다 나는 분명히 나는 분명히 permitAll()을 했는데 왜... FilterChain을 타지...?

@Configuration
@RequiredArgsConstructor
@EnableWebSecurity // 스프링 Security 지원을 가능하게 함
@EnableGlobalMethodSecurity(securedEnabled = true) // @Secured 어노테이션 활성화
public class WebSecurityConfig {
    private final JwtUtil jwtUtil;

    @Bean
    public PasswordEncoder passwordEncoder() {
        return new BCryptPasswordEncoder();
    }

    @Bean
    public WebSecurityCustomizer webSecurityCustomizer() {
        // h2-console 사용 및 resources 접근 허용 설정
        return (web) -> web.ignoring()
                .requestMatchers(PathRequest.toH2Console())
                .requestMatchers(PathRequest.toStaticResources().atCommonLocations());
    }

    @Bean
    public SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception {
        http.csrf().disable();
        // 기본 설정인 Session 방식은 사용하지 않고 JWT 방식을 사용하기 위한 설정
        http.sessionManagement().sessionCreationPolicy(SessionCreationPolicy.STATELESS);

        http.authorizeRequests()
                .antMatchers("/api/user/**").permitAll()
                .anyRequest().authenticated()

                // 기본 설정인 Session 방식은 사용하지 않고 JWT 방식을 사용하기 위한 설정
                .and().addFilterBefore(new JwtAuthFilter(jwtUtil), UsernamePasswordAuthenticationFilter.class);

		 // http.formLogin().loginPage("/api/user/signIn").permitAll();
		 // http.exceptionHandling().accessDeniedPage("/api/user/forbidden");

        return http.build();
    }

}

아 permitAll()을 하더라도 Filterchain은 타게되고, 그냥 스무스하게 넘어갈 수 있는 access(permitAll)을 주는건가...?

  • 일단 Jwt대신 session으로 다시 돌려보자
    -> 성공...
  • 다른 Filter들은 원래 있는 상태니까 자연스럽게 흘러가는데, 왜 내가 커스텀한 JwtAuthFilter에서만 걸리지..?
    -> if(token == null) throw new TokenNotExistException();
    -> 왜긴 왜야... FilterChain을 타면 당연히 이 부분에서 걸리지...

코드 수정



편안...


스프링 괜찮은 Ref
permitAll()의 타입에 대한 공식문서

profile
맛있는 음식과 여행을 좋아하는 당당한 뚱땡이

0개의 댓글