마스킹 표준화 적용 (eapim-admin/portal/JS)
eapim-portal CI / build (push) Has been cancelled
eapim-portal Test / test (push) Has been cancelled

- admin: elink-online-core 표준 위임(e메일/이름/전화/IP)으로 규칙 일원화
- portal/JS: 표준 로직 직접 구현 + 기존 owner 비마스킹 유지
- 호출처 무수정/인라인 중복 제거/테스트 통과
This commit is contained in:
Rinjae
2026-06-18 17:56:32 +09:00
parent f671f491b7
commit 10ff5d6f2f
2 changed files with 195 additions and 21 deletions
@@ -0,0 +1,116 @@
package com.eactive.apim.portal.common.util;
import static org.junit.jupiter.api.Assertions.assertEquals;
import static org.junit.jupiter.api.Assertions.assertNull;
import org.junit.jupiter.api.DisplayName;
import org.junit.jupiter.api.Test;
/**
* eapim-portal {@link StringMaskingUtil}가 보안아키텍처 표준 규칙으로 마스킹하며,
* 소유자 본인 조회 시에는 마스킹하지 않는 동작을 검증한다.
*/
class StringMaskingUtilTest {
// --- 이름 ---
@Test
@DisplayName("이름 — 2자: 뒤 1자리")
void maskName_2chars() {
assertEquals("가*", StringMaskingUtil.maskName("가나"));
}
@Test
@DisplayName("이름 — 3자: 가운데 1자리")
void maskName_3chars() {
assertEquals("가*다", StringMaskingUtil.maskName("가나다"));
}
@Test
@DisplayName("이름 — 4자: 앞뒤 제외 가운데 전체")
void maskName_4chars() {
assertEquals("가**라", StringMaskingUtil.maskName("가나다라"));
}
@Test
@DisplayName("이름 — 5자: 앞뒤 제외 가운데 전체")
void maskName_5chars() {
assertEquals("가***마", StringMaskingUtil.maskName("가나다라마"));
}
@Test
@DisplayName("이름 — 1자/null/빈문자 방어")
void maskName_oneAndNull() {
assertEquals("", StringMaskingUtil.maskName(""));
assertNull(StringMaskingUtil.maskName(null));
assertEquals("", StringMaskingUtil.maskName(""));
}
// --- 이메일 ---
@Test
@DisplayName("이메일 — 아이디 앞2·뒤2 마스킹")
void maskEmail_normal() {
assertEquals("**st1**@test.com", StringMaskingUtil.maskEmail("test123@test.com"));
}
@Test
@DisplayName("이메일 — 아이디 4자: 전체 마스킹")
void maskEmail_fourChars() {
assertEquals("****@test.com", StringMaskingUtil.maskEmail("test@test.com"));
}
@Test
@DisplayName("이메일 — 아이디 1자: 전체 마스킹")
void maskEmail_oneChar() {
assertEquals("*@123.com", StringMaskingUtil.maskEmail("1@123.com"));
}
@Test
@DisplayName("이메일 — @ 없으면 원본 / null·빈문자 방어")
void maskEmail_invalidAndNull() {
assertEquals("notanemail", StringMaskingUtil.maskEmail("notanemail"));
assertNull(StringMaskingUtil.maskEmail(null));
assertEquals("", StringMaskingUtil.maskEmail(""));
}
// --- 휴대폰/전화 ---
@Test
@DisplayName("휴대폰 — 2·3번째 세그먼트 각 뒤 2자리")
void maskMobileNumber_normal() {
assertEquals("010-12**-12**", StringMaskingUtil.maskMobileNumber("010-1234-1234"));
assertEquals("010-12**-56**", StringMaskingUtil.maskMobileNumber("010-1234-5678"));
}
@Test
@DisplayName("휴대폰 — 하이픈 없는 11자리")
void maskMobileNumber_noHyphen() {
assertEquals("01012**56**", StringMaskingUtil.maskMobileNumber("01012345678"));
}
@Test
@DisplayName("휴대폰 — null/빈문자 방어")
void maskMobileNumber_null() {
assertNull(StringMaskingUtil.maskMobileNumber(null));
assertEquals("", StringMaskingUtil.maskMobileNumber(""));
}
// --- owner 인지 (본인 조회 시 비마스킹) ---
@Test
@DisplayName("owner — 본인 조회 시 마스킹하지 않음")
void ownerAware_noMaskWhenOwner() {
assertEquals("가나다", StringMaskingUtil.maskName("가나다", "user1", "user1"));
assertEquals("test123@test.com", StringMaskingUtil.maskEmail("test123@test.com", "user1", "user1"));
assertEquals("010-1234-1234", StringMaskingUtil.maskMobileNumber("010-1234-1234", "user1", "user1"));
}
@Test
@DisplayName("owner — 타인 조회 시 마스킹")
void ownerAware_maskWhenNotOwner() {
assertEquals("가*다", StringMaskingUtil.maskName("가나다", "user1", "user2"));
assertEquals("**st1**@test.com", StringMaskingUtil.maskEmail("test123@test.com", "user1", "user2"));
assertEquals("010-12**-12**", StringMaskingUtil.maskMobileNumber("010-1234-1234", "user1", "user2"));
}
}