(내일배움캠프) TIL(12) - 6주차: 필터 우선순위 문제(addFilterBefore)

Thomas·2023년 6월 28일
1
post-thumbnail

문제

전에 아직 해결하지 못 했던 필터 우선순위 부분

http.addFilterBefore(jwtAuthenticationFilter(), UsernamePasswordAuthenticationFilter.class);
http.addFilterBefore(jwtAuthorizationFilter(), JwtAuthenticationFilter.class);

어느 부분은 해소가 된거 같아 글을 적게 되었다!

결론

JwtAuthorizationFilter > JwtAuthenticationFilter > UsernamePasswordAuthenticationFilter 의 순서로 filter 처리를 하는것이 맞다

강의만 보면 마치 JwtAuthenticationFilter 이걸 먼저 처리하는것처럼 보이는데 실제로는 그렇지 않다.

실제 강의에서 코드를 실행 한 log 기록이다!

로그인 및 JWT 생성 이후 JWT 검증 및 인가 로그가 뜨는걸로보아
JwtAuthenticationFilter > JwtAuthorizationFilter 순서가 아닐까라는 착각을 하게 된다!

그래서 필터 순서를 확인하는 방법은 아래와 같다.

확인 방법

jwtAuthorizationFilter의 doFilterInternal 메서드에 토큰이 없을시 "토큰없음"이라고 log를 찍어준다

Figure 1)

Figure 2)

실행을 하면 맨 처음에 토큰이 있나 확인을 합니다.

토큰이 없기 떄문에 토큰 없음 log을 찍고 나서 로그인 시도를 하게 된다.

여기 흐름만 보면 JwtAuthorizationFilter > JwtAuthenticationFilter이 맞는것이다.

그러면 여기서 또 의문이 드는게 로그인 성공 및 JWT 생성을 하고 나면 왜 또 JWT 검증 및 인가 즉, JwtAuthorizationFilter의 log가 찍히는가??

JwtAuthorizationFilter > JwtAuthenticationFilter > JwtAuthorizationFilter 인거라 라고 생각했지만 아니였다.

이거를 설명 하기 위해서 부가적으로 log를 추가해보자!!

JwtAuthorizationFilter doFilterInternal 메서드 시작하자마자 log.info(req.getRequestURI()); 추가 해준다.

Figure 3)

Figure 1이랑 Figure 3이랑 차이점은 메서드 시작에 log.info(req.getRequestURI());를 넣어주냐 차이이다.

log.info(req.getRequestURI());를 추가해주고 실행 해보면

Figure 4)

"로그인 성공 및 JWT 생성" 로그가 찍힌후에 / 경로로 리다이렉션이 일어나는걸 알수 있다.

즉, 인증 필터에서 JWT 생성 후, 필터체인이 다시 실행이 된다.

그 이유를 살펴보면

UsernamePasswordAuthenticationFilter 이 필터가 종료되면 원래 요청됐던 URI로 리다이렉션 된다.

기본적으로 UsernamePasswordAuthenticationFilter는 인증 성공 후에 SavedRequestAwareAuthenticationSuccessHandler라는 AuthenticationSuccessHandler를 사용하며, 이 핸들러는 사용자가 인증 전에 원래 요청하려고 했던 URL로 리다이렉트합니다. 예를 들어, 사용자가 인증이 필요한 '/profile' 페이지에 접근하려고 했지만 인증되지 않아 로그인 페이지로 이동했다면, 로그인 후 다시 '/profile' 페이지로 자동으로 리다이렉트됩니다.
만약 항상 특정 URL로 리다이렉트하고 싶다면, AuthenticationSuccessHandler를 직접 구현하거나 커스터마이징해야 합니다. 이를 통해 인증 성공 후에 항상 같은 URL로 리다이렉트하도록 설정할 수 있습니다.


강의에선 SecurityContextHolder부분을 중점으로 배워서
인증이 성공후에 실행되는 나머지 메서드들은 신경을 못 쓴거 같다!

추가적으로 컨트롤러 실행 후에는 /js/basic.js 여기서 호출이 되는것처럼 되어있는데 아직 정확히 왜 호출되는지는 조금더 찾아봐야한다.


한줄요약: 인증성공후 redirection 되면서 요청이 발생하여 다시 필터가 시작.

profile
Backend Programmer

0개의 댓글