마스킹 표준화 적용 (eapim-admin/portal/JS)
eapim-admin CI / build (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 e34829437d
commit 10db8129eb
5 changed files with 201 additions and 119 deletions
@@ -267,17 +267,14 @@ public class SmsAuthService {
}
/**
* 전화번호 마스킹
* 전화번호 마스킹 (표준 규칙: 2·3번째 세그먼트 각각 뒤 2자리)
* 예: 010-1234-5678 → 010-12**-56**
*/
public String maskPhoneNumber(String phone) {
if (StringUtils.isEmpty(phone)) {
return "****";
}
String cleaned = phone.replaceAll("[^0-9]", "");
if (cleaned.length() < 7) {
return "****";
}
return cleaned.substring(0, 3) + "****" + cleaned.substring(cleaned.length() - 4);
return com.eactive.eai.common.util.MaskingUtils.maskPhoneNumber(phone);
}
/**
@@ -134,8 +134,8 @@ public class SsoController implements InterceptorSkipController {
log.debug("SSO 사용자 정보 - userId: {}, name: {}, phone: {}, email: {}",
userId,
MaskingUtils.maskName(name),
maskPhoneNumber(cellPhoneNo),
maskEmail(email));
MaskingUtils.maskPhoneNumber(cellPhoneNo),
MaskingUtils.maskEmailId(email));
// 사용자 생성 또는 업데이트
UserInfo userInfo = findOrCreateUser(info, extendedInfo);
@@ -341,33 +341,4 @@ public class SsoController implements InterceptorSkipController {
}
return phone.replaceAll("[^0-9]", "");
}
/**
* 휴대폰번호 마스킹 (로그용)
*/
private String maskPhoneNumber(String phone) {
if (StringUtils.isEmpty(phone) || phone.length() < 4) {
return "****";
}
// 010-1234-5678 → 010-****-5678
String cleaned = phone.replaceAll("[^0-9]", "");
if (cleaned.length() < 7) {
return "****";
}
return cleaned.substring(0, 3) + "****" + cleaned.substring(cleaned.length() - 4);
}
/**
* 이메일 마스킹 (로그용)
*/
private String maskEmail(String email) {
if (StringUtils.isEmpty(email) || !email.contains("@")) {
return "****";
}
int atIndex = email.indexOf("@");
if (atIndex <= 2) {
return "**" + email.substring(atIndex);
}
return email.substring(0, 2) + "**" + email.substring(atIndex);
}
}
@@ -1,83 +1,52 @@
package com.eactive.eai.rms.onl.apim.masking;
import com.eactive.eai.rms.common.util.StringUtils;
import java.util.Arrays;
import java.util.List;
import java.util.stream.Collectors;
/**
* 개인정보 마스킹 유틸리티 (eapim-admin)
*
* <p>실제 마스킹 규칙은 보안아키텍처 표준 구현인
* {@link com.eactive.eai.common.util.MaskingUtils}(elink-online-core)에 위임한다.
* 기존 호출부 호환을 위해 메서드명/시그니처는 그대로 유지한다.</p>
*
* <pre>
* 이메일 eact***@gmail.com (구) → **ct1**@gmail.com (앞2·뒤2, 4자 이하 전체)
* 이름 홍길* (구) → 홍*동 (2자 뒤1, 3자↑ 가운데 전체)
* 전화 010-****-5678 (구) → 010-12**-56** (세그먼트별 뒤 2자리)
* IPv4 192.168.***.1 (3번째 옥텟) / IPv6 마지막 그룹, 콤마 다중 IP 지원
* </pre>
*/
public class MaskingUtils {
private MaskingUtils() {}
/**
* 이메일 주소의 ID 부분을 마스킹 처리
* 예: eactive@gmail.com => eact***@gmail.com
* 예: aajjbacc@gmail.com => **jjba**@gmail.com
*/
public static String maskEmailId(String email) {
if (email == null || email.isEmpty() || !email.contains("@")) {
return email;
}
String[] parts = email.split("@");
String id = parts[0];
String domain = parts[1];
if (id.length() <= 3) {
return "***" + "@" + domain;
}
String maskedId = id.substring(0, id.length() - 3) + "***";
return maskedId + "@" + domain;
return com.eactive.eai.common.util.MaskingUtils.maskEmail(email);
}
/**
* 이름지막 글자를 마스킹 처리
* 이름 마스킹 처리 (2자: 뒤 1자리, 3자 이상: 앞뒤 제외 가운데 전체)
* 예: 홍길동 => 홍*동
*/
public static String maskName(String name) {
if (name == null || name.isEmpty() || name.length() < 2) {
return name;
}
return name.substring(0, name.length() - 1) + "*";
return com.eactive.eai.common.util.MaskingUtils.maskKoreanName(name);
}
/**
* 전화번호 마스킹 처리
* 예: 010-1234-5678 => 010-****-5678
* 전화번호/휴대폰/FAX 마스킹 처리 (2·3번째 세그먼트 각각 뒤 2자리)
* 예: 010-1234-5678 => 010-12**-56**
*/
public static String maskPhoneNumber(String phoneNumber) {
if (phoneNumber == null || phoneNumber.isEmpty()) {
return phoneNumber;
}
String[] parts = phoneNumber.split("-");
if (parts.length != 3) {
return phoneNumber;
}
return parts[0] + "-****-" + parts[2];
return com.eactive.eai.common.util.MaskingUtils.maskPhoneNumber(phoneNumber);
}
/**
* IP 주소 마스킹 처리
* 예: 192.168.1.1 => 192.168.*.*
* IP 주소 마스킹 처리 (IPv4 3번째 옥텟 / IPv6 마지막 그룹, 콤마 다중 IP 지원)
* 예: 192.168.1.1 => 192.168.***.1
*/
public static String maskIpAddress(String ipAddresses) {
if (StringUtils.isBlank(ipAddresses)) {
return ipAddresses;
}
String[] ips = ipAddresses.split(",");
List<String> maskedIps = Arrays.stream(ips)
.map(ip -> {
String[] parts = ip.trim().split("\\.");
if (parts.length == 4) {
// 세 번째 octet을 ***로 마스킹
parts[2] = "***";
return String.join(".", parts);
}
return ip; // 유효하지 않은 IP 형식은 그대로 반환
})
.collect(Collectors.toList());
return String.join(",", maskedIps);
return com.eactive.eai.common.util.MaskingUtils.maskIpAddress(ipAddresses);
}
}