/** * 문자열 마스킹 처리를 위한 유틸리티 * * 보안아키텍처 표준 마스킹 규칙(Java MaskingUtils)과 동일한 결과를 내도록 구현한다. * 이름 2자: 뒤 1자리(가나→가*) / 3자 이상: 앞뒤 제외 가운데 전체(가나다라→가**라) * 이메일 아이디 앞2·뒤2 마스킹, 4자 이하 전체(test→****, test123→**st1**) * 전화 2·3번째 세그먼트 각각 뒤 2자리(010-1234-1234→010-12**-12**) */ const StringMaskingUtil = { // null, empty 체크 isValidString: function(str) { return str != null && str !== ''; }, // '*' 반복 생성 _stars: function(count) { return count > 0 ? '*'.repeat(count) : ''; }, // 세그먼트 뒤 count 자리 마스킹 _maskSegmentTail: function(segment, count) { if (segment.length <= count) { return this._stars(segment.length); } return segment.substring(0, segment.length - count) + this._stars(count); }, // 이름 마스킹 처리 (2자: 뒤 1자리, 3자 이상: 앞뒤 제외 가운데 전체) maskName: function(name) { if (!this.isValidString(name)) { return name; } const len = name.length; if (len === 1) { return name; } if (len === 2) { return name.charAt(0) + '*'; } return name.charAt(0) + this._stars(len - 2) + name.charAt(len - 1); }, // 이메일 마스킹 처리 (아이디 앞2·뒤2, 4자 이하 전체) maskEmail: function(email) { if (!this.isValidString(email) || !email.includes('@')) { return email; } const atIdx = email.indexOf('@'); const local = email.substring(0, atIdx); const domain = email.substring(atIdx); if (local.length <= 4) { return this._stars(local.length) + domain; } return this._stars(2) + local.substring(2, local.length - 2) + this._stars(2) + domain; }, // 휴대폰/전화 번호 마스킹 처리 (2·3번째 세그먼트 각각 뒤 2자리) maskMobileNumber: function(number) { if (!this.isValidString(number)) { return number; } const parts = number.split('-'); if (parts.length === 3) { return parts[0] + '-' + this._maskSegmentTail(parts[1], 2) + '-' + this._maskSegmentTail(parts[2], 2); } return number; } };