Dev_Henry

[Spring security] jwt 로그인 구현에서 OncePerRequestFilter 본문

Web/Spring

[Spring security] jwt 로그인 구현에서 OncePerRequestFilter

데브헨리 2023. 7. 20. 09:33
728x90

 

작업중인 프로젝트에서 JWT인증방식을 사용하여 로그인을 하도록 만들었다.

대략적인 흐름은 아이디,비밀번호로 로그인을 했을때 스프링 시큐리티에서 login필터를 거쳐서 로그인을 확인하고 성공시 jwt토큰을 발급해준다.

이후 jwt토큰과 함께 요청이 들어오면 토큰체크필터에서 jwt토큰을 검증하는 방식이다.

 

그런데 책과 자료를 참고하면서 구현하던중 로그인 필터는 AbstractAuthenticationProcessingFilter를 상속받아 구현했지만

토큰체크필터는 OncePerRequestFilter를 이용하는 경우가 많아 필자도 같은 방식으로 구현을 했다.

 

우선 OncePerRequestFilter에 대해서 찾아보니

모든 서블릿 컨테이너에서 요청 발송 당 단일 실행을 보장하는 것을 목표로하는 필터 기본 클래스. HttpServletRequest 및 HttpServletResponse 인수를 사용하여 doFilterInternal 메소드를 제공합니다.

라고 설명한다.

즉. 한번의 요청에서 내부 처리 과정중 반복적인 호출이 있을 때 필터를 다시 거치게 되는데, 처음 요청을 받을 때 이미 인증을 한 상태에서 다시 인증을 하는건 자원낭비가 될 수 있으니 pass하도록 보장하는 필터이다.

 


 

이런 설명을 보면 확실히 해당 필터를 사용하는게 이득이라고 생각하여 구현을 했는데 한가지 불편한 점이 생겼다.

로그인 필터가 상속하는 AbstractAuthenticationProcessingFilter를 타고 들어가면 생성자에 동작url이나 RequestMatcher를 파라미터로 넘겨 해당 필터를 수행할 요청경로를 설정할 수 있어 편하게 필터를 설정할수있다.

반면 OncePerRequestFilter에는 이러한 기능이 없었다.

https://findmypiece.tistory.com/58

구글링을 통해 찾아보니 위 블로그의 내용처럼 필터를 적용할 경로를 설정하는 방법이 있었는데 위의 방법은 서블릿필터를 직접 등록하는 경우인듯하고 내 상황은 시큐리티 설정파일을 만들어 이곳에 필터를 등록하여 사용하고 있었기에 조금 다른 것 같았다.(아직 시큐리티,필터 등에 잘 아는건 아니라 맞게 이해한건지는 모르겠다.)

 

그래서 처음 내가 선택한 방법은 필터내에서 경로를 한번 체크하는 방법이었다.

이렇게 했을때 문제는 필터안에서도 경로를 걸러줘야하고 시큐리티 설정파일에서 권한설정을 또 해줘야했다.

개발이 진행되면서 토큰검사를 하지않는 경로가 추가될때 마다 두 곳 모두 추가해줘야해서 귀찮기도 하고 코드가 중복되니 보기 좋지도 않았다.

 

 

그래서 시큐리티설정파일에서 WHITELIST를 두고 필터에는 주입시켜주는 방식으로 구현하여 해결했다.

 

 

728x90
반응형