📌 interceptor 란?
interceptor 는 컨트롤러에 들어오는 요청 HttpRequest와 컨트롤러가 응답하는 HttpResponse를 가로채는 역할을 합니다.인터셉터는 관리자만 접근할 수 있는 관리자 페이지에 접근하기 전에 관리자 인증을 하는 용도로 활용될 수 있습니다.
이번 주제에서는 컨트롤러에서 인터셉터를 활용하여 접근 권한을 해보고, 기술 침투적인 HttpSession을 제거하여 세션을 처리하려 합니다.
인터셉터는 Servlet의 앞, 뒤에서 HttpRequest, HttpResponse을 가로채는 Filter와 그 역할이 유사한데, Filter와 Interceptor는 분명히 다릅니다.
Interceptor | Filter |
인증/인가 등과 같은 공통 작업 | 보안 관련 공통 작업 |
Controller로 넘겨주는 정보의 가공 | 모든 요청에 대한 로깅 또는 감사 |
API 호출에 대한 로깅 또는 감사 | 이미지/데이터 압축 및 문자열 인코딩 |
📌 HandlerInterceptor 로 interceptor 구현하기
interceptor는 HandlerInterceptor를 구현(implements)하여 사용할 수 있습니다.
HandlerInterceptor를 살펴보면, preHandle(), postHandle(), afterCompletion() 로 총 세 개의 default 메서드를 지닌 인터페이스 입니다. 우리는 여기서 preHandle() 메서드만 재정의 하도록 하겠습니다.
들어가기 전 각각의 메서드가 지닌 의미를 알아보겠습니다.
- preHandle : 컨트롤러 들어오기 전에 동작합니다.
- true 인 경우 controller 안으로 들어가고 false인 경우는 controller를 통과하지 못합니다.
- postHandle : 뷰가 랜더링 되기 전에 호출 되는 메서드입니다.
- afterCompletion : 요청 처리가 완료된 후, 뷰가 랜더링이 완료된 후 호출됩니다.
📌 HandlerInterceptor 로 interceptor 구현하기 - 코드
@Component // IoC 대상
public class AuthInterceptor implements HandlerInterceptor {
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)
throws Exception {
System.out.println("---------Interceptor 동작 확인-------");
// 인증 검사
HttpSession session = request.getSession();
User principal = (User)session.getAttribute(Define.PRINCIPAL); // 세션에서 값 꺼내기
if(principal == null) {
//response.sendRedirect("/user/sign-in"); // 인증이 안되면 로그인페이지로
throw new UnAuthorizedException("로그인 먼저 해주세요", HttpStatus.UNAUTHORIZED);
}
return true;
}
//////// 아래 두 메서드는 재정의없이 쓰이기에 가져오지 않아도 된다 ///////
@Override
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler,
ModelAndView modelAndView) throws Exception {
// TODO Auto-generated method stub
HandlerInterceptor.super.postHandle(request, response, handler, modelAndView);
}
@Override
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex)
throws Exception {
// TODO Auto-generated method stub
HandlerInterceptor.super.afterCompletion(request, response, handler, ex);
}
}
preHandle를 자동 생성하면, HttpServletRequest 매개변수를 지니게 됩니다. HttpServletRequest 의 문서를 살펴보면 session의 정보를 가져올 수 있는 메서드가 정의되어있습니다. 이 메서드를 통해 세션에 저장된 사용자의 정보를 불러옵니다.
관련 코드 집중적으로 보기
HttpSession session = request.getSession();
User principal = (User)session.getAttribute(Define.PRINCIPAL);
📌 WebMvcConfigurer 인터페이스 구현하기
앞서 만들어둔 AutoInterceptor 클래스가 작동할 수 있도록 클래스를 Bean 등록하는 작업이 필요합니다.
그 때 사용되는 WebMvcConfig 클래스를 생성하도록 할 것입니다. 이 클래스는 WebMvcConfigurer 인테페이스를 구현(implements)된 클래스입니다.
@Configuration
public class WebMvcConfig implements WebMvcConfigurer{
@Autowired
private AuthInterceptor authInterceptor;
@Override
public void addInterceptors(InterceptorRegistry registry) { // 인터셉터 등록 역할
registry.addInterceptor(authInterceptor)
.addPathPatterns("/account/**")
.addPathPatterns("/auth/**");
// 도메인 추가 원한다면 아래에 더하기
}
}
@Configuration 어노테이션은 스프링 부트 설정 클래스입니다. 주로 2개 이상 IoC(Bean)에 사용됩니다.
위와 같이 설정을 한다면 인터셉터가 작동하는 것을 확인할 수 있습니다.
<참고자료>
https://victorydntmd.tistory.com/176
https://congsong.tistory.com/24
'Spring' 카테고리의 다른 글
Path parameter 와 Query string 구분 (1) | 2024.01.30 |
---|