[Spring] 로그인 처리2 (필터, 인터셉터) 정리

2025. 4. 7. 06:02코딩 도구/백엔드 개발 (Backend Development)

반응형

스프링 MVC 2 - 로그인 처리2: 필터와 인터셉터 정리

이 글은 인프런 김영한님의 "스프링 MVC 2편 - 백엔드 웹 개발 활용 기술" 강의의 '로그인 처리2 - 필터, 인터셉터' 파트를 수강하고 정리한 내용입니다.

 

인증과 권한은 웹 애플리케이션의 핵심 기능 중 하나다. 이 강의에서는 로그인한 사용자만 접근할 수 있는 URL에 대해 서블릿 필터스프링 인터셉터를 통해 공통 인증 체크 로직을 효율적으로 관리하는 방법을 다룬다. 또한 ArgumentResolver를 통해 로그인 정보를 더욱 편리하게 주입받는 기법까지 소개한다.


정리 및 흐름 요약

  • 서블릿 필터와 인터셉터의 개념 및 흐름
  • 요청 로그 필터 및 인증 체크 필터 구현
  • 인터셉터 기반 요청 로그, 인증 체크 구현
  • 로그인 후 redirect 처리 방법
  • @Login 커스텀 애노테이션 + ArgumentResolver로 로그인 멤버 자동 주입

1. 서블릿 필터

공통 관심사의 등장

  • 로그인한 사용자만 상품 관리 접근 허용
  • 개별 컨트롤러마다 인증 체크하는 방식은 유지보수 어려움
  • 공통 로직 분리를 위한 서블릿 필터 도입

필터 흐름도

HTTP 요청 -> WAS -> 필터 -> 서블릿 -> 컨트롤러

LogFilter 구현

  • 모든 요청에 대해 UUID와 URI 기반 로그 출력
log.info("REQUEST  [{}][{}]", uuid, requestURI);
log.info("RESPONSE [{}][{}]", uuid, requestURI);

LoginCheckFilter 구현

  • 인증되지 않은 사용자는 로그인 페이지로 리다이렉트
if (session == null || session.getAttribute(SessionConst.LOGIN_MEMBER) == null) {
    response.sendRedirect("/login?redirectURL=" + requestURI);
    return;
}
  • FilterRegistrationBean을 통해 등록 및 순서 설정 (logauth 순)

2. 스프링 인터셉터

필터와 차이점

  • 스프링 MVC 내부에서 동작 → DispatcherServlet 이후
  • 더 풍부한 정보 제공 (handler, modelAndView, 예외 정보 등)

흐름도

HTTP 요청 → WAS → 필터 → 서블릿 → 인터셉터 → 컨트롤러

HandlerInterceptor 주요 메서드

  • preHandle(): 컨트롤러 실행 전 (중단 가능)
  • postHandle(): 컨트롤러 실행 후, 뷰 렌더링 전
  • afterCompletion(): 뷰 렌더링 후, 예외 포함 처리 가능

LogInterceptor 구현

log.info("REQUEST [{}][{}][{}]", uuid, requestURI, handler);
log.info("RESPONSE [{}][{}]", logId, requestURI);
  • UUID를 request attribute에 저장 후 재사용

LoginCheckInterceptor 구현

if (session == null || session.getAttribute(SessionConst.LOGIN_MEMBER) == null) {
    response.sendRedirect("/login?redirectURL=" + requestURI);
    return false;
}

WebConfig 등록

registry.addInterceptor(new LogInterceptor()).order(1)...
registry.addInterceptor(new LoginCheckInterceptor()).order(2)...
  • addPathPatterns, excludePathPatterns로 정밀한 URL 제어

3. 로그인 이후 redirect 처리

  • 로그인 실패 시 로그인 폼 재출력
  • 로그인 성공 시 redirectURL로 이동
@RequestParam(defaultValue = "/") String redirectURL
return "redirect:" + redirectURL;

4. ArgumentResolver 활용

목표

  • 컨트롤러에서 세션을 직접 조회하지 않고, @Login 애노테이션만으로 로그인 멤버 주입

@Login 애노테이션 정의

@Target(ElementType.PARAMETER)
@Retention(RetentionPolicy.RUNTIME)
public @interface Login {}

LoginMemberArgumentResolver 구현

if (parameter.hasParameterAnnotation(Login.class)
    && Member.class.isAssignableFrom(parameter.getParameterType())) {
    return session.getAttribute(SessionConst.LOGIN_MEMBER);
}

WebConfig 등록

resolvers.add(new LoginMemberArgumentResolver());

사용 예시

@GetMapping("/")
public String home(@Login Member loginMember, Model model) { ... }
  • 세션에서 로그인 멤버 자동 추출
  • 로그인 상태에 따라 홈 or 로그인 홈 뷰 분기 처리

마무리 정리

  • 필터와 인터셉터는 공통 관심사를 분리하는 강력한 도구
  • 인증, 로깅과 같은 기능을 전역에서 처리 가능
  • 필터는 서블릿 기반, 인터셉터는 스프링 MVC 기반으로 더 정교한 제어 가능
  • ArgumentResolver를 활용하면 컨트롤러에서 로그인 상태 관리가 더욱 간결하고 깔끔해짐
반응형