로그인 처리 -4 (Interceptor)

나무·2023년 11월 20일

스프링 MVC

목록 보기
12/12
post-thumbnail

1. LoginInterceptor : HandlerInterceptor 구현체

package hello.login.web.interceptor;

import hello.login.web.SessionConst;
import lombok.extern.slf4j.Slf4j;
import org.springframework.web.servlet.HandlerInterceptor;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;

@Slf4j
public class LoginCheckInterceptor implements HandlerInterceptor {

    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {

        String requestURI = request.getRequestURI();

        log.info("인증 체크 인터셉터 실행 {}", requestURI);

        HttpSession session = request.getSession();

        if (session == null || session.getAttribute(SessionConst.LOGIN_MEMBER) == null) {
            log.info("미인증 사용자 요청");
            //로그인으로 redirect
            response.sendRedirect("/login?redirectURL=" + requestURI);
            return false;
        }

        return true;
    }
}

비로그인 사용자의 경우 -> return false;
로그인 사용자의 경우 -> return true;

Filter 구현 때와 달리 따로 whitelist URL 들을 만들어서 관리할 필요가 없다. 왜냐하면 해당 작업은 있다가 Config 파일에 등록할 때 같이 적용 시킬것이기 때문이다.

2. WebConfig : addInterceptors();

@Override
    public void addInterceptors(InterceptorRegistry registry) {
        // 다른 인터셉터 등록
        registry.addInterceptor(...)

		// 로그인 체크 인터셉터 등록
        registry.addInterceptor(new LoginCheckInterceptor())
                .order(2)
                .addPathPatterns("/**")
                .excludePathPatterns("/", "/members/add", "/login", "/logout",
                        "/css/**", "/*.ico", "/error");
    }

addInterceptors()

Filter 와 달리 @Bean 을 등록하는게 아니고 addInterceptor() 를 오버라이드 한다.

그래서 인터셉터마다 빈 한개씩 생성하는게 아닌, addInterceptor() 가 전달받는 파라미터인 registry 에 하나씩 등록하게된다.

excludePathPatterns()

Filter 또 다른 점이다. 앞에서 언급했듯이 Interceptor 가 URL을 관리하지 않고 WebConfig 파일 안에서 관리하게된다.

또한 Filter 보다 훨씬 세밀하게 URL 을 관리할 수있다.

PathPatern 공식문서 에 가면 더 자세히 알 수 있다.

3. 정리

Filter 보다 Interceptor 가 훨씬 기능이 많으므로 반드시 필터를 쓸일이 아니라면 그냥 인터셉터를 사용하자!

본 포스트는
김영한의 스프링 MVC 2편 - 백엔드 웹 개발 활용 기술 강의 를 보고 정리했습니다.

profile
🍀 개발을 통해 지속 가능한 미래를 만드는데 기여하고 싶습니다 🍀

0개의 댓글