무마니

비밀번호 변경시 "&"만들어가면 수정이안되는현상 + matches() 본문

백엔드 개발자/Java[Spring]

비밀번호 변경시 "&"만들어가면 수정이안되는현상 + matches()

vndn629 2025. 5. 23. 10:03

 

[기존] 비밀번호 변경 serviceimpl.java

	public boolean updateMyInfoPassword(MemberDataForm dForm, BasicUserInfo userInfo) throws Exception {

		boolean result = false;
		BasicUser user = myInfoService.selectMyInfoData(userInfo.getId());

		String curUserPswd = String.valueOf(user.getPassword());
		String oldUserPswd = passwordEncoder.encode(String.valueOf(dForm.getOldPassword()),userInfo.getId());
		String userPswd = passwordEncoder.encode(String.valueOf(dForm.getPassword()),userInfo.getId());

		if (curUserPswd == null || "".equals(curUserPswd) ||  oldUserPswd.equals(curUserPswd)) {
			dForm.setPassword(userPswd);
			myInfoMapper.updateMyInfoPassword(dForm);
			result = true;
		}

		return result;
	}

 

문제 : 비밀번호 변경시 잘 되지만, 비밀번호에 "&"를 추가시 로그인이 안되는 현상

예시 : test1234&

 


 

 

System.out.println("DEBUG: dForm.getOldPassword() raw: '" + dForm.getOldPassword() + "'"); System.out.println("DEBUG: dForm.getPassword() raw: '" + dForm.getPassword() + "'");

 

문제발견

System.out.println("DEBUG: dForm.getPassword() raw: '" + dForm.getPassword() + "'");

디버그 로그: dForm.getPassword() raw: 'test1234&'

test1234& 로 들어오는 현상 발견

 

 

 

왜 특수문자중에 '&'만 문제 였는가?

-> & 문자는 HTML에서 &로 변환을 가지는 문자중 하나!

 


 

문제해결

HtmlUtils.htmlUnescape() 사용

import org.springframework.web.util.HtmlUtils; // 추가 필요

 

 

	    String oldEnteredPswdRaw = dForm.getOldPassword(); // MemberDataForm에서 원본 String을 가져옴
	    String oldEnteredPswd = HtmlUtils.htmlUnescape(oldEnteredPswdRaw); // HTML 엔티티 디코딩
	    String newPswdRaw = dForm.getPassword(); // MemberDataForm에서 원본 String을 가져옴
	    String newPswd = HtmlUtils.htmlUnescape(newPswdRaw); // HTML 엔티티 디코딩
        
        	    // matches() 방식으로 변경
	    if (passwordEncoder.matches(oldEnteredPswd, curUserPswd, userInfo.getId())) { 
        	
           비공개
        
        }

 

passwordEncoder.matches() 을 하는 이유 

: 보안성, 정확성, 유지보수성

 

passwordEncoder.matches()를 사용하는 것은

보안 표준을 지키고, 정확하게 비밀번호를 검증하며, 코드의 유지보수성을 높이는 가장 권장되는 방법이라고 한다.

 

 

결과

DEBUG: User Entered New Password (newPswd - decoded): 'test1&*()'

 

이제 특수문자  "&"도 잘 변경이 된걸 알 수 있다.

반응형