Spring Level2 Filter 구현

song yuheon·2023년 9월 2일
0

Spring

목록 보기
29/93
post-thumbnail

필터 흐름도


1. Logging 필터 구현

package com.sparta.memo.filter;

import jakarta.servlet.*;
import jakarta.servlet.http.HttpServletRequest;
import lombok.extern.slf4j.Slf4j;
import org.springframework.core.annotation.Order;
import org.springframework.stereotype.Component;

import java.io.IOException;

@Slf4j(topic = "LoggingFilter")
@Component
@Order(1)
public class LoggingFilter implements Filter {
    @Override
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException, IOException {
        // ServletRequest를 HttpServletRequest로 다운캐스팅하여 HTTP 관련 메서드를 사용할 수 있게 함
        HttpServletRequest httpServletRequest = (HttpServletRequest) request;

        // 현재 요청의 URI를 가져옴
        String url = httpServletRequest.getRequestURI();

        // 가져온 URI를 로그에 출력
        log.info(url);

        // 요청과 응답을 다음 필터로 전달하거나, 해당 필터가 마지막 필터라면 실제 서블릿이나 JSP로 전달
        chain.doFilter(request, response);

        // 요청 처리 후 "비즈니스 로직 완료" 라는 메시지를 로그에 출력
        log.info("비즈니스 로직 완료");
    }

}

  • 필터 구현

    1. 로그 출력을 위한 @Slf4j(topic = "LoggingFilter") 어노테이션을 사용하여 "LoggingFilter"라는 이름의 토픽으로 SLF4J 로깅을 진행한다.

    2. @Component 어노테이션을 통해 Spring의 컴포넌트 스캐닝에 의해 해당 클래스를 빈으로 등록한다.

    3. 필터의 실행 순서를 @Order(1)로 지정하여, 이 필터가 다른 필터들 중에서 가장 먼저 실행되도록 한다.

    4. 구현체에서는 Filter 인터페이스를 구현하여 사용자 정의 필터를 생성한다.

    5. doFilter 메서드 내에서 ServletRequest 객체를 HttpServletRequest 객체로 다운캐스팅하여 HTTP 특화된 메서드에 접근한다.

    6. 그 후 현재 HTTP 요청의 URI 정보를 가져와 로그로 출력한다.

    7. 현재 요청을 다음 필터나 서블릿, JSP로 전달하고, 요청 처리가 완료된 후 "비즈니스 로직 완료"라는 메시지를 로그로 출력한다.


2. AuthFilter 필터 구현




  1. 로그 출력을 위한 @Slf4j(topic = "AuthFilter") 어노테이션을 사용하여 "AuthFilter"라는 이름의 토픽으로 SLF4J 로깅을 설정한다.

  2. @Component 어노테이션을 활용해 Spring의 컴포넌트 스캐닝을 통해 해당 클래스를 빈으로 등록한다.

  3. 이 필터의 실행 순서를 @Order(2)로 설정하여, Logging 필터 다음에 실행되도록 한다.

  • 필터 구현

    1. 구현체에서는 Filter 인터페이스를 구현한다. 필터 내에서는 UserRepositoryJwtUtil이라는 두 가지 주요한 멤버 변수를 선언한다. 이들은 사용자 정보 관리와 JWT 토큰 관련 기능을 제공한다. 생성자를 통해 이 두 객체를 주입받게 구성되어 있다.

    2. doFilter 메서드 내부에서는 먼저 요청 객체를 HttpServletRequest로 형변환한다. 그 후, 현재 요청의 URI 정보와 HTTP 메서드를 가져온다. 만약 요청이 로그인 or 회원가입 API 혹은 GET 요청이면 인증 절차를 건너뛰고 다음 필터나 대상으로 요청을 전달한다.

    3. 그 외의 API 요청의 경우, JWT 토큰을 요청 헤더에서 가져와서 인증 절차를 진행한다. 토큰의 유효성을 검증하고, 유효한 토큰의 경우에는 사용자 정보를 추출한다. 데이터베이스에서 해당 사용자 정보를 조회하고, 현재 요청 객체에 사용자 정보를 속성으로 추가한다.


2-2. Question HttpServletRequest와 HttpServletResponse란?


profile
backend_Devloper

0개의 댓글