🔥스파르타 TIL (Spring)

필터(Filter) 란?

승승장규 2025. 2. 10. 10:56

웹 애플리케이션에서 관리되는 영역으로 클라이언트에서 오는 요청과 응답에 대해서 최초, 최종 단계에 위치한다.

요청과 응답에 정보를 변경하거나 부가적인 기능을 추가할 수 있다. ex) Logging, 보안, 인증·인가 관련

 

Filter 0 => Logging용 필터 Filter 1 => 인증·인가용 필터라고 가정해 보자

보기 쉽게 사진을 돌려놓았습니다. 흐름은 오른쪽 방향으로 생각해주세요.

Logging용 필터 ▼

public class LoggingFilter implements Filter {

    @Override
    // Filter를 implements 한 뒤 사용 가능한 doFilter 메서드, FilterChain은 filter를 이동시키기 위해 사용
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException{
        // HttpServletRequest로 캐스팅한 후 사용
        HttpServletRequest httpServletRequest = (HttpServletRequest) request;
        String url = httpServletRequest.getRequestURI();

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

 

 

JWT 활용하기에서 인증·인가용 필터에서 사용하는 메서드를 확인해 보자

 

JWT 활용하기

인증(Authentication)과 인가(Authorization) 란? 인증(Authentication)과 인가(Authorization) 란?인증 ▼해당 유저가 실제 유저인지 인증하는 개념지문인식, 로그인 등 실제 유저가 맞는지 확인하는 장치인가 ▼

seungg8361.tistory.com


인증·인가용 필터 ▼

public class AuthFilter implements Filter {

    private final UserRepository userRepository;

    private final JwtUtil jwtUtil;

    @Override
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
        HttpServletRequest httpServletRequest = (HttpServletRequest) request;
        String url = httpServletRequest.getRequestURI();
        // hasText : null 인지 공백인지 확인하는 메서드
        if(StringUtils.hasText(url)&&
                (url.startsWith("/api/user")||url.startsWith("/css")||url.startsWith("/js"))){
            // 회원가입, 로그인 관련 API 는 인증 필요없이 요청 진행
            chain.doFilter(request,response); // 다음 Filter로 이동
        }else{
            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 IllegalArgumentException("Not Found User"));

                request.setAttribute("user", user);
                chain.doFilter(request,response);
            }else{
                throw new IllegalArgumentException("Not Found Token");
            }
        }
    }
}

 

 

 

이후 Spring Security를 학습하며 내용을 더 추가해 보자🖐️🖐️