Spring Security Error - @AuthenticationPrincipal, Null

Jobmania·2023년 6월 7일
0

에러

목록 보기
5/5
post-thumbnail

😣 MemberDetailsImpl에 NullPointExcepition 발생


해당 로직에서 @AuthenticationPrincipal에 인증정보가 담기지 않는다고 한다. 분명, 로그인하면 ContextHolder에 저장된다고 알고 있는데 왜 Null 일까?

결론
1.Principal은 자바의 표준 시큐리티 기술로, 로그인이 된 상태라면 계정 정보를 담고 있다.
2. UsernamePasswordAuthenticationToken 객체를 생성할 때, 유효한 토큰과 함께 올바른 MemberDetailsImpl 객체를 principal로 설정해야 한다.

👀 @AuthenticationPrincipal 에 대해서 역추적

AuthenticationPrincipalArgumentResolver 이 녀석이 @AuthenticationPrincipal를 처리하는놈이다!


2.

  • @AuthenticationPrincipal 어노테이션이 있는지 확인한다
  • 또한 Authentication 객체를 SecurityContextHolder에서 꺼내는 것을 확인 할 수 있다.
  • 그래서 null이 발생한다면 SecurityContextHolder에서 인증정보를 넣어주는 곳을 확인할 필요가 있다.

3.
나의 경우에는 custom filter인 JWTfilter에서 SecurityContextHolder의 인증정보를 저장하고 있다.

참고로 UsernamePasswordAuthenticationToken는 Authentication의 구현체이다.

그림처럼 Authentication 내부를 알아 볼 필요가 있다.
그렇다면 여기서 Authentication이 어떻게 생성되고 어떤 객체를 반환하는지 확인을 통해, 내부의 인증객체인 principal이 제대로 설정되어 있는지 까보자!


4.

이전은 User(UserDetails 구현체) 객체를 principal로 설정하였기 때문에
@AuthenticationPrincipal MemberDetailsImple은 SecurityContextHolder 담기지 않았던 것이다.
-> MemberDetailsImple 객체 수정을 통해 정상적으로 값 주입 성공!!


5.

SecurityContextHolder 내부에는 CustomUserDetailsService의 loadUserByUsername 메서드가 반환한 MemberDetailsImpl MemberDetailImpl 객체가 저장됨!


-> DB에서 찾은 Member정보가 담겨있는 MemberDetailImpl과 요청한 Authenticate 와 패스워드를 비교하고 검증하는 로직을 처리한다.

물론 DB 에서 username 을 기반으로 값을 가져오기 때문에 아이디 존재 여부도 자동으로 검증한다!

즉! loadUserName에서 반환하는 객체와 Authentication이 생성하는 객체 흐름을 상세히 알 수 있는 계기가 되었다!

참고
뱀귤블로그

profile
HelloWorld에서 RealWorld로

0개의 댓글