본문 바로가기
Spring/Spring Security

[Spring Security] Custom Filter 만들기

by yoon_seon 2023. 10. 29.

프로젝트에 SprinSecurity를 적용해 개발하다 보면 SprinSecurity에서 기본으로 제공하는 Filter 뿐만 아니라 개발자가 원하는 방식으로 동작하는 필터가 필요할 때가 있다. 이러한 경우에 직접 Filter를 구현하면 된다.

Custom Filter를 구현하기 위해서는 다른 필터와 마찬가지로 Filter Interface를 구현해야 한다.

그러나 Filter Interface를 직접 구현하게 되면 중복 실행 문제가 있어서 대부분의 경우 OncePerRequestFilter를 구현하기를 권장한다.

 

예시 1

1개의 요청이 들어온 시점부터 끝날 때까지 거린 시간을 log로 기록한다.

stopwatch로 시작하고 모든 필터체인과 요청이 끝난 뒤에 작업한 시간을 기록한다.

내용을 보면 StopWatch를 실행하고 filterChain을 호출하고 StopWatch를 종료하는 간단한 예제다.

 

예시 2

tester유저의 경우 모든 권한을 부여한다.

내용을 보면 UsernamePasswordAuthenticationFilter를 상속받아 attemptAuthentication를 재정의했으므로 로그인이 되면 이 필터가 동작하게 될 것이다.

super.attemptAuthentication(request, response)를 통해 Authentication을 받고 Authentication안의 Principal에서 User 정보를 가져온다. username이 tester로 시작하면 USER, ADMIN 권한을 부여한다.

 

 

위 두 가지 예시의 필터를 등록하려면?

@EnableWebSecurity 어노테이션이 적용된 Security Config 설정 파일에서 필터를 적용할 수 있다.

  • http.addFilterBefore(<커스텀필터 생성자>, <필터.class>) : 후자 매개변수로 명시한 필터 앞에 전자 매개변수로 명시한 커스텀 필터가 동작한다.
  • http.addFilterAfter(<커스텀필터 생성자>, <필터.class>) : 후자 매개변수로 명시한 필터 뒤 전자 매개변수로 명시한 커스텀 필터가 동작한다.

댓글