회원가입/ 로그인 기능에 지원하면서 spring security가 아닌 그냥 일반 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;
}
filter를 등록하기 위해 사용된 JwtAuthenticationFilter는 JwtUtill 객체를 주입받고 있습니다.
public class JwtAuthenticationFilter implements Filter {
private final JwtUtil jwtUtil;
public JwtAuthenticationFilter(JwtUtil jwtUtil) {
this.jwtUtil = jwtUtil;
}
spring 컨터이너가 jwtUtil객체를 관리하고 있는 상태이며 새로운 객체를 생성할 필요가 없었습니다.
제네릭으로 FilterRegistrationBean이 등록하려는 필터 타입이 JwtAuthenticationFilter라는 것을 알려줍니다.
하지만 JwtAuthenticationFilter가 어디서 오는지 명시되지 않았기 때문에, 스프링이 이 필터 객체를 제공하고 생성할 수 없습니다.
새로 객체를 생성할 필요가 없었습니다.
필터가 적용될 코드는 전체로 하되, JwtAuthenticationFilter에서 예외를 설정할 수 있습니다.
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;
}
}