728x90
AbstractAuthenticationProcessingFilter, OncePerRequestFilter 차이를 알아보자!!
Spring Security에서 AbstractAuthenticationProcessingFilter와 OncePerRequestFilter는 두 가지 주요한 필터 유형이다.
이들은 인증 및 요청 처리에 사용된다.
각 필터의 역할과 차이를 살펴보면,
1. AbstractAuthenticationProcessingFilter
역할
AbstractAuthenticationProcessingFilter는 인증 요청을 처리하는 데 사용
주로 폼 기반 로그인, JWT 토큰 인증, OAuth 인증 등 다양한 인증 메커니즘을 구현하는 데 사용.
특징
- 인증 요청 전용: 특정 URL 패턴(예: /login, /api/authenticate)에 매핑되어 인증 요청을 처리.
- 인증 매니저: AuthenticationManager를 사용하여 인증 논리를 처리.
- 인증 성공/실패 처리: 인증이 성공하면 successHandler를, 실패하면 failureHandler를 호출.
예제
폼 기반 로그인 필터 예제:
public class CustomAuthenticationFilter extends AbstractAuthenticationProcessingFilter {
public CustomAuthenticationFilter() {
super("/login");
}
@Override
public Authentication attemptAuthentication(
HttpServletRequest request
, HttpServletResponse response
) throws AuthenticationException, IOException, ServletException {
String username = request.getParameter("username");
String password = request.getParameter("password");
UsernamePasswordAuthenticationToken authRequest =
new UsernamePasswordAuthenticationToken(username, password);
return getAuthenticationManager().authenticate(authRequest);
}
}
728x90
2. OncePerRequestFilter
역할
OncePerRequestFilter는 요청이 필터 체인에 의해 여러 번 처리되지 않도록 보장.
주로 요청에 대해 단 한 번만 특정 작업을 수행하고자 할 때 사용.
특징
- 한 번만 실행: 요청 당 한 번만 실행되도록 보장.
- 다양한 작업 가능: 인증, 로깅, 헤더 설정 등 다양한 작업을 수행할 수 있다.
- 범용적 사용: 인증뿐만 아니라 다른 많은 목적에도 사용될 수 있다.
예제
JWT 토큰을 검증하는 필터 예제:
public class JwtAuthenticationFilter extends OncePerRequestFilter {
@Override
protected void doFilterInternal(
HttpServletRequest request, HttpServletResponse response
, FilterChain filterChain
) throws ServletException, IOException {
String token = getTokenFromRequest(request);
if (token != null && validateToken(token)) {
Authentication auth = getAuthentication(token);
SecurityContextHolder.getContext().setAuthentication(auth);
}
filterChain.doFilter(request, response);
}
private String getTokenFromRequest(HttpServletRequest request) {
String bearerToken = request.getHeader("Authorization");
if (StringUtils.hasText(bearerToken) && bearerToken.startsWith("Bearer ")) {
return bearerToken.substring(7);
}
return null;
}
private boolean validateToken(String token) {
// 토큰 검증 로직
return true;
}
private Authentication getAuthentication(String token) {
// 토큰에서 사용자 정보 추출 및 Authentication 객체 생성
return new UsernamePasswordAuthenticationToken(user, null, authorities);
}
}
차이점 요약
- 용도:
- AbstractAuthenticationProcessingFilter: 특정 URL 패턴에 매핑된 인증 요청을 처리하는 데 사용.
- OncePerRequestFilter: 요청 당 한 번만 특정 작업을 수행하고자 할 때 사용.
- 구현 방식:
- AbstractAuthenticationProcessingFilter: AuthenticationManager를 사용하여 인증을 처리.
- OncePerRequestFilter: 인증, 로깅, 헤더 설정 등 다양한 작업을 수행할 수 있으며, 요청 당 한 번만 실행.
이 두 필터는 서로 다른 목적으로 사용되지만, 둘 다 Spring Security 필터 체인에서 중요한 역할을 한다. AbstractAuthenticationProcessingFilter는 주로 인증 요청을 처리하는 데 사용되며, OncePerRequestFilter는 보다 광범위한 용도로 사용될 수 있다.
728x90
'개발 > Java & Kotlin' 카테고리의 다른 글
[Java] 계층형 아키텍처의 문제 (101) | 2024.07.12 |
---|---|
[Spring] Expo FCM 푸시알림 구현하기 (3) (145) | 2024.06.12 |
[Java] OrElse, OrElseGet 차이 (165) | 2024.04.15 |
[Spring] 정적파일 캐시에 담기 (158) | 2024.04.12 |
[Spring] addAttribute, addFlashAttribute 차이 (95) | 2024.03.13 |