[Spring Security] "/login"으로 POST api 요청시 java.lang.NullPointerException 발생

비타민·2023년 10월 15일
0

Troubleshooting

목록 보기
3/3

[캡스톤디자인프로젝트]를 개발하는 과정에서 역대급 황당한 에러를 겪었다,,
n시간의 구글링과 ChatGPT와의 n번의 대화를 통해서도 단서를 찾을 수 없던 에러,,,
혹시 같은 에러를 겪으시는 다른 분들이 계시다면 고생하지 마시라고 이렇게 글을 작성합니다,,ㅠ_ㅠ

에러 메세지:

java.lang.NullPointerException: Cannot invoke "com.hack.hack_server.Entity.User.getPassword()" because "this.user" is null

상황:

  • 프론트와의 도메인 주소 통합 및 https를 적용하고 있었던 상황
  • 코드는 그대로인 상태에서 갑자기 에러가 발생!
  • 프론트 측으로부터 갑자기 "로그인 api" 요청시 jwt 토큰이 발급이 안 된다는 연락을 받음

=> 확인을 해보니 프론트쪽 AxiosError 문제는 아니고, 프론트 및 백 모두 코드에 변경사항이 없어서 혹시 서버 재배포로 해결될 문제인가 싶었지만 아니었다!
=> Postman을 확인해보니 서버 로컬에서도 같은 오류가 나는 것을 확인!!

의문점 #1: 코드는 그대로인 상황

프론트 코드 및 백엔드 코드 수정이 없었기에 가장 의아했다.
또한, 설정파일에 문제가 있는 거라면 다른 api 동작에도 오류가 있어야하는데, 막상 "/login"을 제외한 API들은 정상 작동한다는 점!

의문점 #2: NullPointerException이 발생하는 코드 부분을 찾을 수 없음

디버깅을 위해 코드를 살펴보았지만, DTO를 통해 유저 정보를 전달받기에 코드의 그 어떤 부분에서도 엔티티에 직접 접근하여 User.getPassword()를 직접 호출하는 경우가 없었다.. 따라서 NullPointerException이 발생하는 부분을 찾을 수 없었다!


디버깅을 하는 과정에서,

System.out.Println("여기");

.. 와 같은 코드를 라인별로 찍어내며 오류가 발생하는 부분을 찾으려 해보았지만 발견하기 어려웠다!
따라서 혹시 요청 주소에 매핑된 코드 외의 오류인가 싶어, 단순한 String을 return하는 것으로 Controller와 Service 코드를 바꿔보았지만 같은 에러가 뜨는 것을 통해 이건 코드상의 문제가 아니라는 아주 큰 깨달음을 얻었다.

...그리고 찾은 에러의 원인..

에러의 원인:

기존 "/api/login"으로 보냈던 요청을 "/login"으로 바꾸면서 발생한 문제!

그렇다.. 코드는 바뀌지 않았지만, 프론트와의 도메인 주소 통합 및 https를 적용하는 과정에서 api 요청 주소를 변경한 적은 있었다. https://api.rainbow-letter.com/ 으로 모든 백엔드 요청을 보내는 것으로 바꾸게되면서 기존에 요청 주소에 포함된 '/api' 키워드를 모두 제거하는 과정이 있었던 것이다.

-> 찾아보니 Spring Security에서는 기본적으로 "/login" 경로의 로그인 페이지를 HttpSecurity를 상속받은 FormLoginConfigurer에서 제공한다고 한다. 따라서, 기본적인 Spring Security와 충돌이 나서 발생한 에러가 아닐까.. 추측해보았다.

에러 해결법:

다시 "/api/login"으로 요청 주소를 바꾸기!

바꾼 주소로 로그인 API 요청을 하니, 정상적으로 JWT 토큰이 반환되는 것을 확인할 수 있었다!! ㅠ_ㅠ

팀원들이 고생했다고 토닥토닥해줘서 덕분에 힘을 내서 이렇게 에러 로그까지 작성할 수 있었다!!
우리 팀원들 짱짱 ( ⸝⸝•ᴗ•⸝⸝ )੭⁾⁾
여러분은 저 같은 에러 겪지 마시길 바라며.. 포스팅을 마칩니다!

profile
☁️ 백엔드 개발, 클라우드, AI 분야에 관심이 많아요 ☁️

0개의 댓글

관련 채용 정보