본 프로젝트 자료는 김영한님의 스프링 MVC 2편 - 백엔드 웹 개발 활용 기술을 참고 제작됐음을 알립니다.
지금까지 만든 로그인과 상품등록에서 문제점이 있다. 바로 상품 등록 같은 경우 정상적인 상황이라면 회원만 등록과 수정을 할 수 있는데, 현재까지 만들어진 프로젝트 같은 경우 로그인 이후 상품 관리에 들어가는 듯 싶지만, 사실 로그인 하지 않아도 상품 관리 주소인 /items 만 입력해도 상품 관리 페이지에 들어와 상품 등록과 수정을 로그인 없이 아무나 관리할 수 있는 치명적인 단점이 있다.
이걸 해결하기 위해서 서블릿 필터라는걸 사용해서 관리해볼려고 한다.
필터를 적용하게 되면 필터가 호출 된 다음 서블릿을 호출한다. 그래서 모든 고객의 요청 로그를 남기는 요구사항이 있다면 필터를 사용하면 된다.
참고로 필터는 특정 URL 패턴에 ( /* ) 를 적용할 수 있다. 이것을 사용하면 모든 요청에 필터를 적용된다.
이렇게 필터를 사용하게 되면 적절하지 않는 요청이라고 판단하면 거기에서 끝을 낼 수도 있다. 그래서 로그인 여부를 체크하기에 적합하다.
필터는 보통 체인으로 구성되는데, 중간에 자유롭게 추가할 수 있어 유연하다고 볼 수 있다. 먼저 적용하고 그 뒤에 로그인 여부를 체크하는 필터를 만드는 등.
이제 필터를 어떻게 적용하는지 공부해볼려고 한다.
모든 요청을 로그로 남기는 필터를 만들어 본다.
LogFilter 신규 클래스 생성
@Slf4j
public class LogFilter implements Filter {
@Override
public void init(FilterConfig filterConfig) throws ServletException {
log.info("log filter init");
}
// HTTP 요청이 오면 doFilter 가 호출된다.
// ServletRequest request 는 HTTP 요청이 아닌 경우까지 고려해서 만든 인터페이스
@Override
public void doFilter(ServletRequest request, ServletResponse response,
FilterChain chain) throws IOException, ServletException {
// HTTP 를 사용됐을 때를 위한 다운케스팅
HttpServletRequest httpRequest = (HttpServletRequest) request;
String requestURI = httpRequest.getRequestURI();
// HTTP 요청을 구분하기 위해 요청당 임의의 uuid 를 생성해둔다.
String uuid = UUID.randomUUID().toString();
try {
// [{}][{}] 안에 uuid 와 requestURI 를 출력
log.info("REQUEST [{}][{}]", uuid, requestURI);
// 중요: 이 부분이 없으면 다음 단계에 넘어가지 않는다.
// 필터가 없으면 서블릿, 필터가 있으면 필터를 호출
chain.doFilter(request, response);
} catch (Exception e) {
throw e;
} finally {
log.info("RESPONSE [{}][{}]", uuid, requestURI);
}
}
@Override
public void destroy() {
log.info("log filter destroy");
}
}
WebConfig 신규 클래스 생성
필터 설정까지 등록이 끝나고 실행 시키면
사용자의 행동마다 필터가 찍히는 것을 확인할 수 있다.
모든 필터가 찍히는 이유는, 필터를 등록할 때 urlPattern 을 /* 로 등록했기 때문에 모든 요청에 해당 필터가 적용된다.
인증 체크 필터로 로그인 하지 않는 사용자는 상품 관리 뿐만 아니라 미래에 개발될 페이지에도 접근이 제한되도록 막아보자.
LoginCheckFilter 신규 클래스 생성
WebConfig - loginCheckFilter() 추가
이제 로그인 성공하면 처음 요청한 URL로 이동 가능한 기능을 개발.
실행 결과
로그인 안하고 다른 페이지 접근 시 로그인 페이지 변경
로그인 성공 시 처음 요청한 URL 로 경로 이동