일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 |
- red hat mysql
- linux mysql설치
- fullcalenda 캘린더
- fullcalenda 일정수정
- red hat db
- restapi ajax
- 정규표현식
- TCP
- fullcalenda 추가
- linux 데이터베이스
- red hat linux mysql
- fullcalenda 등록
- fullcalenda 일정추가
- linux dump하는법
- NULL
- fullcalenda 일정
- fullcalenda
- 비밀번호변경로직
- select
- Java정규표현식
- fullcalenda 수정
- Linux
- restapi란?
- Java
- 패킷
- IP
- fullcalenda 사용법
- java비밀번호
- linux db설치
- linux dump
- Today
- Total
무마니
비밀번호 변경시 "&"만들어가면 수정이안되는현상 + 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&*()'
이제 특수문자 "&"도 잘 변경이 된걸 알 수 있다.
'백엔드 개발자 > Java[Spring]' 카테고리의 다른 글
Spring MVC 와 Rest API (0) | 2025.03.26 |
---|---|
HTTL 인터넷 네트워크 [ 4 ] PUT,PATCH,POST,GET,DELETE (0) | 2023.07.26 |
HTTL 인터넷 네트워크 [ 3 ] HTTP 기본 (0) | 2023.07.21 |
HTTL 인터넷 네트워크 [ 2 ] URI, URL,URN (0) | 2023.07.20 |
HTTL 인터넷 네트워크 [1] (0) | 2023.07.18 |