전에 아직 해결하지 못 했던 필터 우선순위 부분
http.addFilterBefore(jwtAuthenticationFilter(), UsernamePasswordAuthenticationFilter.class);
http.addFilterBefore(jwtAuthorizationFilter(), JwtAuthenticationFilter.class);
어느 부분은 해소가 된거 같아 글을 적게 되었다!
JwtAuthorizationFilter > JwtAuthenticationFilter > UsernamePasswordAuthenticationFilter 의 순서로 filter 처리를 하는것이 맞다
강의만 보면 마치 JwtAuthenticationFilter 이걸 먼저 처리하는것처럼 보이는데 실제로는 그렇지 않다.
실제 강의에서 코드를 실행 한 log 기록이다!
로그인 및 JWT 생성 이후 JWT 검증 및 인가 로그가 뜨는걸로보아
JwtAuthenticationFilter > JwtAuthorizationFilter 순서가 아닐까라는 착각을 하게 된다!
그래서 필터 순서를 확인하는 방법은 아래와 같다.
Figure 1)
Figure 2)
실행을 하면 맨 처음에 토큰이 있나 확인을 합니다.
토큰이 없기 떄문에 토큰 없음 log을 찍고 나서 로그인 시도를 하게 된다.
여기 흐름만 보면 JwtAuthorizationFilter > JwtAuthenticationFilter이 맞는것이다.
그러면 여기서 또 의문이 드는게 로그인 성공 및 JWT 생성을 하고 나면 왜 또 JWT 검증 및 인가 즉, JwtAuthorizationFilter의 log가 찍히는가??
JwtAuthorizationFilter > JwtAuthenticationFilter > JwtAuthorizationFilter 인거라 라고 생각했지만 아니였다.
이거를 설명 하기 위해서 부가적으로 log를 추가해보자!!
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 되면서 요청이 발생하여 다시 필터가 시작.