HTTPSecurity

HttpSecurityHttpSecurityConfiguration 설정 클래스로 우리가 지난 시간에 본 적 있다. 이 설정 클래스에서 HttpSecurity 빈을 생성하고 초기화를 진행한다. 어떤 초기화를 진행하냐면 HttpSecurity 는 보안에 필요한 각 설정 클래스와 필터들을 생성하고 최종적으로 SecurityFilterChain 이라는 빈을 생성한다. 어떻게 보면 HttpSecurity는 이 빈을 생성하는 것이 최종 목적이다.

스크린샷 2025-01-24 오후 7.40.09.png

그림을 살펴보면 HttpSecurityConfiguration 초기화 때 실행이 되면 여기서 HttpSecurity 빈을 생성을 하고 그러면 이 객체는 내부적으로 각 SecurityConfigurer 설정 클래스의 구현체들을 생성한다. 그래서 CSRFConfigurer, LogoutConfigurer, SessionManagementConfigurer 등의 여러 개의 설정 클래스를 생성하고 이 설정 클래스들을 통해 초기화 작업을 할 건데, build 라는 메소드가 호출되면 이때 각각의 initconfigurer 메소드가 호출되며 인증과 인가와 관련된 여러 객체들, 필터들, 클래스들이 객체를 생성한다.

그 중 필터들이 생성이 되는데 그 필터들이 어디에 목록으로 지정되느냐 하면 바로 SecurityFilterChain 이라는 빈이 생성되며 이 빈 안에 여러 개의 필터들의 목록들이 저장된다. 즉, SecurityFilterChain 이 각 인증과 인가에 처리할 필터들을 가지고 있다는 것. 그래서 필터 체인이다. 필터들이 체인 형식으로 연결되어있다 보면 된다. 이것이 HttpSecurity 가 가지고 있는 내부적 구조이다.

옆을 보면 디버깅 모드로 HttpSecurity 밑에 HttpSecurity가 최종적으로 생성하는 빈이 바로 SecurityFilterChain 이었으므로 구현체인 DefaultSecurityFilterChain이 보인다. 그리고 이 구현체는 두 개의 속성을 갖고 있는데 하나가 requestMatcher 을 가지고 있다. 또 다른 하나가 리스트 타입의 변수를 갖는 filters로 그 안에 여러개의 필터 목록이 보인다. 그래서 이 두 개를 갖고 있는 것이 바로 SecurityFilterChain이고 SecurityFilterChain 을 생성하는 클래스 빈이 HttpSecurity 이라고 보면 된다. 그리고 HttpSecurity 는 이 객체를 전반적으로 모든 인증과 인가 관련 설정을 할 수 있어 중요한 클래스이다.

SecurityFilterChain

그럼 SecurityFilterChain 을 더 살펴보도록 하자. SecurityFilterChain 은 아까 언급했듯 여러 개의 필터들의 목록을 관리한다. 그래서 그 데이터를 가지고 있다. SecurityFilterChain은 인터페이스이며 인터페이스를 구현한 구현체가 하나 제공이 되는데 그게 DefaultSecurityFilterChain 이다. 그래서 getFilters() 라는 메소드와 matches() 라는 두 개의 메소드가 제공되는데, 이 두 개의 메소드의 의미를 보도록 하자.

스크린샷 2025-01-24 오후 7.51.34.png

matches 인자로는 HttpServletRequest 를 받는다. 그래서 이 메소드는 클라이언트 요청이 현재 SecurityFilterChain 에 의해 처리되어야 하는지 여부를 결정한다.

SecurityFilterChain은 하나가 아닌 여러개가 생성될 수 있다. 나중에 다중 보안 설정에서 자세히 다룰 예정. SecurityFilterChain 은 하나가 아닌 여러개의 FilterChainHttpSecurity 에서 생성 될 수 있다. 그러면 여러 개 중 현재 요청에 적합한 SecurityFilterChain을 선책해야하는 상황이 발생할 수 있다. 그래서 현재 요청이 해당 SecurityFilterChain 에 의해 처리되어야 하는지의 여부를 matches 에서 현재 클라이언트 요청 정보를 통해 결정하게 된다. 만약 matches 의 결과가 true 를 반환하게 되면 현재 요청이 해당 SecurityFilterChain 에 의해 반환해야 한다는 의미로 현재 요청이 이 FilterChain에 의해, 즉 SecurityFilterChain 이 가지고 있는 필터들의 목록에 의해 처리되어야 한다는 것을 의미하고, 반대로 false 를 반환하면 이 FilterChain이 아닌 다른 FilterChain에 의해 처리/사용되어야 함을 의미한다. 따라서 이를 통해 특정 요청에 대해 적절한 보안 필터링 로직이 적용될 수 있도록 한다. 해당 요청마다 그에 맞는 SecurityFilterChain이 선택되어서 그 처리를 담당해야 되는 것. 다중 보안 설정 때 별도로 설명할 예정.

반환하는 타입은 List 타입의 필터, 필터를 가지고 있는 List 타입이다. 이 메서드는 현재 SecurityFilterChain에 포함된, 이 객체가 여러 개의 필터 목록을 가지고 있다 했는데, 이 객체가 가지고 있는 필터, 객체 리스트를 반환하고 이 메서드를 통해 어떤 필터들이 현재 FilterChain에 포함되어 있는지를 확인할 수 있다. 즉, SecurityFilterChain이 가지고 있는 필터 목록들을 그냥 얻을 수 있는 것. 그래서 각 필터는 요청 처리 과정에서 특정 작업, 인증이나 권한 부여, 로깅과 같은 작업을 수행하는 것이 필터가 하는 역할이다. 그래서 두 개의 메서드가 있는 것.