Spring Interceptor

박상우·2023년 7월 18일
0

Srping

목록 보기
5/5

본 내용은 SpringBoot 2.x 기준으로 작성되어 있음

인터셉터(Interceptor)

1. Handler Interceptor란?

  • Dispatcher Servlet -> Controller 로 전달되는 요청 HttpRequest 및 Controller가 응답하는 HttpResponse를 가로채서 인증, 인가 등의 검증 로직을 처리하는 역할을 함
  • Filter 와 다른 점은 Handler Interceptor 는 Controller 와 직접적인 연관성이 있어 Controller 으로 전달되는 요청에 대한 제어권을 가지고 있음

2. Interceptor 사용 예시

@Slf4j
@RequiredArgsConstructor
@Component
public class AuthorizationInterceptor implements HandlerInterceptor {

    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        log.info("Authorization Interceptor url: {}", request.getRequestURI());

        // WEB, chrome 의 경우 GET, POST OPTIONS = pass
        if(HttpMethod.OPTIONS.matches(request.getMethod())) {
            return true;
        }

        // js, html, png resource 를 요청하는 경우 = pass
        if(handler instanceof ResourceHttpRequestHandler) {
            return true;
        }

        log.error("허용하지 않음");
        return false;
    }
}
  • AuthorizationInterceptor 클래스를 생성하여 HandlerInterceptor 인터페이스를 implements 함
  • preHandle() 메서드를 Implements 하여 인증, 인가에 대한 로직을 구현
  • preHandle() 은 Controller 호출 전에 실행되는 메서드
  • postHandle() 은 Controller 호추 후에 실행되는 메서드
  • afterComplete() 메서드는 View 에서 최종 결과가 생성하는 모든 과정이 완료되었을 때 실행되는 메서드
  • return true를 하게 되면 다음 로직이 실행되지만 false 을 return 하면 다음 로직(인터셉터, 컨트롤러) 실행되지 않음
@Configuration
@RequiredArgsConstructor
public class WebConfig implements WebMvcConfigurer {

    private final AuthorizationInterceptor authorizationInterceptor;

    private final List<String> OPEN_API = List.of(
            "/open-api/**"
    );

    private final List<String> DEFAULT_EXCLUDE = List.of(
            "/",
            "favicon.ico",
            "/error"
    );

    private final List<String> SWAGGER = List.of(
            "/swagger-ui.html",
            "/swagger-ui/**",
            "/v3/api-docs/**"
    );

    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        registry.addInterceptor(authorizationInterceptor)
                .excludePathPatterns(OPEN_API)
                .excludePathPatterns(DEFAULT_EXCLUDE)
                .excludePathPatterns(SWAGGER);
    }
}
  • Config 클래스를 생성하여 WebMvcConfigurer 인터페이스를 implements 함
  • 위에서 작성한 AuthorizationInterceptor 클래스를 @RequiredArgsConstructor 어노테이션을 통해 Spring 컨테이너에서 가져옴
  • addInterceptors() 메서드를 implements 하여 내부 로직에 AuthorizationInterceptor 객체를 인터셉터로 등록
  • excludePathPatterns() 메서드를 통해 Interceptor 에 영향을 받지 않는 경로 지정 (예: 사용자 인증, 인가가 필요하지 않은 경로)
profile
보안, 개발을 같이 하고 있습니다

0개의 댓글