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

[기존] 비밀번호 변경 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&*()'
이제 특수문자 "&"도 잘 변경이 된걸 알 수 있다.