스프링 미니 프로젝트 - Filter 사용하여 Login Filter 구현

Zyoon·2025년 5월 23일

미니프로젝트

목록 보기
12/35
post-thumbnail

📘Filter 의 사용이유와 사용법 정리. Login Filter 구현


0. Filter 사용 이유

  • 모든 요청과 응답을 가로채서 처리한다. (로그인, 로그 기록, 인코딩 설정 등 공통작업)
  • 요청이 컨트롤러에 도달하기 전에 작업을 하기 때문에 불필요한 요청이나 보안 점검이 가능하다
  • 서블릿 표준이라 스프링 외 다른 자바 웹 환경에서도 사용 가능하다.

1. Filter 클래스 생성

  • Login Filter 구현을 위해 우선 Filter 클래스를 생성해준다.
  • Filter 를 거치지 않고 사용할 url 배열로 WHITE_LIST 를 만들어준다.
  • Filter를 구현해서 모든 HTTP 요청을 가로채서 로그인 여부 등을 확인해준다.
  • 클라이언트가 서버에 요청할 때 doFilter() 메서드가 실행되면서 필터가 실행된다.
  • 필터를 거치면 chain 을 통해 다음 로직으로 넘어가고, 필터를 거치지 못했다면(로그아웃 상태 등) 예외와 함께 리턴된다.
public class LoginFilter implements Filter {

    private static final String[] WHITE_LIST = {
            "/users/signup",
            "/users/login",
            "/board",
            "/board/detail/*"
    };
		
		//서버 요청 시 실행
    @Override
    public void doFilter(ServletRequest request,
                         ServletResponse response,
                         FilterChain chain
    ) throws IOException, ServletException {
        HttpServletRequest httpRequest = (HttpServletRequest) request;
        HttpServletResponse httpResponse = (HttpServletResponse) response;

        String requestURI = httpRequest.getRequestURI();
				
        if (!isWhiteList(requestURI)) {
		        //통과 못하면 예외 처리
            if(isAlreadyLogin(httpRequest, httpResponse)) return;
        }
				//통과시 다음 로직으로 넘어간다.
        chain.doFilter(request, response);
    }
    
    //whiteList 인지 확인
    private boolean isWhiteList(String requestURI) {

        return PatternMatchUtils.simpleMatch(WHITE_LIST, requestURI);
    }
}
  • 로그인 상태인지 확인한 뒤 결과값을 리턴해준다.
  • Filter 는서블릿 단계에서 동작하기 때문에 CustomException 같은 전역 예외 처리기로 예외를 날릴수 없다.
  • 그래서 예외 메세지를 직접 만들어서 날려주는 경우가 일반적이다.
private boolean isAlreadyLogin(HttpServletRequest httpRequest, HttpServletResponse httpResponse) throws IOException {

    HttpSession session = httpRequest.getSession(false);
		
		//예외 메세지 날려준다.(간단한버전)
    if (session == null || session.getAttribute(Const.USER_ID) == null) {
		    httpResponse.setStatus(HttpServletResponse.SC_UNAUTHORIZED); // 401
		    httpResponse.setContentType("application/json;charset=UTF-8"); //한글 타입 표기
		    httpResponse.getWriter().write("로그인이 필요합니다."); //전달 메세지
        return true;
    }

    return false;
}

2. Config 클래스 생성

  • LoginFilter를 등록해주는 설정을 해준다.
  • @Configuration : 이 클래스가 설정파일이라는 의미이다.
  • 로그인 필터를 서블릿 필터로 등록해준다. (@Bean 등록)
  • WHITE_LIST 를 따로 지정해줬기 때문에 모든 url 을 등록해준다.
@Configuration
public class SecurityConfig {

    //로그인 필터를 서블릿 필터로 등로
    @Bean
    public FilterRegistrationBean<LoginFilter> loginFilter() {
        FilterRegistrationBean<LoginFilter> filterRegistrationBean = new FilterRegistrationBean<>();
        filterRegistrationBean.setFilter(new LoginFilter()); // Filter 등록
        filterRegistrationBean.setOrder(1); // Filter 순서 1 설정
        filterRegistrationBean.addUrlPatterns("/*"); // 전체 URL에 Filter 적용
        return filterRegistrationBean;
    }
}

3. 사용 예시

  • PostMan으로 비 로그인 상태로 url 을 들어가본다.
  • 401 Not Found 에러 메세지가 표시된다.

profile
기어 올라가는 개발

0개의 댓글