Delivery Filter 적용기

송민지·2024년 9월 23일

회원가입/ 로그인 기능에 지원하면서 spring security가 아닌 그냥 일반 filter를 구현 하였습니다.

초기 filter

package com.sparta.deliveryapp.filter;

import com.sparta.deliveryapp.jwt.JwtUtil;
import org.springframework.boot.web.servlet.FilterRegistrationBean;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
public class FilterConfig {

    @Bean
    public FilterRegistrationBean<JwtAuthenticationFilter> JwtAuthenticationFilter() {
        FilterRegistrationBean<JwtAuthenticationFilter> registrationBean = new FilterRegistrationBean<>();
        JwtUtil jwtUtil = new JwtUtil();
        registrationBean.setFilter(new JwtAuthenticationFilter(jwtUtil));
        registrationBean.addUrlPatterns("/menu/*", "/order/*", "/store/*"); // 필터가 적용될 URL 패턴 설정
        return registrationBean;
    }

초기부터 사용한 filter를 등록하는 코드입니다.

filter가 적용되긴 했지만, jwt token을 분해하는데 필요한 key가 null값이 나오는등(..)의 문제가 발생하여 코드 수정이 필요했습니다.

위의 코드의 문제점은 다음과 같습니다.

package com.sparta.deliveryapp.filter;

import com.sparta.deliveryapp.jwt.JwtUtil;
import org.springframework.boot.web.servlet.FilterRegistrationBean;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
public class FilterConfig {

    @Bean
    public FilterRegistrationBean<JwtAuthenticationFilter> JwtAuthenticationFilter() {  //1번 문제
        FilterRegistrationBean<JwtAuthenticationFilter> registrationBean = new FilterRegistrationBean<>();
        JwtUtil jwtUtil = new JwtUtil(); //2번 문제
        registrationBean.setFilter(new JwtAuthenticationFilter(jwtUtil)); //3번 문제
        registrationBean.addUrlPatterns("/menu/*", "/order/*", "/store/*"); // 필터가 적용될 URL 패턴 설정 4번 문제
        return registrationBean;
    }

2번 문제

filter를 등록하기 위해 사용된 JwtAuthenticationFilter는 JwtUtill 객체를 주입받고 있습니다.

public class JwtAuthenticationFilter implements Filter {
    private final JwtUtil jwtUtil;

    public JwtAuthenticationFilter(JwtUtil jwtUtil) {
        this.jwtUtil = jwtUtil;
    }

spring 컨터이너가 jwtUtil객체를 관리하고 있는 상태이며 새로운 객체를 생성할 필요가 없었습니다.

1번 문제

제네릭으로 FilterRegistrationBean이 등록하려는 필터 타입이 JwtAuthenticationFilter라는 것을 알려줍니다.
하지만 JwtAuthenticationFilter가 어디서 오는지 명시되지 않았기 때문에, 스프링이 이 필터 객체를 제공하고 생성할 수 없습니다.

3번 문제

새로 객체를 생성할 필요가 없었습니다.

4번 문제

필터가 적용될 코드는 전체로 하되, JwtAuthenticationFilter에서 예외를 설정할 수 있습니다.

수정된 filter

package com.sparta.deliveryapp.filter;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.web.servlet.FilterRegistrationBean;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration
public class FilterConfig {

    @Bean
    public FilterRegistrationBean<JwtAuthenticationFilter> JwtAuthenticationFilter(@Autowired JwtAuthenticationFilter jwtAuthenticationFilter) {
        FilterRegistrationBean<JwtAuthenticationFilter> registrationBean = new FilterRegistrationBean<>();

        registrationBean.setFilter(jwtAuthenticationFilter);
        registrationBean.addUrlPatterns("/*"); // 필터가 적용될 URL 패턴 설정

        return registrationBean;
    }
}
profile
항상 밝게

0개의 댓글