1. Interceptor 생성 및 적용

프라이마리모·2024년 11월 30일

REST API

목록 보기
2/4
post-thumbnail

이 시리즈에서는 JPA 예시 코드를 기반으로, 실제 운영 환경에서 각기 다른 도메인끼리의 통신을 가정한 RESTful API로 디벨롭한다.
* 기본 웹 프로젝트 세팅 완료된 상태에서 시작, 테스트는 POSTMAN 활용

디벨롭 단계

  • Interceptor 생성 및 적용
  • API Key 검증 로직 구현
  • JWT 발급, 인증/인가 로직 구현
    • 클라이언트 용 인증 로직 구현
    • 서버용 JWT 발급 로직 구현
    • 서버 인터셉터 내 검증 구현
      • JWT의 형식 검증
      • JWT의 서명(Signature) 검증
      • 클레임(예: iss, exp, scope) 검증.
  • OAuth 2.0 기반 인증/인가 로직 구현
    • 클라이언트 용 Access Token 발급 로직 구현
    • 서버 인터셉터 내 검증 구현
      • Access Token의 형식 검증
      • 인증 서버에 검증 요청(옵션, 원격 검증)
      • Access Token의 클레임(예: scope, exp) 검증

Interceptor란?

Spring Framework나 Servlet 기반 애플리케이션에서 요청/응답 사이클의 전후 처리를 수행하기 위해 사용한다.

구현 방법

  • HandlerInterceptor 인터페이스를 구현하거나 HandlerInterceptorAdapter를 상속
  • 세 가지 메서드 구현
    • preHandle: 컨트롤러 실행 전에 호출.
      (HttpServletRequest request, HttpServletResponse response, Object handler)
    • postHandle: 컨트롤러 실행 후, View 렌더링 전에 호출.
    • afterCompletion: 요청 처리 완료 후 호출.
  • WebMvcConfigurer 인터페이스 구현
    • Interceptor 클래스가 작동할 수 있도록 클래스를 빈(Bean)으로 등록 필요
    • 이를 위해 WebMvcConfigurer 인터페이스를 구현한 설정 클래스인 WebMvcConfig 생성

구현 코드

Interceptor 인터페이스 구현

package study.data_jpa.interceptor;

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

@Component
public class AuthenticationInterceptor implements HandlerInterceptor {

    // 컨트롤러 호출 전에 실행
    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        // 인증 확인 > 추후 수정
        String authToken = request.getHeader("Authorization");
        if (authToken == null || !authToken.equals("valid-token")) {
            response.setStatus(HttpServletResponse.SC_UNAUTHORIZED);
            response.getWriter().write("Unauthorized");
            return false; // 요청 처리 중단
        }
        return true; // 계속 처리
    }

    // 컨트롤러 호출 후 실행
    @Override
    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
        System.out.println("postHandle: 요청 처리 후 실행");
        // 추후 수정
    }

    // 요청 완료 후 실행 (예외 발생 여부와 상관없음)
    @Override
    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
        System.out.println("afterCompletion: 요청 완료 후 실행");
        // 추후 수정
    }
}

WebConfig 구현

package study.data_jpa.config;

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;
import study.data_jpa.interceptor.AuthenticationInterceptor;

@Configuration
public class WebConfig implements WebMvcConfigurer {

    @Autowired
    private AuthenticationInterceptor authenticationInterceptor;

    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        registry.addInterceptor(authenticationInterceptor)
                .addPathPatterns("/api/**") // 인터셉터가 적용될 경로
                .excludePathPatterns("/api/auth/**", "/api/public/**"); // 제외할 경로
    }
}
profile
개발공부 요약노트

0개의 댓글