본문 바로가기

IT · 인터넷

[Java] 인터셉터 (Interceptor): 요청과 응답을 가로채는 기술

반응형

인터셉터(Interceptor): 요청과 응답을 가로채는 기술

인터셉터는 웹 애플리케이션에서 요청과 응답을 가로채어 처리하는 기술로, 주로 스프링 프레임워크와 같은 MVC 패턴을 사용하는 프레임워크에서 많이 사용됩니다. 
인터셉터는 클라이언트의 요청이 컨트롤러에 도달하기 전에, 또는 컨트롤러에서 응답을 반환하기 전에 특정 로직을 수행할 수 있는 메서드를 제공합니다.

사용 이유

  • 공통 로직 처리: 인증, 로깅, 트랜잭션 관리 등과 같은 공통 작업을 중앙에서 처리할 수 있습니다. 
    이를 통해 코드의 중복을 줄이고, 유지보수를 용이하게 합니다.
  • 요청 및 응답 수정: 요청을 처리하기 전에 데이터를 변형하거나, 응답을 가공하는 데 유용합니다.
    예를 들어, 요청 헤더를 수정하거나 응답 본문에 추가 정보를 삽입할 수 있습니다.
  • 성능 향상: 인터셉터는 요청의 흐름을 조절할 수 있기 때문에, 특정 조건에 따라 요청을 거부하거나, 캐시된 응답을 반환하는 등의 최적화 작업을 수행할 수 있습니다.
  • 보안 강화: 사용자 인증 및 권한 검사를 통해 보안을 강화할 수 있습니다.
    요청이 컨트롤러에 도달하기 전에 사용자의 권한을 확인함으로써 불필요한 처리를 줄일 수 있습니다.

 

예제 코드

요청이 들어올 때마다 로그를 남기고, 인증 정보를 확인하는 인터셉터 구현
 

#1 인터셉터 클래스 작성

import org.springframework.stereotype.Component;
import org.springframework.web.servlet.HandlerInterceptor;

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

@Component
public class CustomInterceptor implements HandlerInterceptor {

    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        // 요청 URL 로그
        System.out.println("Request URL: " + request.getRequestURL());

        // 인증 정보 확인 (예를 들어, 세션에서 사용자 정보를 가져옴)
        String user = (String) request.getSession().getAttribute("user");
        if (user == null) {
            response.sendRedirect("/login"); // 인증되지 않은 경우 로그인 페이지로 리다이렉트
            return false; // 요청 처리 중단
        }
        return true; // 요청 처리 계속
    }

    @Override
    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
        // 응답 후 처리 (예: 로그 기록)
        System.out.println("Response Status: " + response.getStatus());
    }
}

 

#2 인터셉터 등록

: 스프링 설정 파일에서 인터셉터 등록 

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 CustomInterceptor customInterceptor;

    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        registry.addInterceptor(customInterceptor)
                .addPathPatterns("/**") // 모든 경로에 대해 인터셉터 적용
                .excludePathPatterns("/login"); // 로그인 경로는 제외
    }
}

 

#3 컨트롤러 사용 예제 

: 인터셉터가 작동하는 컨트롤러 작성

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

@Controller
public class HomeController {

    @GetMapping("/")
    public String home() {
        return "home"; // home.html 뷰를 반환
    }

    @GetMapping("/login")
    public String login() {
        return "login"; // login.html 뷰를 반환
    }
}

 

마무리

인터셉터는 웹 애플리케이션에서 요청과 응답을 가로채어 처리할 수 있는 도구입니다.
인터셉터를 적절히 활용하면 애플리케이션의 성능과 보안을 향상시킬 수 있으며, 소스 작성에 있어 유연성을 제공합니다.

반응형