
이 시리즈에서는 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) 검증
Spring Framework나 Servlet 기반 애플리케이션에서 요청/응답 사이클의 전후 처리를 수행하기 위해 사용한다.
HandlerInterceptor 인터페이스를 구현하거나 HandlerInterceptorAdapter를 상속preHandle: 컨트롤러 실행 전에 호출.(HttpServletRequest request, HttpServletResponse response, Object handler)postHandle: 컨트롤러 실행 후, View 렌더링 전에 호출.afterCompletion: 요청 처리 완료 후 호출.WebMvcConfigurer 인터페이스 구현WebMvcConfigurer 인터페이스를 구현한 설정 클래스인 WebMvcConfig 생성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: 요청 완료 후 실행");
// 추후 수정
}
}
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/**"); // 제외할 경로
}
}