티스토리 뷰
- Spring Security와 JWT를 활용해서 회원 인증 기능을 구현하기 위해 여러 코드들을 보고 공부하던 중에
GenericFilter
를 이용해 필터를 구현한 코드와OncePerRequestFilter
를 이용한 코드가 있어서 서로 어떤 차이가 있는지 궁금해서 찾아보았다.
개요
- GenericFilter와 OncePerRequestFilter는 둘 다 대상을 필터로 등록해주는 인터페이스이다.
public class JwtFilter extends GenericFilterBean {
@Override
public void doFilter(final ServletRequest request, final ServletResponse response, final FilterChain chain) throws IOException, ServletException {
}
}
public class JwtFilter extends OncePerRequestFilter {
@Override
protected void doFilterInternal(final HttpServletRequest request, final HttpServletResponse response, final FilterChain filterChain) throws ServletException, IOException {
}
}
Filter 동작 흐름
- Filter는
javax.servlet-api
나tomcat-embed-core
를 사용하면 제공되는 Servlet Filter Interface로써 클라이언트의 서블릿 요청을 가장 먼저 받는다.
@Override
public void doFilter(final ServletRequest request, final ServletResponse response, final FilterChain chain) throws IOException, ServletException {
// do Filter 실행 전 로직
println("Before")
chain?.doFilter(request, response) ?: throw Exception()
// do Filter 실행 후 로직
println("After")
}
- 서블릿이 호출되기 전에 Before를 출력하고 필터를 거쳐서 서블릿이 호출되면 After가 출력된다.
- 이러한 Filter를 확장하여 Spring의 설정정보를 가져올 수 있게 만들어진 것이 GenericFilterBean이다.
- Filter와 GenericFilterBean은 둘 다 매 서블릿마다 호출이 된다.
- 서블릿은 사용자의 요청을 받으면 서블릿을 생성해 메모리에 저장해두고, 같은 클라이언트의 요청을 받으면 생성해둔 서블릿 객체를 재활용하여 요청을 처리한다.
- 문제는 이 서블릿이 다른 서블릿으로
dispatch
되는 경우이다. - 가장 대표적으로
Spring Security
에서 인증과 접근 제어 기능이Filter
로 구현되는데 이러한 인증과 접근 제어는RequestDispatcher
클래스에 의해 다른 서블릿으로dispatch
되고, 이 때 이동할 서블릿에 도착하기 전에 다시 한번filter chain
을 거치게 된다.(Target API1 -> Target API2) - 한 번의 요청에 한 번의 인증 처리만 하면 되는데 불필요하게 여러번 중복되어 인증처리를 하게 되는 것이다.
- 이런 문제를 해결하기 위해 등장한 것이 모든 서블릿에 일관된 요청을 처리하기 위해 만들어진
OncePerRequestFilter
이다. - 이 추상 클래스를 구현한 필터는
사용자의 한 번의 요청 당 딱 한 번만
실행되는 필터를 만들 수 있다.
관련 자료
반응형
'개발냥이 > 자바(Java)' 카테고리의 다른 글
[JAVA] 자바의 배열(Array) 다루기 & 객체 비교(Comparable, Comparator) (0) | 2023.04.22 |
---|---|
[Java] 자바의 메모리 구조 (0) | 2023.04.04 |
[Spring] Lombok을 올바르게 사용하는 방법 (0) | 2023.01.05 |
[Java] Queue에 대해 살짝 알아보자 (0) | 2022.11.02 |
[알고리즘] 생일(백준5635번)_Java Comparator (0) | 2022.10.18 |
댓글
반응형
공지사항
최근에 올라온 글
최근에 달린 댓글
- Total
- Today
- Yesterday
링크
TAG
- 스프링부트
- JPA
- 백준
- 자바스크립트
- dfs
- JavaScript
- 해시맵
- 스프링
- 형변환
- 자바
- DP
- 리액트
- CS
- SQLD
- 자바dp
- 알고리즘
- Spring
- BFS
- SQL
- Nest
- Queue
- 타입스크립트
- 자바bfs
- 정렬
- 자바트리
- 이분탐색
- Comparator
- Algorithm
- 프로그래머스
- java
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
글 보관함