Develop/JAVA

Spring Interceptor를 활용한 페이지 이동 추적 및 제어

issuemaker99 2025. 3. 26. 17:09
728x90

웹 애플리케이션을 개발할 때, 사용자가 어떤 페이지에서 이동했는지 추적하고 특정 경로로 이동했을 때 제어하는 기능이 필요할 때가 있습니다. 예를 들어, 다음과 같은 요구사항이 있다고 가정해 보겠습니다.

  • 사용자가 A 페이지 → B 페이지 로 이동한 경우 정상적으로 B 페이지를 표시한다.
  • 사용자가 A → B → C → B(뒤로 가기) 로 이동하면 오류 페이지로 보내고 싶다.

이러한 동작을 구현하기 위해 Spring의 Interceptor 를 활용할 수 있습니다. Interceptor를 사용하면 사용자의 이전 페이지 정보를 세션에 저장하고, 특정 페이지에서 접근을 제어 할 수 있습니다.


🚀 Spring Interceptor를 이용한 해결 방법

1️⃣ Interceptor를 활용한 이전 페이지 저장 및 확인

Spring의 HandlerInterceptor 를 사용하면 사용자의 요청이 컨트롤러로 전달되기 전에 특정 로직을 수행할 수 있습니다. 이를 활용해 사용자의 이전 페이지 URL을 세션에 저장 하고, 특정 페이지에서 접근을 제어할 수 있습니다.

2️⃣ 요청 흐름 및 동작 방식

  1. 사용자가 A → B 로 이동하면 세션에 이전 페이지 정보(previousUrl)를 저장합니다.
  2. 사용자가 B → C 로 이동하면 다시 previousUrl 을 업데이트합니다.
  3. 사용자가 C에서 뒤로 가기(Back)하여 C → B 로 이동하면, 이전 URL이 C 였으므로 오류 페이지(/error)로 리다이렉트합니다.
  4. 만약 사용자가 A → B → 뒤로 가기 했다면 정상적으로 B 페이지를 유지합니다.

🛠️ Spring Interceptor 구현하기

📌 1. Interceptor 클래스 생성

import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import jakarta.servlet.http.HttpSession;
import org.springframework.stereotype.Component;
import org.springframework.web.servlet.HandlerInterceptor;

@Component
public class PageNavigationInterceptor implements HandlerInterceptor {

    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        HttpSession session = request.getSession();
        String currentUrl = request.getRequestURI(); // 현재 요청된 URL
        String previousUrl = (String) session.getAttribute("previousUrl"); // 세션에서 이전 URL 가져오기

        System.out.println("현재 페이지: " + currentUrl);
        System.out.println("이전 페이지: " + previousUrl);

        // B 페이지로 이동한 경우 이전 페이지를 체크
        if (currentUrl.equals("/b")) {
            if ("/c".equals(previousUrl)) {
                // C 페이지에서 B로 이동한 경우 오류 페이지로 리다이렉트
                response.sendRedirect("/error");
                return false; // 요청을 처리하지 않음
            }
        }

        // 현재 URL을 세션에 저장
        session.setAttribute("previousUrl", currentUrl);
        return true; // 정상적인 요청 처리
    }
}

📌 2. Interceptor를 Spring 설정에 등록

위에서 만든 PageNavigationInterceptor 를 Spring의 WebMvcConfigurer 에 등록해야 합니다.

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;

@Configuration
public class WebConfig implements WebMvcConfigurer {

    @Autowired
    private PageNavigationInterceptor pageNavigationInterceptor;

    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        registry.addInterceptor(pageNavigationInterceptor)
                .addPathPatterns("/b"); // B 페이지에 대해서만 Interceptor 실행
    }
}

 

📌 3. 컨트롤러 및 오류 페이지 설정

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;

@Controller
public class PageController {

    @GetMapping("/a")
    public String pageA() {
        return "a"; // a.html 페이지 반환
    }

    @GetMapping("/b")
    public String pageB() {
        return "b"; // b.html 페이지 반환
    }

    @GetMapping("/c")
    public String pageC() {
        return "c"; // c.html 페이지 반환
    }

    @GetMapping("/error")
    public String errorPage() {
        return "error"; // error.html 페이지 반환
    }
}

 

 테스트 시나리오

시나리오 결과
A → B 이동 B 정상 표시
A → B → C → 뒤로가기 (C → B) 오류 페이지(/error)로 이동
A → B → 뒤로가기 B 정상 표시

📌 추가 고려할 사항

🔹 1. 브라우저 캐시 문제 해결

뒤로 가기를 눌렀을 때 브라우저 캐시로 인해 이전 URL이 변경되지 않는 경우, 응답 헤더에 no-cache 설정을 추가할 수 있습니다.

response.setHeader("Cache-Control", "no-cache, no-store, must-revalidate");
response.setHeader("Pragma", "no-cache");
response.setHeader("Expires", "0");

 

🔹 2. Interceptor vs Filter

  • Interceptor 는 특정 URL 패턴에 대해서만 동작하게 할 수 있으므로, 페이지 이동을 제어할 때 적합합니다.
  • Filter 를 사용하면 모든 요청에 대해 검사할 수 있지만, 특정 페이지(/b)에서만 동작하도록 하려면 추가 설정이 필요합니다.

🎯 결론

Spring Interceptor를 사용하면 사용자의 이전 페이지 정보를 추적하고, 특정 경로에서 접근을 제어 할 수 있습니다. 위 코드대로 적용하면 사용자가 A → B → C → 뒤로 가기 를 했을 때, C에서 B로 넘어온 경우 오류 페이지로 리다이렉트할 수 있습니다.

LIST