⏰ 2024. 06. 04 화
✔ 스프링 이론 강의를 듣고 정리하면서 작성했습니다.
Filter

Web 애플리케이션에서 관리되는 영역으로 Client로 부터 오는 요청과 응답에 대해 최초/최종 단계의 위치에서 요청과 응답의 정보를 변경하거나 부가적인 기능을 추가하는 역할을 수행한다.
주로 범용적으로 처리해야 하는 작업들, 예를 들어 로깅이나 보안 처리, 인증, 인가와 관련된 로직들을 처리한다.
Filter를 쓰는 궁극적인 목적은 인증, 인가와 관련된 로직을 비지니스 로직과 분리하여 관리할 수 있다는 장점이 있다.
Filter는 한 개만 사용되는게 아니라 여러개가 Chain 형식으로 묶여서 처리된다.
@Slf4j(topic = "AuthFilter")
@Component
@Order(1)
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, ServletExcep {
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");
}
}
}
}
Filter 인터페이스를 implements해서 구현한다.Filter 인터페이스의 doFilter()를 @Override를 해 필터의 동작 로직을 구현한다.@Order(n) 어노테이션으로 필터의 순서를 지정한다.chain.doFilter(request, response) 메서드를 통해 다음 Filter로 이동한다.httpServletRequest.getRequestURI() 메서드를 통해 요청으로 들어온 URL을 가져와서 필터를 적용한다.