❓문제 상황
자꾸 @AuthenticationPrincipal 어노테이션에 null 값이 들어와 NullPointerException 에러가 발생하는 것이였다.
💡 디버깅 과정
위의 과정에서 jwtTokenProvider.getAuthentication(token); 을 통해 생성된 authentication 객체에
정상적으로 값이 생성되는 것을 볼 수 있다.
따라서
SecurityContextHolder.getContext().setAuthentication(authentication);
메서드도 정상적으로 실행되었다.
AuthenticationPrincipal 어노테이션을 통해 얻은 객체 User이 null이 되었다.
따라서 @AuthenticationPrincipal 어노테이션을 천천히 따라가 보았다.
이 어노테이션이 붙은 파라미터에 값을 주입해주는 AuthenticationPrincipalArgumentResolver를 들어갔다.
붉은색으로 표시한 부분에서 문제가 생기는 것으로 판단했다.
하지만, 정상적으로 Authentication 이 생성되고 불러오는 것을 확인했다.
그러면 어디가 문제일까..
SecurityContextHolder > SecurityContext > Authentication > Principal 이라는 것을 계속 생각했다.
그러면 AuthenticationPrincipal이란 Authenticated 된 Principal이구나.
이 Principal을 찾지 못해서 null이 발생하구나.
Principal을 생성하는 곳부터 다시 찾아보자. -> Principal을 생성하는 직접적인 곳이 없으니 Principal을 포함하는 Authentication 객체를 생성하는 곳부터 찾아보자.
Authentication 객체 생성하는 부분
UsernamePasswordAuthenticationToken 을 따라가 보자.
직접 principal 객체를 생성해서 넣어주는 생성자를 가지고 있다.
여기서 문제 발견!!!!!
나는 principal 객체, 즉 user 객체를 생성하여 넣지 않고 user의 loginId만 넣어주는 것이였다.
따라서 내가 주입한 principal( "test1")과 @AuthenticationPrincipal에서 찾는 principal( test1의 user 객체) 가 일치하지 않아서 문제가 발생한 것이였다!!!!!!
✅문제 해결
principal 객체를 생성하여 바로 주입했더니 정상적으로 작동했다.
코드를 천천히 뜯어보고 따라가보는 것이 재밌기도 했고 힘들기도 했다.
'Knowledge > Trouble Shooting' 카테고리의 다른 글
@WebMvcTest 테스트 중 에러 코드 (0) | 2024.07.09 |
---|---|
Error creating bean with name 'jpaAuditingHandler': Cannot resolve reference to bean 'jpaMappingContext' while setting constructor argument (0) | 2024.07.08 |
JWT 토큰 사용 시 인증이 되지 않았다는 문제 발생 (0) | 2024.07.05 |
순환 참조(Circular References) 해결 (0) | 2024.06.10 |
java.lang.StackOverflowError: null (0) | 2024.06.10 |