[TIL]2025.04.17

기 원·2025년 4월 17일

TIL - 2025.2025.04.17

오늘 배운 것 개요

  • Interceptor를 사용한 어드민 인증 처리 구현
  • JwtFilter에서 사용자 정보를 request에 주입
  • MockMvc를 활용한 Interceptor 동작 테스트
  • 로그를 통해 인증 여부 및 URI 확인 가능

1. Interceptor 기반 어드민 인증

1. Interceptor 구현

  • AdminAuthInterceptor를 생성하여 userId, userRolerequest.getAttribute()로 추출
  • 어드민이 아닐 경우 IllegalStateException 발생
  • 접근 성공 시 userId, 요청 URI, 요청 시간 로그 기록

코드 개선

@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) {
    Long userId = (Long) request.getAttribute("userId");
    String userRole = (String) request.getAttribute("userRole");

    if (userId == null || userRole == null) {
        throw new IllegalStateException("인증 정보가 없습니다.");
    }

    if (!"ADMIN".equals(userRole)) {
        throw new IllegalStateException("어드민만 접근할 수 있습니다.");
    }

    log.info("어드민 API 접근 - userId: {}, URI: {}, time: {}", userId, request.getRequestURI(), LocalDateTime.now());
    return true;
}

개선된 점

  • JwtFilter를 통해 request에 세팅된 정보 재활용하여 의존성 제거
  • URL 단위 접근 제어를 간단히 설정 가능
  • AOP 방식과 역할 분리해 인증 전 사전 제어에 최적화

2. WebConfig에 등록

  • /admin/comments/** 경로에만 Interceptor 적용
@Override
public void addInterceptors(InterceptorRegistry registry) {
    registry.addInterceptor(adminAuthInterceptor)
            .addPathPatterns("/admin/comments/**");
}

개선된 점

  • 불필요한 경로까지 Interceptor가 적용되는 문제 방지
  • URI 패턴 기반으로 접근 제어 분리 가능
  • 테스트 대상 API 명확화 가능

2. Interceptor 테스트

1. JWT 테스트 유틸 구현

  • TestJwtUtil을 따로 만들어 테스트에서 사용할 수 있는 토큰 발급
  • JwtUtil.createToken(userId, email, UserRole.ADMIN) 방식 활용

2. MockMvc 통합 테스트 코드

mockMvc.perform(delete("/admin/comments/1")
        .header("Authorization", token))
    .andExpect(status().isOk());

개선된 점

  • 실제 요청 흐름 그대로 테스트 가능
  • 정상 / 비정상 JWT 요청에 대한 검증 포함
  • 로그 출력까지 확인하여 검증 가능

오늘의 결론

  1. Interceptor는 요청 사전 제어에 최적화되어 있음
  2. JwtFilter와 결합하여 인증 정보를 주입받을 수 있음
  3. 테스트에서도 실사용 흐름을 거의 완벽하게 검증 가능
profile
노력하고 있다니까요?

1개의 댓글

comment-user-thumbnail
2025년 4월 17일

인터셉터 공부하고 다시오겠습니다

답글 달기