Filter & Wrapper

kailyn·2024년 9월 18일

Servlet

목록 보기
5/6

01. Servlet Filter

01. Servlet Filter 개요

01-01. Servlet Filter란

  • javax.servlet.Filter Interface를 상속 받아 구현하는 Class이다.
  • HTTP 요청과 응답 사이에서 전달되는 데이터를 가로채어, 서비스에 맞게 변경하고 걸러내는 필터링 작업을 수행한다.
  • 필터 설정에 따라 해당하는 요청 및 응답 시에 반드시 거쳐야 하며, 비밀번호 암호화 처리, 인코딩 설정 등 공통 관리에 해당하는 기능을 수행할 수 있다.
  • 필터는 인증 필터, 압축 필터, 리소스 접근 트리거 이벤트 필터, 로깅 필터, 이미지 변환 필터, 토크나이져 필터 등 다양하게 활용 가능하다.

01-02. Servlet Filter 처리 내용

  • Request에 대한 처리
    • 보안 관련 사항
    • 요청 header와 body 형식 지정
    • 요청에 대한 log 기록 유지
  • Response에 대한 처리
    • 응답 stream 압축
    • 응답 stream 내용 추가 및 수정
    • 새로운 응답 작성
    • 여러 가지 필터를 연결(= chain, 서로 호출)하여 사용할 수 있다.

01-03. Servlet Filter 동작 구조

  • 요청 및 응답에 따른 서블릿 수행 전후에 지정한 필터를 거치며 데이터를 가공하는 역할을 한다.

01-04. Servlet Filter 내부 동작

  • 서블릿의 실행 전후에 동작하므로 서블릿의 service() 메소드 실행 전후에 작동한다.
  • 필터가 여러 개일 경우 stack 방식으로 순차적으로 수행된다.

01-05. Filter Chain (Interface)

  • Filter를 여러 개 사용하는 경우, Filter Chain으로 작동할 수 있다.
  • Chain처럼 서로 연결되어 있는 Filter를 doFilter() 메소드를 이용하여 순차적으로 실행시키는 인터페이스이다.
  • doFilter() 메소드는 chain으로 연결되어 있는 다음 필터 또는 서블릿을 실행하는 메소드이다.
    doFilter(ServletRequest req, ServletResponse res);
  • 마지막 필터가 실행된 후에는 service() 메소드를 실행시켜 서블릿의 메소드(= doGet(), doPost())를 실행한다.

02. Servlet Filter 사용

02-01. DD 설정 (= web.xml 설정)

  1. Filter를 등록한다.

    <filter>
    	<filter-name>*Filter 설정명*</filter-name>
    	<filter-class>*Filter 구현 Class명*</filter-class>
    	<init-param> // filter에서 사용한 값 설정
    		<param-name>*초기값 설정명*</param-name>
    		<param-value>*초기 설정값*</param-value>
    	</init-param>
    </filter>
  2. url 패턴과 Filter를 mapping한다.

    <filter-mapping>
    	<filter-name>*등록된 Filter명*</filter-name>
    	<url-pattern>*요청할 페이지 형식*</url-pattern>
    </filter-mapping>
  3. Filter를 적용할 서블릿을 지정하여, 서블릿과 Filter를 mapping한다.

    <filter-mapping>
    	<filter-name>*등록된 Filter명*</filter-name>
    	<servlet-name>*적용할 Servlet명*</servlet-name>
    </filter-mapping>
  • mapping 방법이 두 가지이나, url-pattern이 우선 적용된다.

  • (참고) dispatcher처리

    • 2.4 버전부터 dispatcher 요청도 Filter를 적용할 수 있다.
    • Filter-Mapping (url패턴과 mapping)
      <filter-mapping>
      	<filter-name>*등록된 Filter명*</filter-name>
      	<url-pattern>*요청할 페이지 형식*</url-pattern>
      	<dispatcher>
      		REQUEST || INCLUDE || FORWARD || ERROR
      	</dispatcher>
      </filter-mapping>

02-02. @WebFilter Annotation 설정

  1. Filter 인터페이스를 구현한 클래스 상단에 @WebFilter(url-pattern) 어노테이션을 추가한다.

    @WebFilter("/first/*")
    public class FirstFilter implements Filter {
    	*필터 동작 내용*
    }

