필터를 사용하면 JSP/서블릿 등을 실행하기 이전에 요청이 올바른지 또는 자원에 접근할 수 있는 권한을 가졌는지의 여부를 미리 처리할 수 있다. JSP나 서블릿이 생성한 응답데이터를 변경하거나 취소할 수 있는 기능을 구현할 수도 있다.
간단하게 말해서 필터는 'HTTP 요청과 응답을 변경할 수 있는 재사용 가능한 클래스'
이다. 필터는 객체의 형태로 존재하며 클라이언트에서 오는 요청(request)과 최종 자원(JSP, 서블릿, 기타 자원) 사이에 위치하여 클라이언트의 요청 정보를 알맞게 변경할 수 있다. 또한 필터는 최종 자원과 클라이언트로 가는 응답(response) 사이에 위치하여 최종 자원의 요청 결과를 알맞게 변경할 수도 있다. 이를 그림으로 표현하면 다음과 같다.
위의 그림을 보면 필터는 클라이언트와 자원 사이에 위치하고 있다. 실제 자원이 받는 요청 정보는 필터가 변경한 요청 정보가 되며, 또한 클라이언트가 보는 응답 정보는 필터가 변경한 응답 정보가 된다.
클라이언트와 자원 사이에 한 개의 필터만 존재할 수 있는 것은 아니며, 여러 개의 필터가 모여 하나의 필터 체인(chain)
을 형성하게 된다. 아래 그림은 필터 체인의 구조를 보여주고 있다.
위의 그림과 같이 여러 개의 필터가 모여서 하나의 체인을 형성할 때 첫 번째 필터가 변경하는 요청 정보는 클라이언트의 요청 정보가 되지만, 체인의 두 번재 필터가 변경하는 요청 정보는 첫 번째 필터를 통해서 변경된 요청 정보가 된다. 즉, 요청 정보는 변경에 변경을 거듭하게 되는 것이다. 응답 정보의 경우도 요청 정보와 비슷한 과정을 거친다. 차이점이 있다면 필터의 적용 순서가 요청 때와는 반대라는 것이다.
필터는 정보를 변경할 뿐만 아니라 흐름도 변경할 수 있다. 즉, 필터는 클라이언트의 요청을 필터 체인의 다음 단계(결과적으로는 클라이언트가 요청한 자원)에 보내는 것이 아니라 다른 자원의 결과를 클라이언트에 전송할 수도 있다. 필터의 이러한 기능은 사용자 인증이나 권한 검사와 같은 기능을 구현할 때 용이하게 사용할 수 있다.
참고