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);
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"))
) {
chain.doFilter(request, response);
} else {
String tokenValue = jwtUtil.getTokenFromRequest(httpServletRequest);
if (StringUtils.hasText(tokenValue)) {
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);
} else {
throw new IllegalArgumentException("Not Found Token");
}
}
}
}