이 강의에서는
In-built Spring Security 필터 중 하나 다음에
우리의 커스텀 필터를 주입하는 것을 살펴보겠습니다
여기서 볼 수 있듯이 똑같이 CORS, CSRF
그리고 BasicAuthenticationFilter 예시를 가져왔습니다
인증이 마무리 되면
몇 가지의 비즈니스 로직을 실행해야 되는
조건이 있다고 생각해봅시다
이런 상황에서 또한
BasicAuthenticationFilter를 선택할 수 있습니다
만약 우리가 BasicAuthenticationFilter 바로 다음에
우리의 커스텀 AuthenticationFilter를
실행한다고 하면
그 조건에 부합할 것 입니다
이 시나리오에서
저의 커스텀 AuthenticationFilter에
작성할 것은 커스텀 필터 내에
로거를 추가하는 것으로
어떠한 유저 인증이 성공적이고
그가 이러한 권한들을 가졌다를 보여주는 것입니다
이것을 인증이 성공적이었다고
엔드 유저 에게 로그, 감사
혹은 이메일을 보내는
상황이라고 생각해봅시다
여러가지 상황이 있을 수 있겠으나
여기서는 인증이 성공적이고
이것이 유저 세부 정보라는
메세지를 로그하는
간단한 시나리오를 살펴보왔습니다
Spring Security in-built filter 바로 다음에
새로운 필터를 구성하려고 하면
addFilterAt 메소드를 사용하면 됩니다
이 메소드를 사용하여 두 가지의 매개변수를 전달할 수 있습니다
첫 번째는 커스텀 필터의 객체이고
두 번째는 커스텀 필터가 실행된 다음
Spring Security in-built filter의
클래스 이름이 무엇인가 입니다
이해가 되었길 바랍니다
이 시나리오에서는 addFilterAfter 메소드를 활용하여
우리가 타겟하려고 합니다
우리의 웹 애플리케이션에 몇 가지 변경을 하고
그것을 증명해봅시다
여기 filter 패키지에 우리는 새 클래스를 만들겁니다
클래스의 이름은
AuthoritiesLoggingAfterFilter입니다
따라서 이 클래스도 필터를 실행해야 합니다
그래서 이 컴파일 오류를 해결해보도록 하겠습니다
doFiltere 메소드를 구현하여
빈 doFilter 메소드를 얻었습니다
자 이제 다음 줄의 throws 블록을 가져와서
완성된 코드를 확인해 봅시다
여기에서는 메소드 내부의 로직을 붙여 넣을 것인데
이것은 잠시 후에 살펴보겠습니다
메소드 내부의 로직뿐만 아니라 인증된 유저의
세부 정보를 로그에
기록하기 위해
로거 객체를 생성하려고 합니다
여기 doFilter 메소드 내에 반환한 비즈니스 로직을 살펴보면
매우 간단합니다
우선 여기서는 현재 인증된 유저의
정보를 얻기 위해 노력합니다
우리가 알듯이 인증이 성공적이면
인증된 유저의 세부정보는
SecurityContext에 저장됩니다
따라서 이러한 정보를 얻기 위해
우리는
SecurityContextHolder.getContext().getAuthentication를 사용할 수 있습니다
이 코드 라인은
현재 인증된 유저의 세부정보를
인증 객체의 형태로 제공할 것입니다
이 인증 객체가 null이 아니라는 것은
인증이 성공했다는 것을 의미하며
저는 인증된 유저의 이름과
해당 유저의 권한을 로깅할 것이기 때문에
이러한 값들은
제 로그문에 기록될 것입니다
이러한 변경사항을 저장해봅시다
이 if 문 후에
우리가 chain.doFilter 메소드를 활용하여
체인 내에 다음 필터를 호출하고 있음을 볼 수 있습니다
우리가 커스텀 authentication filter를 만들고 나면
이를 Spring Security FilterChain 내에
주입해야 합니다
이를 위해
ProjectSecurityConfig class 로 갑니다
그리고 addFilterBefore 구성 바로 다음
addFilterAfter 라는 메소드를 호출할 수 있습니다
이 메소드에 우리는 두 가지 메소드 인수를 전달해야 합니다
제일 첫 번째는 우리가 만든
새로운 커스텀 필터인
AuthoritiesLoggingAfterFilter
객체입니다
두 번째는 인수는 이미 알듯이
우리가 고려해야 하는
Spring Security 내부 필터가 무엇인지 전달하는 겁니다
우리가 여기서 고려하는 내부 필터는
BasicAuthenticationFilter.class 입니다
이로써 우리는 마무리가 되었습니다
변경 사항을 저장하고 여기서 빌드를 하겠습니다
이 코드를 디버깅 하기 위해
새로운 커스텀 필터 내의 중단점도 그대로 유지하겠습니다
이제 애플이케이션을
happy@example.com과
비밀번호 12345로 로그인해보겠습니다
로그인을 누르자마자
AuthoritiesLoggingAfterFilter 라는 이름으로
커스텀 authentication filter 내에
실행이 멈춘 것을 볼 수 있습니다
이 코드를 한 줄 한 줄씩 실행시켜보면
인증 객체 내에 누구의 인증이 성공적인지
엔드 유저의 세부정보를 볼 수 있습니다
이 인증 객체로부터
엔드 유저의 이름과
그의 권한을 읽고자 합니다
그러고 나서 그 정보를 로그합니다
중단점을 해제합니다
콘솔을 살펴보면
커스텀 필터로부터의
로그문이 유저 happy@example.com 가
성공적으로 인증되었음과
ROLE_USER 과 ROLE_ADMIN 권한을 가짐을 보여줍니다
우리는 또 빠르게 실행된 Spring Security FilterChain을
증명할 수 있습니다
BasicAuthenticationFilter 다음에
우리의 커스텀 필터가 실행되었습니다
우리가 지금까지 구성한 BeforeFilter
그리고 AfterFilter 입니다
이로써 저는 여러분이
특정 Spring Security 내부 필터 다음에
커스텀 필터를 만들고 구성하는 것을 확실히 이해했다고 생각합니다
이것은 인증이 성공적으로 이루어 진 후
어떤 로직이든 실행하고 싶을 때
유용할 것입니다
그렇기에 이 컨셉을
반드시 이해하시기 바랍니다
감사합니다 다음 강의에서 뵙겠습니다
수고하셨습니다