1 minute read

로그인 처리 - 필터, 인터셉터

  • 서블릿이 제공하는 필터
  • 스프링이 제공하는 인터셉터
  • 두 기능 모두 목적은 “로그인 되지 않은 사용자가 특정 url을 타고 들어가는 것을 방지하기 위함” - 인증을 위한 기능
  • 서블릿 필터
    • 새로운 필터로 doFilter 메서드 @Override 구현해서 Filter interface implement
    • WhiteList(인증 안된 사용자도 들어갈 수 있는 페이지 ex. 회원가입, 로그인, css등) 따로 명시 → 미래에 개발될 페이지도 따로 미인증 사용자 신경 안써도 되게끔 구현
    • @Configuration 파일에 따로 @Bean 으로 등록해줘야 필터로 등록됨.
  • 스프링 인터셉터 (스프링 쓰면 대부분 이거 씀)
    • 서블릿 필터보다 더 많은 기능을 제공(순서, 범위(매우 정밀한 URL패턴 가능), 사용법에 있어서)
    • 3개의 메서드: preHandle(컨트롤러 호출 전에), postHandle(컨트롤러 호출 후에), afterCompletion(view 까지 렌더링 끝난 뒤에) → 더 편하고 정교한 로직 구성 가능.
      • ex) preHandle: 서블릿 필터같이 사용 가능(미인증 사용자 컨트롤러 호출X 로직) postHandle: 컨트롤러 예외 터지면 호출되지 않음 afterCompletion: 어느 경우에도 호출되므로 공통 로직 작성 시 사용. 컨트롤러에서 어느 예외가 터졌는지 로그 출력 가능.
    • 새로운 인터셉터 preHandle, postHandle, afterCompletion 메서드 @Override 구현해서 HandlerInterceptor interface implement
    • @Configuration 파일에 아래와 같이 등록 (@Bean 아닌 @Override 로 등록)
      • 필터에 비해 훨씬 편한게 느껴지십니까? →

        Interceptor 등록할 때 excludePathPatterns를 지정할 수 있어서 loginCheckInterceptor 메인로직에는 checkPath 이런 것들을 고려해서 로직을 짤 필요가 없다는 점.

        HttpRequest를 바로 제공한다는 점. 3가지 역할을 하는 메서드로 나뉘어 정밀한 역할 구분 로직을 짤 수 있다는 점.(handler, exception, ModelAndView)

        @Override
        public void addInterceptors(InterceptorRegistry registry) {
            registry.addInterceptor(new LogInterceptor())
                    .order(1)
                    .addPathPatterns("/**")
                    .excludePathPatterns("/css/**", "/*.ico", "/error");
        }
      

Updated: