Spring Security의 filter chain에 있는 필터들을 알아보자!
Spring Security의 기본필터를 알아보는 시리즈
바로 들어가자 - doFilter
ChannelProcessingFilter 의 doFilter 부분을 가지고 왔다.
@Override
public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain)
throws IOException, ServletException {
HttpServletRequest request = (HttpServletRequest) req;
HttpServletResponse response = (HttpServletResponse) res;
FilterInvocation filterInvocation = new FilterInvocation(request, response, chain);
Collection<ConfigAttribute> attributes = this.securityMetadataSource.getAttributes(filterInvocation);
if (attributes != null) {
this.logger.debug(LogMessage.format("Request: %s; ConfigAttributes: %s", filterInvocation, attributes));
this.channelDecisionManager.decide(filterInvocation, attributes);
if (filterInvocation.getResponse().isCommitted()) {
return;
}
}
chain.doFilter(request, response);
}
여기서 핵심은 channelDecisionManager.decide 이다.
this.channelDecisionManager.decide(filterInvocation, attributes);
ChannelDecisionManager 의 decide 의 구현체를 보면,
ANY_CHANNEL이라는 attribute가 포함되어 있으면 바로 리턴을 해주고,
ChannelProcessor가 지정되어 있으면 decide 메소드로 연결되어 있다.
ChannelProcessor가 무엇인가하면 프로토콜에 따라 어떻게 요청을 처리할 지 각 채널 (http, https 등) 처리를 관리하는 프로세서이다.
ChannelProcessor의 구현체는 2개 있는데 Spring으로 주로 web 요청을 처리하기 때문에,
InsecureChannelProcessor는 http를, SecureChannelProcessor는 https를 처리하는 걸로 알고 있으면 된다
조금 더 자세하게는 각 프로세스 안에서는 AbstractRetryEntryPoint의 commence라는 동작으로 연결되는데,
port와 request 형태, EntryPoint를 잡아주는 동작을 하고 있고
AbstractRetryEntryPoint 구현체는 RetryWithHttpEntryPoint, RetryWithHttpsEntryPoint 2개 있다.
RetryWithHttpsEntryPoint는 이렇게 생겼다.
실은 조사한 건 여기까지인데,
아쉬우니 chatGPT의 설명을 끝으로 마치려한다.
ChannelProcessingFilter는 웹 애플리케이션에 대한 요청의 인증 및 승인을 처리하는 데 사용되는 Spring Security 프레임워크의 클래스입니다.
이 필터는 들어오는 요청을 검사하고 어떤 보안 속성이 적용되는지 결정한 다음 인증 및 권한 부여 프로세스를 Spring Security 프레임워크 내의 적절한 구성 요소에 위임하는 역할을 합니다.
ChannelProcessingFilter는 HTTPS와 같은 보안 채널이 필요한 요청을 처리하도록 특별히 설계되었으며 필요한 경우 요청을 보안 채널로 리디렉션할 수 있습니다. 일반적으로 AuthenticationFilter 및 AuthorizationFilter와 같은 다른 보안 필터보다 먼저 필터 체인의 초기에 배치됩니다.
전반적으로 ChannelProcessingFilter는 웹 애플리케이션에 대한 요청이 적절하게 인증 및 승인되고 민감한 정보가 네트워크를 통해 안전하게 전송되도록 하는 데 도움이 되는 Spring Security 프레임워크의 중요한 구성 요소입니다.
Bye!
ChannelProcessingFilter | 웹 요청이 어떤 프로토콜로 (http 또는 https) 전달되어야 하는지 처리 |
SecurityContextPersistenceFilter | SecurityContextRepository를 통해 SecurityContext를 Load/Save 처리 |
LogoutFilter | 로그아웃 URL로 요청을 감시하여 매칭되는 요청이 있으면 해당 사용자를 로그아웃 시킴 |
UsernamePasswordAuthenticationFilter | ID/비밀번호 기반 Form 인증 요청 URL(기본값: /login) 을 감시하여 사용자를 인증함 |
DefaultLoginPageGeneratingFilter | 로그인을 수행하는데 필요한 HTML을 생성함 |
RequestCacheAwareFilter | 로그인 성공 이후 인증 요청에 의해 가로채어진 사용자의 원래 요청으로 이동하기 위해 사용됨 |
SecurityContextHolderAwareRequestFilter | 서블릿 3 API 지원을 위해 HttpServletRequest를 HttpServletRequestWrapper 하위 클래스로 감쌈 |
RememberMeAuthenticationFilter | 요청의 일부로 remeber-me 쿠키 제공 여부를 확인하고, 쿠키가 있으면 사용자 인증을 시도함 |
AnonymousAuthenticationFilter | 해당 인증 필터에 도달할때까지 사용자가 아직 인증되지 않았다면, 익명 사용자로 처리하도록 함 |
ExceptionTranslationFilter | 요청을 처리하는 도중 발생할 수 있는 예외에 대한 라우팅과 위임을 처리함 |
FilterSecurityInterceptor | 접근 권한 확인을 위해 요청을 AccessDecisionManager로 위임 |
'Java Spring > Spring Security' 카테고리의 다른 글
[Big Picture] Spring Security (0) | 2023.06.21 |
---|---|
Security 기본 필터는 뭐 있을까? 😗 (0) | 2023.04.14 |