[SPRING:이론] 12 : 필터

김승수·2024년 6월 4일
0

SPRING

목록 보기
12/27

⏰ 2024. 06. 04 화

✔ 스프링 이론 강의를 듣고 정리하면서 작성했습니다.

💡 목차

  1. 필터 란?
  2. 예시) AuthFilter 클래스

Filter

필터 란?

  • Web 애플리케이션에서 관리되는 영역으로 Client로 부터 오는 요청과 응답에 대해 최초/최종 단계의 위치에서 요청과 응답의 정보를 변경하거나 부가적인 기능을 추가하는 역할을 수행한다.

  • 주로 범용적으로 처리해야 하는 작업들, 예를 들어 로깅이나 보안 처리, 인증, 인가와 관련된 로직들을 처리한다.

  • Filter를 쓰는 궁극적인 목적은 인증, 인가와 관련된 로직을 비지니스 로직과 분리하여 관리할 수 있다는 장점이 있다.

  • Filter는 한 개만 사용되는게 아니라 여러개가 Chain 형식으로 묶여서 처리된다.

EX) AuthFilter 클래스 : 인증 및 인가를 처리하는 필터

	@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을 가져와서 필터를 적용한다.
profile
개발하는 미어캣

0개의 댓글