비밀번호 변경 기능 개선 및 검증 강화

- 비밀번호 변경 페이지에 확인 Dialog 추가 (로그인/거래취소)
- 비밀번호 에러 코드별 상세 메시지 처리
  * INVALID_PASSWORD, UPDATE_PASSWORD_FAIL, PREVIOUS_PASSWORD
  * MERCHANT_INFO_MATCH_PASSWORD, PASSWORD_LENGHT
  * DISALLOWED_CHARACTERS_INCLUDED, DISALLOWED_WHITE_SPACE
  * NOT_ENOUGH_COMPLEXITY, REPEATED_CHARACTER_SEQUENCE
  * COMMON_PASSWORD_DETECTED
- 비밀번호 입력 검증 로직 통합 (validatePassword)
- 이메일/전화번호 마스킹 기능 추가
- 사용자 추가 페이지 에러 처리 개선
- 다국어 메시지 추가 (한국어/영어)

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
This commit is contained in:
Jay Sheen
2025-11-17 20:50:53 +09:00
parent 522ccf7464
commit 2d1dd6f9e7
10 changed files with 748 additions and 128 deletions

41
src/shared/lib/masking.ts Normal file
View File

@@ -0,0 +1,41 @@
/**
* 전화번호 마스킹 함수
* @param phoneNumber - 마스킹할 전화번호 (예: "01012345678")
* @returns 마스킹된 전화번호 (예: "0101234****")
*/
export const maskPhoneNumber = (phoneNumber: string): string => {
const cleaned = phoneNumber.replace(/[^0-9]/g, '');
if (cleaned.length === 11 && cleaned.startsWith('010')) {
const prefix = cleaned.substring(0, 7);
return `${prefix}****`;
}
return phoneNumber;
};
/**
* 이메일 마스킹 함수
* @param email - 마스킹할 이메일 (예: "hanbyeol@gmail.com")
* @returns 마스킹된 이메일 (예: "ha******@gmail.com")
*/
export const maskEmail = (email: string): string => {
const atIndex = email.indexOf('@');
if (atIndex === -1) {
return email;
}
const localPart = email.substring(0, atIndex);
const domainPart = email.substring(atIndex);
if (localPart.length <= 2) {
return email;
}
const visiblePart = localPart.substring(0, 2);
const maskedCount = localPart.length - 2;
const maskedPart = '*'.repeat(maskedCount);
return `${visiblePart}${maskedPart}${domainPart}`;
};