02-03. Filter Interface method

  • init (FilterConfig config);
    • 웹 컨테이너가 Filter를 호출하면, init method가 호출되어 Filter 객체를 생성하며 초기화한다.
    • 매개변수 FilterConfig는 web.xml에 있는 정보를 가지고 있다.
  • doFilter (ServletRequest req, ServletResponse res, FilterChain chain);
    • Filter가 수행될 때 구동하는 method로, 요청 객체와 응답 객체를 사용해 일련의 작업을 수행한 뒤, chain을 통해 가공된 값을 목적지로 전송한다.
  • doFilter (ServletRequest req, ServletResponse res, FilterChain chain);
    • Filter가 수행될 때 구동하는 method로, 요청 객체와 응답 객체를 사용해 일련의 작업을 수행한 뒤, chain을 통해 가공된 값을 목적지로 전송한다.

02-04. Filter Class 작성

public class Classimplements Filter {
	@Override
	public void init(FilterConfig config) throws ServletException { 
		*(Filter 호출 시 작업 설정)*
	}

	@Override
	public void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain) throws ServletException, IOException { 
		*(Filtering 작업할 내용)*
	}

	@Override
	public void destroy() { 
		*(삭제 시 작업 설정)*
	}
}

02. Servlet Wrapper

01. Servlet Wrapper

01-01. Servlet Wrapper란

  • 관련 클래스(ServletRequest, ServletResponse, HttpServletRequest,
    HttpServletResponse)를 내부에 보관하며 해당 인터페이스를 구현한 객체를 참조하여 구현 메소드를 위임한다.
  • Java Event처리의 Adapter Class와 비슷한 기능을 한다고 볼 수 있다.
  • 사용자가 별도의 request나 response 객체를 생성하여 활용할 때 Wrapper Class를 상속하여 활용하면, 편하게 원하는 Class만 재정의하여 사용할 수 있다.

01-02. Wrapper Class

  • HttpServletRequestWrapper
    • 요청한 정보를 변경하는 Wrapper Class로, HttpServletRequest 객체를 매개로 하는 생성자를 가진다.
      public SampleWrapper(HttpServletRequest wrapper) {
      	super(wrapper);
      }
  • HttpServletResponseWrapper
    • 응답할 정보를 변경하는 Wrapper Class로, HttpServletResponse 객체를 매개로 하는 생성자를 가진다.
      public SampleWrapper(HttpServletResponse wrapper) {
      	super(wrapper);
      }
  • (참고) 암호화 및 Bcrypt

    업로드중..

    • 위 그림처럼 중간에 패킷 정보를 빼내어 가져가는 해킹 기법인 ‘패킷스니핑’에 대비하여 개인 정보 등 보안에 민감한 데이터에는 암호화 처리가 필요하다.

      • 암호화하면 패킷스니핑으로 해킹해도 복호화하지 못하는 이상 크게 의미가 없기 때문이다.
      • 데이터베이스 해킹에 대비해 DB 저장 시에도 암호화된 데이터를 넣어야 한다.
    • 서버는 양방향 암호화 처리를 한다.

      • 암호화란 평문을 다이제스트(= 기존 문자열을 변환한 일정 길이의 문자열)로 변경하는 것이고, 복호화는 다이제스트를 다시 평문으로 변경하는 것이다.
      • 이때 암호화는 가능하지만 복호화는 불가한 것이 단방향 암호화이고, 암호화와 복호화 모두 가능한 것이 양방향 암호화이다.
    • 저장한 서버도 관리자도 알아서는 안되는 고객의 개인 정보 등이 있을 수 있으므로 데이터베이스는 단방향 암호화 처리를 한다.

      💡 BCrypt 암호화

    1. 비밀번호를 데이터베이스에 저장할 목적으로 설계된 암호화 알고리즘이다.
    2. 랜덤 솔팅 기법을 적용한 다이제스트 생성을 지연시킨 단방향 해시 암호화 알고리즘이다.
    3. 암호화는 가능하나 복호화가 불가능한 높은 수준의 암호화 알고리즘이다.
    • 해시 알고리즘이란 어떤 메시지를 넣더라도 해시 함수를 통과하면 동일한 길이의 랜덤한 문자열이 반환되는 것으로, 빠른 속도로 다이제스트 생성이 가능하다. 이러한 해시 알고리즘은 다이제스트 생성 방식이 동일하므로 아래 두 가지 방법으로 패턴만 알아내면 복호화가 가능해진다.
      1. 무차별 대입 → 모든 경우의 수에 대해 다이제스트를 생성해 맞춰보면서 패턴 탐색
      2. 사전식 대입 → 사전 속 단어를 다이제스트로 변경해 다이제스트와 비교해 패턴 탐색
    • 따라서 위와 같은 패턴 탐색을 방지하고자 Bcrypt 암호화에서 적용한 salting 기법은 원문만 암호화하지 않고 지정한 다른 글자(= salt값)를 붙여 암호화하는 것이고, BCrypt는 암호화할 때마다 랜덤한 salt값을 이용한다.
profile
나는 할 수 있다...!

0개의 댓글