[삽질 피하기] 인터셉터

2021. 4. 21. 17:08삽질 피하기

1. 인터셉터

1) AuthFailException, GlobalExceptionHandler

인터셉터는 주로 인증 확인에 사용된다. 인증 실패에 대한 Exception과 @RestControllerAdvice를 통해 전역에서 발생하는 에러를 잡아내도록 설정해준다. 만약 설정이 완료될 경우, Controller에서 @RequestHeader("X-ACCESS-TOKEN")로 헤더의 토큰을 가져와 처리하는 로직을 작성하지 않아도 된다.

public class AuthFailException extends RuntimeException {
    public AuthFailException(String message) {
        super(message);
    }
}
...

import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.RestControllerAdvice;

@RestControllerAdvice
public class GlobalExceptionHandler {

    @ExceptionHandler(AuthFailException.class)
    public ResponseEntity<?> AuthFailException(AuthFailException exception) {
        return ResponseResult.fail("[인증 실패]" + exception.getMessage());
    }
}

2) CommonInterceptor

인터셉터 핸들러 클래스를 생성해주어야 한다.

...

import com.auth0.jwt.exceptions.JWTVerificationException;
import com.example.jpa.sample.common.exception.AuthFailException;
import com.example.jpa.sample.util.JwtUtils;
import lombok.extern.slf4j.Slf4j;
import org.springframework.web.servlet.HandlerInterceptor;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

@Slf4j
public class CommonInterceptor implements HandlerInterceptor {

    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {

        log.info("#################################");
        log.info("[인터셉터] - preHandler 시작");

        // 요청한 Method, URI 정보
        log.info(request.getMethod());
        log.info(request.getRequestURI());
        
        if(!!validJWT(request)) {
            throw new AuthFailException("인증 정보가 정확하지 않습니다.");
        }

        return true;
    }

    private boolean validJWT(HttpServletRequest request) {
        String token = request.getHeader("X-ACCESS-TOKEN");

        String email = "";
        try {
            email = JwtUtils.getIssuer(token);
        } catch(JWTVerificationException e) {
            return false;
        }

//        request.setAttribute("email", email); 로 데이터를 전달 할 수 있음

        return true;
    }
}

2) WebMvcConfig

특정 패턴에 대해서만 인터셉터가 동작시킬지에 대한 여부를 설정할 수 있다.

...

import org.springframework.context.annotation.Configuration;
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity;
import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;

@Configuration
public class WebMvcConfig implements WebMvcConfigurer {

    @Override
    public void addInterceptors(InterceptorRegistry registry) {

        registry.addInterceptor(new CommonInterceptor())
                .addPathPatterns("/api/*")
                .excludePathPatterns("/api/public/*");
    }
}
728x90