삽질 피하기
[삽질 피하기] 인터셉터
ozofweird
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