[TIL] Day25_Filter

오진선·2024년 2월 29일
0

TIL

목록 보기
16/29

Today I Learned

Filter

Filter의 특징

  • Web 애플리케이션에서 관리되는 영역
  • Client로 부터 오는 요청과 응답에 대해 최초/최종 단계의 위치
  • 요청과 응답의 정보를 변경/추가 가능

Filter의 역할

  • 로깅 및 보안 처리에 활용
  • 인증, 인가와 관련된 로직 처리
  • 인증, 인가와 관련된 로직을 비즈니스 로직과 분리하여 관리 가능

Filter의 메소드

  • init() : 필터 가 생성될 때 수행되는 메소드
  • doFilter() : Request, Response가 필터를 거칠 때 수행되는 메소드
  • destroy() : 필터가 소멸될 때 수행되는 메소드

Filter Chain

Filter 적용

@Slf4j(topic = "LoggingFilter")
@Component
@Order(1)
public class LoggingFilter implements Filter {
    @Override
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
        // 전처리
        HttpServletRequest httpServletRequest = (HttpServletRequest) request;
        String url = httpServletRequest.getRequestURI();
        log.info(url);

        chain.doFilter(request, response); // 다음 Filter 로 이동

        // 후처리
        log.info("비즈니스 로직 완료");
    }
}
  • @Order(1) : 필터의 순서 지정
  • chain.doFilter(request, response); : 다음 Filter로 이동
  • log.info("비즈니스 로직 완료"); : client가 완료 확인

AuthFilter : 인증 및 인가 처리 필터

@Slf4j(topic = "AuthFilter")
@Component
@Order(2)
public class AuthFilter implements Filter {

    private final UserRepository userRepository;
    private final JwtUtil jwtUtil;

    public AuthFilter(UserRepository userRepository, JwtUtil jwtUtil) {
        this.userRepository = userRepository;
        this.jwtUtil = jwtUtil;
    }

    @Override
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
        HttpServletRequest httpServletRequest = (HttpServletRequest) request;
        String url = httpServletRequest.getRequestURI();

        if (StringUtils.hasText(url) &&
                (url.startsWith("/api/user") || url.startsWith("/css") || url.startsWith("/js"))
        ) {
            // 회원가입, 로그인 관련 API 는 인증 필요없이 요청 진행
            chain.doFilter(request, response); // 다음 Filter 로 이동
        } else {
            // 나머지 API 요청은 인증 처리 진행
            // 토큰 확인
            String tokenValue = jwtUtil.getTokenFromRequest(httpServletRequest);

            if (StringUtils.hasText(tokenValue)) { // 토큰이 존재하면 검증 시작
                // JWT 토큰 substring
                String token = jwtUtil.substringToken(tokenValue);

                // 토큰 검증
                if (!jwtUtil.validateToken(token)) {
                    throw new IllegalArgumentException("Token Error");
                }

                // 토큰에서 사용자 정보 가져오기
                Claims info = jwtUtil.getUserInfoFromToken(token);

                User user = userRepository.findByUsername(info.getSubject()).orElseThrow(() ->
                        new NullPointerException("Not Found User")
                );

                request.setAttribute("user", user);
                chain.doFilter(request, response); // 다음 Filter 로 이동
            } else {
                throw new IllegalArgumentException("Not Found Token");
            }
        }
    }

}
profile
₍ ᐢ. ̫ .ᐢ ₎

0개의 댓글