반응형

Servlet Filter: 개념과 활용

Servlet Filter는 웹 애플리케이션에서 HTTP 요청 및 응답을 가로채 특정 작업을 수행할 수 있는 기능을 제공합니다. 주로 요청 데이터 검증, 응답 수정, 로깅, 인증 및 권한 검사 등에 사용됩니다.


Servlet Filter란?

주요 특징:

  1. 요청 및 응답 처리: 클라이언트 요청 전/후, 서블릿 호출 전/후에 작업 수행.
  2. 재사용 가능: 여러 서블릿에 동일한 필터를 적용 가능.
  3. 체이닝: 여러 필터를 순서대로 연결하여 처리 가능.

동작 흐름:

  1. 클라이언트가 요청을 보냄.
  2. 필터가 요청을 가로채고 처리.
  3. 필터 체인이 끝나면 서블릿으로 요청 전달.
  4. 서블릿에서 응답을 생성하여 필터 체인으로 반환.
  5. 필터가 응답을 처리하고 클라이언트로 반환.

자바에서 Servlet Filter 구현

1. 필터 인터페이스 구현

Servlet Filter를 구현하려면 javax.servlet.Filter 인터페이스를 구현해야 합니다.

예시: 로그인 인증 필터

import javax.servlet.*;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;

public class AuthenticationFilter implements Filter {

    @Override
    public void init(FilterConfig filterConfig) throws ServletException {
    // 초기화 작업 (필요 시 구현)
    }

    @Override
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
    throws IOException, ServletException {

        HttpServletRequest httpRequest = (HttpServletRequest) request;
        HttpServletResponse httpResponse = (HttpServletResponse) response;

        // 세션에서 로그인 정보 확인
        if (httpRequest.getSession().getAttribute("user") == null) {
        	// 로그인되지 않은 경우 로그인 페이지로 리다이렉트
	        httpResponse.sendRedirect("/login.jsp");
        } else {
        	// 로그인된 경우 요청을 다음 필터나 서블릿으로 전달
    	    chain.doFilter(request, response);
        }
    }

    @Override
    public void destroy() {
    // 자원 정리 작업 (필요 시 구현)
    }
}

2. web.xml에 필터 등록

필터를 서블릿 컨테이너에 등록하고 URL 패턴을 매핑합니다.

<filter>
	<filter-name>AuthenticationFilter</filter-name>
	<filter-class>com.example.AuthenticationFilter</filter-class>
</filter>

<filter-mapping>
    <filter-name>AuthenticationFilter</filter-name>
    <url-pattern>/*</url-pattern>
</filter-mapping>

3. 애너테이션 기반 등록 (대체 방식)

Servlet 3.0 이상에서는 @WebFilter 애너테이션을 사용하여 필터를 등록할 수 있습니다.

import javax.servlet.*;
import javax.servlet.annotation.WebFilter;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;

@WebFilter(filterName = "AuthenticationFilter", urlPatterns = {"/protected/*", "/admin/*"})
public class AuthenticationFilter implements Filter {
    @Override
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
    throws IOException, ServletException {
        HttpServletRequest httpRequest = (HttpServletRequest) request;
        HttpServletResponse httpResponse = (HttpServletResponse) response;

        if (httpRequest.getSession().getAttribute("user") == null) {
	        httpResponse.sendRedirect("/login.jsp");
        } else {
    	    chain.doFilter(request, response);
        }
    }
}

이름 및 URL 패턴 지정 이유

필터 이름 지정:

  • 필터 이름(filterName)은 필터를 식별하는 데 사용됩니다. 프로젝트가 커지고 여러 필터를 사용할 때 유지보수성과 가독성을 높이기 위해 필수적입니다.

URL 패턴 지정:

  • urlPatterns는 필터를 적용할 경로를 지정합니다. 특정 요청에만 필터를 적용하여 불필요한 작업을 줄이고 성능을 최적화할 수 있습니다.
    • 예: /protected/*protected 디렉토리 아래의 모든 요청에 필터를 적용합니다.
    • 예: /admin/*는 관리자 전용 URL에만 필터를 적용하여 권한 관리를 강화합니다.

 


로그인 필터의 활용 시나리오

  1. 로그인 검증:
    • 사용자 요청이 들어올 때 세션을 확인하여 로그인 여부를 검증.
    • 로그인되지 않은 사용자를 로그인 페이지로 리다이렉트.
  2. 로깅:
    • 요청 및 응답의 메타데이터를 기록하여 디버깅 및 감사용 로그 생성.
  3. 권한 확인:
    • 사용자의 역할(Role)을 확인하여 권한 없는 요청 차단.

권한 확인 필터 예시:

if (httpRequest.getSession().getAttribute("role") == null ||
!httpRequest.getSession().getAttribute("role").equals("ADMIN")) {
    httpResponse.sendError(HttpServletResponse.SC_FORBIDDEN, "Access Denied");
    return;
}

결론

Servlet Filter는 요청과 응답을 가로채서 처리할 수 있는 강력한 도구입니다. 이를 활용하면 인증, 권한 검사, 로깅 등 다양한 작업을 중앙화하여 효율적인 웹 애플리케이션 관리가 가능합니다. 자바에서 Servlet Filter를 구현하여 깔끔하고 확장 가능한 코드를 작성해 보세요!

 

반응형

'개발 부트캠프 > 백엔드' 카테고리의 다른 글

[Spring] IoC & DI  (0) 2025.02.04
[Java] DBCP  (0) 2025.01.16
[Java] JSON  (0) 2025.01.16
[Java] HTTP 요청 처리하기  (0) 2025.01.16
[Java] SQL Injection  (1) 2025.01.10

+ Recent posts