현재 우리는 두 개의 커스텀 필터를 만들었고
Spring Security 내부에서 사용할 수 있는 BasicAuthenticationFilter
직전과 직후에 실행되는 것을
살펴볼 수 있었습니다
이 강의에서는
필터를 추가하는 또 다른 방법을 알아보겠습니다
이 방법은 addFilterAt 입니다
이 방법을 사용하면
Spring Security 중 하나인 위치와
정확히 같은 위치에 커스텀 필터를 구성할 수 있습니다
내부 필터는 체인 내부에서 실행될 예정이지만
이것은 매우 까다롭습니다
자 여기서 여러분은 만약 제가 두 개의 필터를
같은 위치에서 구성하면 예를 들어 여기서는 세 개이고
이런 경우에는 무엇이 먼저 실행될까요?라는 질문을 할 수 있습니다
내부적으로 Spring Security는 그 중 하나를
무작위로 실행합니다
이것이 바로
addFilterAt 메소드를 사용할 때마다
로직에 관해 매우 조심해야 하는 이유입니다
언제나
비즈니스 로직에
부작용이 없도록
로직을
작성해야 합니다
이 메소드의 목적을
데모로 보여주기 위해
LoggingFilter라는 이름의 새로운 커스텀 필터를 만들겠습니다
이 필터 내에서는 인증이 진행 중이라는
새로운 문장을 로그에 남길 것입니다
실제 세계의 애플리케이션에는
addFilterAt을 사용하는 시나리오가 많지 않을 수 있습니다
대부분의 프로젝트에서는
addFilterBefore 또는 addFilterAfter를 사용합니다
여러분은 아주 가끔
addFilterAt 메소드가 사용되는 것을 볼 수 있습니다
인증 프로세스 중에 사용자에게
인증이 진행 중임을 알리기 위해 이메일을 보내거나
인증이 성공적이라고 엔드 유저에게 알리거나
내부 응용 프로그램에
알림을 보내는 등의 혹은
요구 사항이
있을 수 있습니다
시나리오는 다양할 수 있으나
Spring Security 내부 필터 중 하나와
정확히 동일한 위치에
커스텀 필터를 구성할 수 있다는 점을 주목해야 합니다
이제 이 새로운 필터를 구현하고
addFilterAt 메소드를 활용하여 구성해 봅시다
제 Spring Boot project에서
이 filter 패키지 아래 저는 새로운
AuthoritiesLoggingAtFilter라는 이름을 가진 Java 클래스를 생성할 겁니다
따라서 이 필터도 jakarta.servlet 패키지에서
제공하는 Filter 라는 인터페이스를 구현해야 합니다
그리고 우리가 doFilter 를 오버라이딩하는지
확인해야 합니다
이 메소드 내에서는
인증이 진행 중이라는 문장을 로깅하는
간단한 로직을 작성하겠습니다
첫 번째로 Java 라이브러리에서 제공하는
로거(logger)를 사용하여 로거 객체를 만들겠습니다
이제 로거 객체를 만들었으니
이 동일한 LOG 객체를 사용하여
인증 검증이 진행 중이라는
문장을 정보로 기록한 다음
FilterChain내에서의
다음 필터를 호출하겠습니다
그리고 이로써
새로운 커스텀 필터를 성공적으로 생성했으며
이 필터를 BasicAuthenticationFilter의
동일한 위치에 구성할 수 있습니다
이를 위해 ProjectSecurityConfig로 이동하겠습니다
여기서 addFilterBefore와 addFilterAfter 사이에
새로운 코드 줄을 추가하려고 합니다
여기서 호출하려는 새 메소드는
addFilterAt입니다
이 메소드에서는 두 가지 인수를 전달해야 합니다
첫 번째 메소드 인수는
AuthoritiesLoggingAtFilter 로 생성한
새로운 커스텀 필터의 객체입니다
그 다음은 Spring Security 내부 필터로
BasicAuthenticationFilter.class 입니다
이러한 변경과 함께 우리는 마무리가 되었습니다
이 변경 사항을 저장하고 빌드를 합니다
빌드가 마무리 되면 우리는
애플리케이션에서 로그아웃하고 로그인을 시도할 수 있습니다
만든 커스텀 필터 내부에
중단점을 유지할 수 있습니다
따라서 저는 이 메소드 내에 중단점을 유지하고
다른 필터에 삽입한
이전 중단점을 제거할 것입니다
그래서 로그인 버튼을 클릭합니다
이로 인해 새로운 필터 내에서의 실행이 중지가 되고
우리는 그 문을 로그할 것입니다
만약 나가서 그 줄의 코드를 실행하려고 하면
여기에
인증 유효성 검사 진행중이라는 문장이 뜹니다
그래서 제가 이 중단점을 해제하고 난 다음에
BasicAuthentication 필터 주변에
실행되는 필터들을 확인할 수 있습니다
먼저 저의 BeforeFilter 가 실행되고
그 다음에 AtFilter 그리고
BasicAuthenticationFilter 다음에
AfterFilter가 실행됩니다
Spring Security는
필터의 전과 후에 관해서는 보장하지만
AtFilter에 대해서는
어떤 순서로든 무작위 실행될 수 있습니다
일부 상황에서는 BasicAuthenticationFilter가
우선 실행되고
어떤 상황에서는 커스텀 필터가
먼저 실행됩니다
이것은 완전히 랜덤입니다
따라서 이 행동에 대해 매우 주의해야 합니다
이로써 우리는 Spring Security 프레임워크에서
자체적인 커스텀 필터를 구성하고
이를 Spring Security FilterChain에
주입하기 위한 모든 메소드들을 살펴보았습니다
이 개념에 대해 명확히 이해하는 것이 중요합니다
왜냐하면 실제 프로젝트 내에서 매우 중요하기 때문입니다
모든 실제 프로젝트에서는
인증 직전 혹은 직후에 실행될
커스텀 비즈니스 로직을 반드시 가지고 있습니다
이러한 필터에 대한
지식을 갖는 것이 중요한 이유이며
실제 프로젝트에서
매우 큰 도움이 될 것입니다
감사합니다 다음 강의에서 뵙겠습니다
수고하셨습니다