BGMS 로그 마스킹 모듈

기간

SK텔레콤 해킹 사고 이후 전화번호 암호화 외에 로그 마스킹까지 요구하는 고객사가 생겼습니다. MSA 서버 14종에 공통으로 적용해야 해서, 어느 서버에나 이식할 수 있는 모듈로 만들었습니다.

로그마다 25회 넘게 하던 Redis 조회를 로컬 캐시로 건너뛰는 구조

Java 8Spring Boot 2.7RedisGsonJaCoCo

  • 민감 고객사인지 먼저 판단하고, 로그 객체를 넘기기 전에 감싸 모듈 안에서 마스킹

Redis 병목

문제
민감 고객사인지 판단하려고 로그를 남길 때마다 Redis를 조회했습니다. 발송 로그 하나에 Redis 접근이 평균 25회를 넘어 병목이 될 가능성이 커졌습니다.
해결
모듈 안에 로컬 캐시를 두고, 캐시에 있으면 Redis 조회를 건너뛰게 했습니다. 민감 고객사 목록은 매일 로컬로 동기화해 최신 상태를 유지했습니다.

중첩 객체의 필드 탐색

문제
로그로 넘어오는 값은 단순 문자열이 아니라 객체⁠·⁠목록⁠·⁠JSON이 중첩된 형태였습니다. 마스킹할 필드를 찾으려면 모든 계층을 살펴야 했고, get/set 접근으로는 이를 할 수 없었습니다.
해결
로그 객체를 Gson으로 직렬화한 뒤 DFS로 JSON 트리를 순회하게 했습니다. 순회 중 bsid로 민감 고객사인지 판단하고, 그 아래의 recipient, phone_number, message 같은 필드를 가렸습니다. 객체의 구조와 관계없이 같은 방식으로 필드를 찾게 되어 어느 서버에나 붙일 수 있었습니다.