1. HTTP 아카이브(HAR) 파일의 양날의 검: 디버깅 편의와 파멸적 보안 위험
웹 개발 및 장애 트러블슈팅 과정에서 Chrome, Edge, Safari 등 모던 브라우저 개발자 도구의 ‘Save all as HAR with content’ 기능은 네트워크 요청/응답 전체를 캡처하는 가장 대중적인 수단입니다. 그러나 HAR(HTTP Archive) 파일은 단순한 네트워크 타이밍 로그가 아닙니다. 이 파일에는 다음과 같은 치명적인 인증 정보와 개인정보가 완전한 평문(Plaintext JSON) 형태로 영구 박제되어 있습니다:
Authorization: Bearer <JWT>헤더 (장기 유효 세션 토큰).Cookie및Set-Cookie헤더 (세션 식별자, CSRF 토큰).- 결제 API 호출 시 전달된 신용카드 번호(PAN), CVC, 계좌번호.
- 사용자 로그인 및 회원가입 시 전송된 비밀번호 및 주민등록번호 등 민감 개인식별정보(PII).
수많은 개발자와 고객지원 팀이 버그 리포트를 위해 제3자 SaaS(예: Jira, Slack, Zendesk)에 HAR 파일을 무심코 업로드함으로써 계정 탈취 및 대규모 데이터 침해 사고가 빈번히 발생하고 있습니다. 악의적인 공격자가 이러한 아카이브를 획득할 경우, 사용자의 패스워드를 모르는 상태에서도 유효한 세션 쿠키를 브라우저에 주입하여 계정을 즉각 장악(Session Hijacking)할 수 있습니다.
특히 마이크로서비스 아키텍처 환경에서는 서비스 간 상호 인증을 위한 장기 유효 토큰(M2M Token)과 클라우드 인프라 메타데이터 API 호출 응답이 HAR 파일에 함께 캡처되는 치명적인 위험이 존재합니다. 단 한 번의 무주의한 로그 공유로 인해 AWS IAM 임시 자격증명이나 Kubernetes 서비스 어카운트 시크릿이 외부로 영구 유출될 수 있으므로, 엔터프라이즈 보안 감사에서는 HAR 공유 전 결정론적 비식별화 처리를 필수 의무 사항으로 규정하고 있습니다.
2. HAR 파일 내 주요 유출 위험 요소와 탐지 매트릭스
HAR 파일 규격(v1.2)에서 민감 정보가 주로 잠복하는 JSON 계층 구조와 그 위험도를 분류하면 다음과 같습니다.
| HAR JSON 노드 경로 | 잠복 민감 정보 유형 | 침해 위험 수준 | 마스킹/제거 표준 조치 |
|---|---|---|---|
log.entries[].request.headers | Authorization, Cookie, X-Api-Key | Critical (즉각 계정 탈취) | [REDACTED_AUTH_TOKEN] 완전 치환 |
log.entries[].response.headers | Set-Cookie, 세션 토큰 발행값 | Critical (세션 하이재킹) | 쿠키 속성 유지하되 값 해시 마스킹 |
log.entries[].request.postData.text | JSON 페이로드 (비밀번호, 카드번호, PII) | High (금융/개인정보 유출) | 필드 키 기반 재귀적 마스킹 |
log.entries[].request.queryString | URL 파라미터 내 액세스 토큰, OAuth 코드 | High (권한 위임 탈취) | 파라미터 값 마스킹 |
log.entries[].response.content.text | 사용자 프로필, 결제 내역 응답 원문 | Medium ~ High (정보 노출) | 정규표현식 패턴 치환 |
3. 샤논 엔트로피(Shannon Entropy)를 활용한 비밀 키 탐지 수학
민감 정보 중 Bearer나 password와 같이 명시적인 키워드가 없는 고유 토큰이나 암호화 비밀 키는 단순 사전 기반 매칭으로 탐지하기 어렵습니다. 이 경우 정보이론의 **샤논 엔트로피(Shannon Entropy)**를 적용하여 무작위성(Randomness)이 극도로 높은 고엔트로피 문자열을 수학적으로 식별합니다.
길이 인 문자열 에서 각 문자 가 전체 알파벳 집합 에서 나타나는 출현 확률을 라 할 때, 샤논 엔트로피 는 다음과 같이 계산됩니다:
일반적인 한국어/영어 문장의 엔트로피는 수준인 반면, 무작위 생성된 256비트 Base64 토큰이나 Hex 키는 다음과 같이 높은 엔트로피를 갖습니다:
따라서 문자열 길이 이면서 조건을 충족하는 토큰은 미확인 API 키 또는 세션 토큰으로 분류하여 자동 마스킹 처리를 수행합니다.
4. 결정론적 PII 정규표현식 마스킹 파이프라인
개인식별정보는 대한민국 개인정보보호법 및 글로벌 표준 규격에 따라 결정론적 정규식(Regex)을 적용하여 안전하게 비식별화합니다:
- 주민등록번호(RRN):
\b\d{6}-[1-4]\d{6}\b******-******* - 신용카드 번호(Luhn 검증 연계):
\b(?:\d{4}[- ]?){3}\d{4}\b****-****-****-**** - 이메일 주소:
([a-zA-Z0-9_.+-]+)@([a-zA-Z0-9-]+\.[a-zA-Z0-9-.]+)***@$2 - JWT 토큰 패턴:
ey[A-Za-z0-9_-]{10,}\.[A-Za-z0-9_-]{10,}\.[A-Za-z0-9_-]{10,}[REDACTED_JWT_TOKEN]
단순 정규표현식 매칭 시 발생하는 오탐(False Positive)을 방지하기 위해, Every-Forge 엔진은 신용카드 번호 패턴 매칭 시 룬(Luhn) 모듈로-10 체크섬 알고리즘을 2단계 검증 파이프라인으로 결합합니다. 유효한 체크섬을 만족하는 16자리 숫자만을 선별적으로 마스킹함으로써, 무고한 제품 시리얼 번호나 타임스탬프가 마스킹되어 디버깅 가치를 훼손하는 부작용을 원천 차단합니다. 또한 대한민국 주민등록번호 매칭 시에도 유효 생년월일 검증과 성별 식별 코드의 유효성을 정밀 검증하여 비식별화의 정확도를 극대화합니다.
5. 인브라우저 무손실 HAR 정제기 구현체
아래 TypeScript 코드는 브라우저 내부에서 대용량 HAR JSON 파일을 읽어들여 메인 스레드 블로킹 없이 모든 위험 요소를 마스킹한 후 안전한 정제 HAR 파일로 내보내는 정제 엔진입니다.
// Every-Forge Security Lab: In-Browser Pure HAR Sanitization Engine
export interface HarSanitizeOptions {
maskTokens: boolean;
maskCookies: boolean;
maskPii: boolean;
maskPostData: boolean;
}
export class HarSanitizer {
private static readonly JWT_REGEX = /ey[A-Za-z0-9_-]{10,}\.[A-Za-z0-9_-]{10,}\.[A-Za-z0-9_-]{10,}/g;
private static readonly CARD_REGEX = /\b(?:\d{4}[- ]?){3}\d{4}\b/g;
static calculateEntropy(str: string): number {
const len = str.length;
if (len === 0) return 0;
const freq: Record<string, number> = {};
for (let i = 0; i < len; i++) {
freq[str[i]] = (freq[str[i]] || 0) + 1;
}
let entropy = 0;
for (const char in freq) {
const p = freq[char] / len;
entropy -= p * Math.log2(p);
}
return entropy;
}
static sanitize(harJson: any, options: HarSanitizeOptions): any {
const sanitized = JSON.parse(JSON.stringify(harJson));
if (!sanitized.log || !Array.isArray(sanitized.log.entries)) {
throw new Error("유효하지 않은 HAR 포맷입니다.");
}
for (const entry of sanitized.log.entries) {
if (entry.request && Array.isArray(entry.request.headers)) {
for (const h of entry.request.headers) {
const name = h.name.toLowerCase();
if (options.maskTokens && (name === "authorization" || name === "x-api-key")) {
h.value = "[REDACTED_AUTH_HEADER]";
}
if (options.maskCookies && name === "cookie") {
h.value = "[REDACTED_COOKIE_SESSION]";
}
}
}
if (entry.response && Array.isArray(entry.response.headers)) {
for (const h of entry.response.headers) {
if (options.maskCookies && h.name.toLowerCase() === "set-cookie") {
h.value = "[REDACTED_SET_COOKIE]";
}
}
}
if (options.maskPostData && entry.request.postData?.text) {
let text = entry.request.postData.text;
text = text.replace(this.JWT_REGEX, "[REDACTED_JWT]");
text = text.replace(this.CARD_REGEX, "[REDACTED_CREDIT_CARD]");
entry.request.postData.text = text;
}
}
return sanitized;
}
}
6. OAuth 2.0 PKCE 인증 누출 방지와 WebSocket 프레임 마스킹
현대 단일 페이지 애플리케이션(SPA)에서 가장 흔히 발생하는 네트워크 토큰 누출은 OAuth 2.0 인증 절차의 인가 코드(Authorization Code)와 PKCE(Proof Key for Code Exchange) 코드 검증자(code_verifier) 교환 과정입니다. HAR 파일의 URL 쿼리 파라미터나 콜백 리다이렉트 응답 헤더에 이러한 일회성 인증 파라미터가 노출되면, 토큰 탈취 및 권한 대행 공격이 가능해집니다.
Every-Forge HAR 정제기는 일반적인 HTTP 요청/응답뿐만 아니라, HAR v1.2 규격의 _webSocketMessages 노드까지 심층 재귀 탐색합니다. 실시간 양방향 통신에서 교환되는 JSON-RPC 또는 STOMP 메시지 내부의 인증 페이로드를 가로채어 결정론적으로 마스킹함으로써, 웹소켓 통신을 포함한 엔터프라이즈 실시간 협업 애플리케이션의 네트워크 로그까지 한 치의 빈틈 없이 비식별화합니다.
7. 결론 및 Every-Forge 보안 아키텍처 통합
디버깅의 편리함이 조직의 기밀 정보 유출로 이어져서는 안 됩니다. HAR 파일 내부의 인증 토큰과 개인정보를 서버 전송 없이 로컬 브라우저 내부에서 완벽하게 파기하는 실전 보안 도구는 Every-Forge HAR 보안 분석기 바로가기에서 즉각 활용하실 수 있습니다.
HTTP Archive(HAR) 민감 토큰·쿠키·개인정보 Regex 자동 마스킹 및 타이밍 워터폴
Every-Forge Engine Lab
Verified AuthorPrincipal Systems & In-Browser Cryptography Architect
Every-Forge 엔진 랩은 브라우저 샌드박스 메모리 내에서 100% 동작하는 제로-서버(Zero-Server) 고성능 웹 엔지니어링을 연구합니다. WebGPU 셰이더 기반 연산, WebAssembly(WASM) 저지연 바이너리 파이프라인, W3C Web Crypto 표준의 영지식(Zero-Knowledge) 암호학 아키텍처, 그리고 통계적 확률론과 복리 수식 기반의 퀀트 금융 모델링을 직접 구현하고 오픈소스로 검증합니다.