일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 | 31 |
- GIT
- 컴포넌트
- java
- 스프링
- React
- 개발
- DATABASE
- sql
- jdk
- 쿼리
- table
- Intellij
- mssql
- Spring
- component
- 개발공부
- restapi
- JS
- springboot
- 리액트
- reactjs
- 스프링부트
- 데이터베이스
- 자바스크립트
- 보안취약점
- Vue
- crud
- 자바
- EXTJS
- javascript
- Today
- Total
준준의 기록일지
[Spring] 스프링 Filter, DoFilter 본문
"이 포스팅은 쿠팡 파트너스 활동의 일환으로, 이에 따른 일정액의 수수료를 제공받습니다."
찾게된 이유
회사 솔루션 vPortal에서 고객사 사이트 별로 계약된 기능이 전부 상이하다. 그래서 관리포털의 경우 관리자 메뉴를 계약 사항에 맞는 기능만 넣어주는데, 현재 관리 포털에 취약한 부분을 발견했다.
각 관리자 메뉴 사용 여부에 따라 on/off 기능이 있는데 해당 정보는 func_name, on/off 컬럼으로 DB 테이블에 저장된다.
여기서 문제는 관리자 메뉴를 front쪽 메뉴 목록만 지웠다는 것!
허가된 관리자 메뉴가 아닐 경우 url로 접근해도 허용이 안되야 하는데, 떡하니 해당 페이지로 넘어간다.
이에 허용되지 않은 페이지를 어떻게 차단할것인가에 대해 고민하면서 front쪽인 extjs부터 jsp, 스프링 설정까지, 무엇을 변경해야되나 고민하고 있었다.
회의 중 팀 내 수석님이 그런 경우 공통으로 제어가 필요하기 때문에 Filter 클래스를 사용해야 된다고 들었고, 개발을 적용하기 전 스프링 Filter에 대한 플로우, 적용법에 대한 학습을 선행하고자 글을 쓰게 되었다!
들어가며
스프링 프레임워크를 이용하여 웹 개발을 하다 보면 중복으로 처리하는 코드들이 생긴다. 인증, 인가, 세션, XSS방어 등 공통적으로 다루게 되는 부분이 생기게 되는데, 인터셉터, 필터, aOP 등을 이용하여 각 상황에 맞춰 처리가 가능하다.
스프링 필터
필터는 애플리케이션의 HTTP 요청 및 응답을 가로채는데 사용하는 개체이다. 필터를 사요하여 두 인스턴스에서 두 가지 작업을 수행할 수 있다.
- client의 요청을 가로채어 작업을 수행한다.
- response 되기 전에 가로채어 작업을 수행한다.
필터는 스프링 컨텍스트 외부에서 request와 response의 해당하는 작업을 가로채어 공통 로직을 수행한다. 인터셉터와 AOP와 실행되는 시점이 다르니 각 상황에 맞추어 적절히 수행한면 된다.
메서드 (iplements)
필터의 경우 다음 메서드들을 상황에 맞추어 @Override 해주면 된다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
|
@Override
public void init(FilterConfig filterConfig) throws ServletException {
//필터를 웹 컨테이너 생성 후 초기화할 때 호출된다.
//이 메소드의 매개변수는 FilterConfig의 인스턴스이다. 이 인스턴스를 통해 필터 초기화 매개변수의 값을 꺼낼 수 있다.
//위 코드에서는 doFilter()에서 사용하기 위해 인스턴스 변수 config에 저장한다.
FilterConfig config;
}
@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
//필터체인으로 연결해준다. 체인의 경우 순서를 지정할 수 있다. 체인의 가장 마지막에는 클라이언트가 요청한 최종 자원이 위치한다.
//필터와 핑된 URL에 요청이 들어올때마다 doFilter()가 호출된다. 이 메소드에서는 필터가 할 작업을 작성한다.
//filterChain은 다음 필터를 가리키고 filterChain.doFilter()는 다음 필터를 호출한다. 다음 필터가 없다면 내부적으로 서블릿의 service()를 호출한다.
//서블릿이 ㅣㄹ행되기 전에 처리할 작업은 filterChain.doFilter() 이전에, 서블릿이 실행된 후에 처리할 작업은 filterChain.doFilter() 이후에 작성한다.
HttpServletRequest req = (HttpServletRequest) request;
HttpServletResponse rep = (HttpServletResponse) response;
HttpSession session = req.getSession();
String uri = req.getRequestURI();
String contextPath = req.getContextPath();
Account account = (Account) session.getAttribute("account");
chain.doFilter(request, response);
}
@Override
public void destroy() {
// 필터가 웹 컨테이너에서 삭제될 때 호출된다.
}
|
cs |
필터의 구동
- 서블릿 컨테이너는 웹 어플리케이션을 시작할 때 DD파일(web.xml)에 등록된 필터의 인스턴스를 생성하고 init()을 호출한다.
- 클라이언트 요청이 들어오면 해당하는 필터의 doFilter()를 호출한다.
- doFilter()에서 작업을 실행하고 다음 필터의 doFilter()를 호출한다.
- 마지막 필터까지 3을 반복한다.
- 마지막 필터는 서블릿의 service()를 호출한다.
- 서블릿의 service()가 끝나면 service()를 호출했던 이전 필터로 돌아간다.
- 반복해서 제일 처음 호출됐던 필터까지 돌아간다.
- 마지막으로 클라이언트에게 응답 결과를 보낸다.
필터 배치(Deployment)
필터의 배치 방법은 web.xml에 설정하는 방법과 annotation에 설정하는 방법이 있다.
출처
https://yhmane.tistory.com/144
https://atoz-develop.tistory.com/entry/Servlet-Filter-%EC%82%AC%EC%9A%A9%ED%95%98%EA%B8%B0
'스프링' 카테고리의 다른 글
[스프링 부트와 AWS로 혼자 구현하는 웹 서비스] Spring 비즈니스 로직의 영역 설명 (0) | 2021.08.27 |
---|---|
[lombok] 기능정리 펌 (0) | 2021.08.25 |
[Spring] Context Listener 란?? (0) | 2021.02.17 |
[스프링] 인텔리제이 스프링부트 초기세팅 (0) | 2020.09.17 |
[Spring] ResponseBody (0) | 2020.09.04 |