반응형
Servlet Filter: 개념과 활용
Servlet Filter는 웹 애플리케이션에서 HTTP 요청 및 응답을 가로채 특정 작업을 수행할 수 있는 기능을 제공합니다. 주로 요청 데이터 검증, 응답 수정, 로깅, 인증 및 권한 검사 등에 사용됩니다.
Servlet Filter란?
주요 특징:
- 요청 및 응답 처리: 클라이언트 요청 전/후, 서블릿 호출 전/후에 작업 수행.
- 재사용 가능: 여러 서블릿에 동일한 필터를 적용 가능.
- 체이닝: 여러 필터를 순서대로 연결하여 처리 가능.
동작 흐름:
- 클라이언트가 요청을 보냄.
- 필터가 요청을 가로채고 처리.
- 필터 체인이 끝나면 서블릿으로 요청 전달.
- 서블릿에서 응답을 생성하여 필터 체인으로 반환.
- 필터가 응답을 처리하고 클라이언트로 반환.
자바에서 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에만 필터를 적용하여 권한 관리를 강화합니다.
로그인 필터의 활용 시나리오
- 로그인 검증:
- 사용자 요청이 들어올 때 세션을 확인하여 로그인 여부를 검증.
- 로그인되지 않은 사용자를 로그인 페이지로 리다이렉트.
- 로깅:
- 요청 및 응답의 메타데이터를 기록하여 디버깅 및 감사용 로그 생성.
- 권한 확인:
- 사용자의 역할(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 |