
Servlet Filter
요청(Request) 과 응답(Response) 을 처리하는 중간 필터 역할하는 객체이다.
Servlet 컨테이너에 의해 요청이 Servlet에 도달하기 전,
혹은 Servlet이 응답을 클라이언트에 전달하기 전에 특정 작업을 수행하도록 해준다.
목적
요청 전 처리: 필터는 Servlet이 요청을 처리하기전에 실행된다.
- 로그 기록, 인증, 권한 검사 등을 할 수 있다.
응답 후 처리: 필터는 Servlet이 응답을 처리한 후 클라이언트에게 응답을 보내기 전에 실행된다.,
- 응답 수정, 압축, 보안 헤더 추가 등을 할 수 있다.
주요 메서드
doFilter(): 필터의 주요 동작을 처리하는 메서드. 아래와 같은 내용을 처리할 수 있다.
- 요청과 응답 변경
- 필터는 doFilter() 메서드에서 요청(Request) / 응답(Response) 객체를 수정할 수 있다.
- 요청: 클라이언트가 서버에서 보낸 데이터, 요청 객체를 수정/가공 후 Servlet으로 전달할 수 있다.
- 응답: 서버가 클라이언트로 보내는 데이터, 응답을 수정하거나 추가적인 데이터를 삽입할 수 있다.
- 필터는 doFilter() 메서드에서 요청(Request) / 응답(Response) 객체를 수정할 수 있다.
더보기
1. 요청 변경
@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
throws IOException, ServletException {
HttpServletRequest httpRequest = (HttpServletRequest) request;
// 요청에서 특정 파라미터 값을 변경
String modifiedParam = httpRequest.getParameter("param");
if (modifiedParam != null) {
// 예: 요청 파라미터를 수정해서 다른 값으로 설정할 수 있음
request.setAttribute("param", modifiedParam.toUpperCase());
}
// 필터 체인에서 다음 필터나 서블릿으로 요청을 전달
chain.doFilter(request, response);
}
2. 응답 변경
@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
throws IOException, ServletException {
HttpServletResponse httpResponse = (HttpServletResponse) response;
// 응답 헤더에 추가적인 정보 삽입
httpResponse.addHeader("X-Frame-Options", "DENY");
// 필터 체인에서 응답을 계속 전달
chain.doFilter(request, response);
}
- Servlet으로 전달
- doFilter() 메서드 내 chain.doFileter(request, response)가 호출 됨에 대라마 요청/응답 객체를 Servlet 혹은 다음 필터로 전달하는 역할을 한다.
- Filter는 요청을 처리 후 반드시 doFilter()를 호출하여 다음 단계로 처리가 이어지도록 해야한다.
- 해당 메서드는 필터 체인에서 순차적으로 다음 필터나 Servlet을 호출하기 한다.
더보기
3. FilterChain을 통한 요청 전달
@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
throws IOException, ServletException {
// 요청을 처리한 후 필터 체인으로 전달
chain.doFilter(request, response); // 서블릿으로 요청 전달
}
- chain.doFilter 호출 > 요청/응답은 다음 필터나 Servlet으로 전달된다.
- 만약 doFilter() 에서 요청을 수정한 후 해당 메서드를 호출할 경우 수정된 요청을 Servlet이 처리한다.
- 응답 수정
- Filter는 응답(Response)을 생성 후 수정할 수 있다.
- Servlet이 응답 생성 후 Filter는 해당 응답에 추가적인 작업을 할 수 있다.
- 응답 본문 압축 / 보안 헤더 추가 / 에러 페이지 처리 등
더보기
@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
throws IOException, ServletException {
// 응답이 HTML일 때, 응답 본문을 수정하려면, ResponseWrapper 사용 필요
HttpServletResponse httpResponse = (HttpServletResponse) response;
MyResponseWrapper responseWrapper = new MyResponseWrapper(httpResponse);
// 필터 체인을 통해 요청을 처리
chain.doFilter(request, responseWrapper);
// 서블릿에서 응답이 끝난 후 본문을 수정
String originalContent = responseWrapper.getResponseContent();
String modifiedContent = originalContent.replace("Hello", "Hi");
// 수정된 응답 내용 전달
httpResponse.getWriter().write(modifiedContent);
}
- MyResponseWrapper는 HttpServletResponse를 래핑하여 응답 본문을 수정할 수 있다.
- 응답 본문을 직접 수정한 후, 클라이언트에게 전달할 수 있다.
init(): 필터 초기화 시 호출된다.
- 필터가 시작될 때 필요한 리소스를 설정한다.
destroy(): 필터가 종료될 때 호출된다. 필터 리소스를 정리하는 데 사용된다.
작동 방식
1. Filter 등록
- (Spring에서는) @Configuration 클래스에서 필터를 등록할 수 있다.
2. 요청 처리
- 클라이언트가 HTTP 요청을 보내면 필터가 이를 가로챈 후 아래의 처리를 할 수 있다.
- 요청을 처리 하거나 수정
- 체인의 다음 필터로 요청 전달
- Servlet으로 전달
3. 응답 처리
- Servlet이 응답을 생성한 후, 필터는 응답을 수정하거나 추가적인 작업을 수행한 후 클라이언트에 반환한다.
예제
더보기
1. Filter 구현
@WebFilter("/*") // 모든 URL에 필터 적용
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;
// 세션에서 사용자 정보 확인
HttpSession session = httpRequest.getSession();
Object user = session.getAttribute("user");
// 로그인한 사용자가 아니면 로그인 페이지로 리다이렉트
if (user == null) {
httpResponse.sendRedirect("/login"); // 로그인 페이지로 리다이렉트
} else {
// 로그인된 사용자라면 요청을 계속 처리
chain.doFilter(request, response);
}
}
@Override
public void destroy() {
// 필터 종료 시 리소스 정리
}
}
2. Spring Boot에서 Filter 등록
@Configuration
public class FilterConfig {
@Bean
public FilterRegistrationBean<AuthenticationFilter> authenticationFilter() {
FilterRegistrationBean<AuthenticationFilter> registrationBean = new FilterRegistrationBean<>();
registrationBean.setFilter(new AuthenticationFilter());
registrationBean.addUrlPatterns("/secured/*"); // 특정 URL 패턴에 필터 적용
return registrationBean;
}
}
필터 체인(FilterChain)
필터는 FilterChain을 통해 다른 필터로 요청을 전달한다.
(아래 코드 참고) chain.doFilter(request, resposnse)는
필터 체인 내에서 다음 필터로 요청을 전달하는 역할을 하며, 여러 필터가 순차적으로 처리된다.
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
throws IOException, ServletException {
// 필터에서 처리할 내용
// ...
// 필터 체인 내의 다음 필터로 요청을 전달
chain.doFilter(request, response);
// 응답 후 처리할 내용
// ...
}
Filter 활용 예시
- 로그 기록: 요청이 들어올 때마다 로그를 남기는 필터
- 보안 헤더 추가: 모든 응답에 보안 관련 헤더를 추가하는 필터
- 인증 및 권한 검사: 로그인되지 않은 사용자가 특정 페이지에 접근하지 못하도록 차단하는 필터
- 데이터 압축: 응답 데이터를 압축하여 전송하는 필터
정리
- Servlet Filter는 Http 요청 및 응답을 처리할 수 있는 도구
- 로그인 필터 구현 시 사용자의 로그인 여부를 쉽게 확인할 수 있으며,
- 인증되지 않은 사용자는 접근을 제한할 수 있다.
'Dev > Spring' 카테고리의 다른 글
[Spring] JWT(JSON Web Token) (0) | 2025.05.29 |
---|---|
[Spring] Session & Cookie (로그인 인증) (0) | 2025.05.26 |
[Spring] 연관 관계 매핑 (0) | 2025.05.19 |
[Spring] JPA (0) | 2025.05.15 |
[Spring] IP / Port / Domain / URL (0) | 2025.05.13 |