The Brief FactStack이 되었습니다

FactStack

Datadog RUM allowlist란, 빌드타임으로 민감정보 가리는 법

데이터 신뢰성

한마디로

Datadog이 빌드할 때 고정 텍스트만 허용 목록에 올려서 RUM 액션 이름의 가독성과 프라이버시를 동시에 지키는 기능을 내놨어요

한눈에

Datadog RUM은 사용자 클릭 같은 행동을 사람이 읽을 수 있는 이름으로 기록해서 엔지니어가 서비스 동작을 파악하게 해주는 도구인데요. 이번에 나온 빌드타임 allowlist 기능은 애플리케이션을 빌드하는 시점에 고정된 텍스트만 미리 뽑아 허용 목록으로 만들고, 런타임에 만들어지는 값은 목록에 넣지 않는 방식이에요. 그 결과 "Order value" 같은 고정 라벨은 그대로 읽히고 "$142.75" 같은 동적 값은 자동으로 가려집니다.

AS-IS: 마스킹이냐 오버라이드냐의 딜레마였다

Datadog RUM Browser SDK에서 defaultPrivacyLevel을 mask로 설정하고 enablePrivacyForActionNames를 true로 켜면 액션 이름으로 명시되지 않은 텍스트는 다 가려집니다. 이렇게 보수적으로 마스킹하면 민감 텍스트가 노출될 위험은 줄지만 DOM 요소 내용을 읽을 수 없어서 RUM 데이터의 맥락 파악이 어려워졌어요. 반대로 HTML 요소별 프라이버시 레벨 오버라이드에 의존하는 팀은 관련 프론트엔드 컴포넌트를 하나하나 꼼꼼히 설정하고 감사해야 했는데요. 오버라이드 하나만 지나치게 허용적이거나 컴포넌트 하나만 놓쳐도 노출되지 말아야 할 텍스트가 그대로 드러날 수 있었고, 이는 수동 데이터 삭제와 규제 리스크, 프론트엔드 계측에 대한 신뢰 저하로 이어졌습니다.

이번 내용: 빌드 파이프라인에서 검증을 끝낸다

Datadog이 내놓은 빌드 플러그인은 컴파일된 애플리케이션 아티팩트, 즉 번들과 소스맵을 분석해서 고정 문자열만 추출합니다. 예를 들어 주문 라벨과 런타임에 계산되는 값을 함께 렌더링하는 코드가 있다면, 플러그인은 고정 문자열 "Order value"는 추출하지만 "${{ orderValue.toFixed(2) }}" 같은 동적 표현식은 추출하지도, 저장하지도, allowlist에 넣지도 않아요. 런타임에서 SDK는 후보 액션 텍스트가 빌드 시점에 식별된 내용과 일치할 때만 표시하고 그렇지 않은 텍스트는 Session Replay가 이미 쓰는 것과 동일한 고정 마스킹 플레이스홀더로 대체합니다. 적용 방식은 두 가지인데요. RUM Browser SDK 설정을 바꿔서 애플리케이션 전체에 프라이버시 레벨을 적용하거나, 특정 요소에 dd-privacy-level 속성을 mask-unless-allowlisted로 설정해서 애플리케이션 일부에만 적용할 수도 있습니다. 이 플러그인은 ESBuild, Rollup, Rspack, Vite, Webpack을 지원해서 기존 빌드 워크플로에 allowlist 생성 단계를 추가할 수 있고, include/exclude 패턴과 특수 주석으로 어떤 파일이나 코드 블록을 추출 대상에서 뺄지도 제어할 수 있어요.

실무 적용 포인트

프라이버시 정책 준수와 RUM 데이터 활용성 사이에서 계속 저울질하던 팀이라면 이번 방식이 선택지를 넓혀줍니다. 체크할 부분은 이렇습니다.

  • 기존에 defaultPrivacyLevel: mask로 과도하게 가리고 있었다면, mask-unless-allowlisted로 전환해 고정 라벨의 가독성을 되살릴 수 있는지 검토해보세요
  • 빌드 플러그인이 지원하는 번들러(ESBuild, Rollup, Rspack, Vite, Webpack)를 쓰고 있는지 먼저 확인하고 CI/CD 파이프라인에 allowlist 생성 단계를 추가하는 순서로 접근하는 게 좋습니다
  • 추출된 allowlist는 소스맵이나 번들 아티팩트와 함께 CI/CD 파이프라인에서 업로드하는 구조라서, 배포 프로세스에 프라이버시 검증을 자연스럽게 끼워 넣을 수 있어요
  • HTML 요소별 오버라이드에 의존하던 기존 방식보다 설정 실수로 인한 노출 위험이 줄어드는 대신, 어떤 텍스트가 정적이고 어떤 게 동적인지 코드 구조를 다시 점검할 필요는 있습니다

자주 묻는 질문

datadog 란 무엇인가요

Datadog은 애플리케이션과 인프라의 성능, 로그, 사용자 행동을 모니터링하는 관측 가능성(observability) 플랫폼이에요. 이번에 다룬 RUM(Real User Monitoring)은 그중 실제 사용자의 브라우저 행동을 추적하는 기능이고, Session Replay와 함께 사용자 경험을 재구성하는 데 쓰입니다.

sentry datadog 비교하면 어떤 차이가 있나요

원문에는 Sentry와의 직접 비교 내용은 없어요. 다만 Datadog은 이번 사례처럼 RUM 액션 이름에 빌드타임 allowlist를 적용해 프라이버시와 가독성을 함께 챙기는 방향으로 기능을 확장하고 있다는 점은 참고할 만합니다.

mask-unless-allowlisted는 기존 mask 설정과 뭐가 다른가요

기존 mask 설정은 액션 이름으로 명시되지 않은 모든 텍스트를 가려서 맥락을 읽기 어렵게 만들었어요. mask-unless-allowlisted는 빌드 시점에 정적 텍스트로 확인된 것만 예외적으로 보여주고 나머지는 똑같이 마스킹하는 방식이라 설정 실수에 덜 취약합니다.

이 기능은 어떤 빌드 도구에서 쓸 수 있나요

ESBuild, Rollup, Rspack, Vite, Webpack에서 지원됩니다. 이 도구들을 쓰고 있다면 기존 빌드 워크플로에 플러그인을 추가하는 방식으로 도입할 수 있어요.

에디터 노트

프라이버시 설정을 런타임 속성이 아니라 빌드 아티팩트 기준으로 판단한다는 점이 실용적이에요. 다만 정적 문자열과 동적 값의 경계가 애매한 코드 구조라면 여전히 개발자가 코드를 정리해야 하는 부담은 남습니다.

참고 출처 | 원문 보기

태그

용어 풀이
Datadog RUM
데이터독 실사용자 모니터링
빌드타임 allowlist
빌드 시점 허용 목록
프라이버시 마스킹
민감정보 가리기
observability
관측 가능성

이 노트는 자동 검증을 거쳐 발행되었습니다. 오류 제보는 편집팀이 즉시 확인합니다.

공유

관련 마테크