[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을 통해 등록 및 순서 설정 (log → auth 순)
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를 활용하면 컨트롤러에서 로그인 상태 관리가 더욱 간결하고 깔끔해짐
반응형
'코딩 도구 > 백엔드 개발 (Backend Development)' 카테고리의 다른 글
[Spring] 예외 처리와 오류 페이지 정리 (0) | 2025.04.14 |
---|---|
[Spring] 로그인 처리1 (쿠키, 세션) 정리 (0) | 2025.03.31 |
[Spring] 검증2 (Bean Validation) 정리 (0) | 2025.03.25 |
[Spring] 검증(Validation) 정리 (0) | 2025.03.21 |
[Spring] 개발 역할, 부트스트랩, PRG 패턴 (1) | 2025.03.14 |