관리 메뉴

Just Do it

[STS/스프링] 스프링 시큐리티 getPassword() is null 본문

신입 개발자가 되기 위해 공부했던 독학 자료들/에러 해결 모음

[STS/스프링] 스프링 시큐리티 getPassword() is null

Seojoo21 2022. 3. 18. 15:41

개인프로젝트인 SJBoard의 회원 탈퇴 기능을 만들던 중 아래 오류를 만났다. 

 

3월 18, 2022 3:12:59 오후 org.apache.catalina.core.StandardWrapperValve invoke

SEVERE: 경로 []의 컨텍스트 내의 서블릿 [appServlet]을(를) 위한 Servlet.service() 호출이, 근본 원인(root cause)과 함께, 예외 [Request processing failed; nested exception is java.lang.NullPointerException: Cannot invoke "String.equals(Object)" because "loginUserPw" is null]을(를) 발생시켰습니다.

java.lang.NullPointerException: Cannot invoke "String.equals(Object)" because "loginUserPw" is null

 

회원 탈퇴 처리를 담당하는 컨트롤러 내 코드는 아래와 같았다. 

Principal & Authentication 객체를 이용하여 현재 로그인한 사용자의 비밀번호를 가져온 다음 사용자가 회원 탈퇴 페이지에서 입력한 비밀번호와 일치할 시 회원 탈퇴를 할 수 있도록 만들고 있었다. 

 

그런데 현재 로그인한 사용자의 비밀번호를 가져오는 코드(빨간색 밑줄 표시한 getPassword())에서 비밀번호가 반환되지 않고 null값이 반환되어 오류가 발생한 것으로 보였다.  

 

구글링을 하다가 아래 블로그 글을 보았는데, 확인해보니 User class 내부의 eraseCredentials 함수가 호출되어 getPassword()를 실행해도 null이 return되는 것이었다. 

 

https://java8.tistory.com/509

 

[security] getPassword() is null

[코드로 배우는 스프링부트] - 구멍가게 코딩단 기준 plugins { id 'org.springframework.boot' version '2.4.4' id 'io.spring.dependency-management' version '1.0.11.RELEASE' id 'com.adarshr.test-logger' v..

java8.tistory.com

 

실제 STS에서 User 클래스를 열어보니 eraseCredentials() 내 password가 null 로 되어있었다. 

기본값이 true 이므로, 이 null 값이 나오지 않게 하려면 아래와 같이 security-context.xml 내 authentication-manager 태그를 수정하면 된다고 하여 현재 프로젝트 내 security-context.xml의 코드를 수정했다. 

<security:authentication-manager erase-credentials="false">

그러고나서 브라우저에서 다시 회원 탈퇴 테스트를 해보았더니 더이상 에러도 발생하지 않고 콘솔창에도 현재 로그인 사용자의 비밀번호가 더이상 null이 아닌 Bcrypt된 비밀번호로 잘 나오는 것을 확인할 수 있었다.