반응형
스프링 시큐리티가 어떻게 동작하는지 궁금해서 알아봤다.
1. 최상위 필터 인터페이스인 SecurityFilterChain 확인
package org.springframework.security.web;
import java.util.List;
import jakarta.servlet.Filter;
import jakarta.servlet.http.HttpServletRequest;
/**
* Defines a filter chain which is capable of being matched against an
* {@code HttpServletRequest}. in order to decide whether it applies to that request.
* <p>
* Used to configure a {@code FilterChainProxy}.
*
* @author Luke Taylor
* @since 3.1
*/
public interface SecurityFilterChain {
boolean matches(HttpServletRequest request);
List<Filter> getFilters();
}
- getFilters() 메소드에 디버그를 찍고 프로젝트를 실행시켰다. 그랬더니 아래의 DefaultSecurityFilterChain 코드로 이동했다.
public final class DefaultSecurityFilterChain implements SecurityFilterChain {
private static final Log logger = LogFactory.getLog(DefaultSecurityFilterChain.class);
private final RequestMatcher requestMatcher;
private final List<Filter> filters;
public DefaultSecurityFilterChain(RequestMatcher requestMatcher, Filter... filters) {
this(requestMatcher, Arrays.asList(filters));
}
public DefaultSecurityFilterChain(RequestMatcher requestMatcher, List<Filter> filters) {
if (filters.isEmpty()) {
logger.info(LogMessage.format("Will not secure %s", requestMatcher));
}
else {
logger.info(LogMessage.format("Will secure %s with %s", requestMatcher, filters));
}
this.requestMatcher = requestMatcher;
this.filters = new ArrayList<>(filters);
}
public RequestMatcher getRequestMatcher() {
return this.requestMatcher;
}
@Override
public List<Filter> getFilters() {
return this.filters;
}
@Override
public boolean matches(HttpServletRequest request) {
return this.requestMatcher.matches(request);
}
@Override
public String toString() {
return this.getClass().getSimpleName() + " [RequestMatcher=" + this.requestMatcher + ", Filters=" + this.filters
+ "]";
}
}
- 여기서 getFilters()가 동작했다. → 인터페이스의 구현체로 여기가 선택되었다.
@Override
public List<Filter> getFilters() {
return this.filters;
}
- 이제 디버깅을 확인했더니 아래 사진과 같이 필터가 15개 연결되어있는것을 확인했다.
2. 각 필터별 확인
- DisableEncodeUrlFilter :
- 이 필터는 URL 인코딩을 비활성화한다.
- URL 인코딩은 일반적으로 보안을 강화하기 위해 사용되지만, 특정 상황에서는 불필요할 수 있다.
- WebAsyncManagerIntegrationFilter:
- 이 필터는 비동기 요청과 SecurityContext를 통합한다.
- 비동기 작업에서도 보안 컨텍스트가 유지되도록 도와준다.
- SecurityContextHolderFilter:
- SecurityContext의 초기화 및 정리를 수행한다.
- 이 필터가 없으면 보안 컨텍스트는 초기화되지 않을 수 있다.
- CorsFilter:
- 이 필터는 CORS 설정을 처리한다.
- 이는 다른 도메인에서 리소스를 안전하게 요청할 수 있도록 해준다.
- LogoutFilter:
- 로그아웃 요청을 처리하고, 성공한 후의 작업(세션 무효화, 쿠키 삭제 등)을 수행한다.
- CustomAuthenticationFilter:
- 사용자 지정 인증 필터로, 사용자 인증 작업을 담당한다.(직접 커스텀)
- JwtAuthorizationFilter:
- JWT 인증을 처리하는 필터이다.(직접 만든것)
- JWT 인증을 처리하는 필터이다.(직접 만든것)
- UsernamePasswordAuthenticationFilter:
- 기본적으로 사용자 이름과 비밀번호를 통한 인증 요청을 처리한다.
- RequestCacheAwareFilter:
- 인증 전 요청을 캐시하여 인증 후 원래의 요청으로 리다이렉트할 수 있게 한다.
- SecurityContextHolderAwareRequestFilter:
- 현재 요청과 SecurityContext를 통합한다. 이를 통해 권한이나 인증 정보에 쉽게 접근할 수 있다.
- AnnonymousAuthenticationFilter:
- 인증되지 않은 사용자에 대해 익명 인증을 제공한다. 이로써 모든 요청에 인증 객체가 있게 된다.
- SessionManagementFilter:
- 세션 고정 보호, 세션 타임아웃, 동시 세션 제어 등 세션 관련 보안 기능을 제공한다.
- ExceptionTranslationFilter:
- 보안 예외가 발생하면 적절한 처리(예: 리다이렉트, 에러 메시지 등)를 수행한다.
- AuthorizationFilter:
- 사용자의 권한을 확인하여 특정 리소스에 대한 접근을 허용하거나 거부한다.
2023.10.21 - [SpringBoot 개발/Spring Security] - Spring Security6 - Authentication(인증)
반응형
'Spring Security' 카테고리의 다른 글
Spring Boot 3.1 & Spring Security 6: Security Config 최적화 리팩토링 (12편) (0) | 2023.09.04 |
---|---|
Spring Boot 3.1 & Spring Security 6: JWT 검증 리팩토링 (11편) (2) | 2023.09.04 |
Spring Boot 3.1 & Spring Security 6: 로그인 프로세스 및 JWT 토큰 동작 설명 (10편) (0) | 2023.08.08 |
Spring Boot 3.1 & Spring Security 6: 로그인 & 메인 페이지 컨트롤러 (9편) (0) | 2023.08.08 |
Spring Boot 3 & Security 6 시리즈: UserDetailsService, DTO 작성하기 (8편) (0) | 2023.08.07 |