JSON 특정 키 삭제, 여러 개 한번에 지우기

중첩된 JSON 응답이나 로그 데이터에서 password, token, hash 같은 여러 개의 민감한 프로퍼티를 한 번에 지우려면, 그 키가 최상위에 있든 배열 속 객체 안 몇 겹 더 들어간 곳에 있든 빠짐없이 찾아 제거해야 합니다.
JSON 키 제거기는 쉼표로 나열한 키 이름 목록을 받아 객체 트리 전체를 재귀적으로 훑으면서, 이름이 정확히 일치하는 프로퍼티만 걸러내고 나머지는 그대로 복사합니다.
이 글은 그 매칭과 순회가 내부적으로 어떤 규칙으로 동작하는지, 그리고 결과 화면에 뜬 값을 어떻게 해석해야 하는지를 사실 기반으로 정리합니다.
요약 ① 쉼표로 나눈 키 이름들은 각각 트림된 뒤 동시에 매칭 대상이 되며, 배열 속 객체와 깊게 중첩된 객체까지 재귀적으로 전부 훑습니다. ② 대소문자 구분 없음 옵션이 켜지면 키 이름을 소문자로 바꿔 비교하고, 꺼지면 원문 그대로 정확히 일치해야만 지워집니다. ③ 매칭은 완전 일치만 지원해 부분 문자열은 지워지지 않고, JSON 형식이 틀리면 에러만 뜨고 출력창은 비워집니다.
여러 키를 한 번에, 여러 겹 아래까지 지워야 하는 상황
API 응답을 로그로 남기거나 버그 리포트에 첨부할 때, 그 안에는 흔히 password, secret_token, salt처럼 그대로 노출하면 곤란한 필드가 여러 개 섞여 있습니다. 문제는 이런 필드가 최상위 객체 하나에만 있는 게 아니라는 점입니다.
사용자 목록 API 응답이라면 users 배열 안에 들어 있는 객체마다 password가 들어 있고, 그 객체 안에 다시 session이라는 하위 객체가 있어 거기에 secret_token이 한 번 더 들어 있는 식입니다.
이런 구조를 텍스트 에디터에서 눈으로 찾아 하나씩 지우면, 배열 원소가 몇 개인지에 따라 지워야 할 개수가 그만큼 곱해지고 하나라도 빠뜨리기 쉽습니다.
원하는 건 "이 이름을 가진 키는 어디에 있든 전부 지운다"는 규칙 하나를 정해두고, 그 규칙을 객체 트리 전체에 일관되게 적용하는 것입니다.
도구 없이 직접 지우는 방법
이 작업은 자바스크립트 실행 환경(브라우저 개발자 도구 콘솔이나 Node.js)만 있으면 코드 몇 줄로 직접 할 수 있습니다. 핵심은 JSON.stringify가 두 번째 인자로 받는 replacer 함수입니다.
replacer 함수로 재귀 순회하기
JSON.stringify(value, replacer, space)에서 replacer가 함수이면, 이 함수는 최상위 값부터 시작해 객체와 배열의 모든 프로퍼티에 대해 재귀적으로 호출됩니다. 매 호출마다 현재 키 이름과 값을 받습니다.
undefined를 반환하면 그 프로퍼티는 결과 문자열에서 통째로 빠집니다. 이 재귀 호출은 배열 안에 들어 있는 객체에도 똑같이 적용되므로, 별도로 순회 코드를 짜지 않아도 중첩 깊이에 상관없이 동작합니다.
지우고 싶은 키 이름들을 쉼표로 적어 배열로 만들고, 각 항목을 trim한 뒤 replacer 안에서 비교하면 됩니다.
const raw = JSON.parse(inputText);
const targetKeys = "password, secret_token, salt"
.split(",")
.map((k) => k.trim());
const cleaned = JSON.stringify(
raw,
(key, value) => (targetKeys.includes(key) ? undefined : value),
2
);
대소문자 구분 없이 지우기
대소문자를 구분하지 않고 지우고 싶다면, 비교 전에 키 이름과 목록을 모두 소문자로 바꿔 비교하면 됩니다.
const lowerKeys = targetKeys.map((k) => k.toLowerCase());
const cleaned = JSON.stringify(
raw,
(key, value) => (lowerKeys.includes(key.toLowerCase()) ? undefined : value),
2
);
이 코드가 정확히 도구가 내부적으로 하는 일과 같습니다. 다만 매번 콘솔을 열고 코드를 붙여넣는 대신, 입력창에 JSON을 붙여넣고 키 이름만 바꿔가며 바로 결과를 보고 싶다면 아래 도구를 쓰면 됩니다.
저희 도구로 확인하기.
서버 전송 없이 브라우저에서만 계산되며, 여러 키를 쉼표로 한 번에 지정해 재귀적으로 제거합니다

결과가 예상과 다를 때 흔히 놓치는 지점
결과창을 보고 "왜 이 키는 안 지워졌지" 또는 "왜 이 부분까지 지워졌지"라는 의문이 들 때는 대개 아래 네 가지 중 하나가 원인입니다.
| 상황 | 실제 동작 |
|---|---|
키 이름 목록에 password만 적었는데 password_hash, user_password도 있음 | 완전 일치만 지원하므로 지워지지 않습니다. 부분 문자열 매칭이 아닙니다. |
쉼표 뒤에 공백을 넣거나 안 넣음 (password, token vs password,token) | 각 키 이름은 분리 후 자동으로 트림되므로 공백 유무는 결과에 영향을 주지 않습니다. |
| 대소문자 구분 없음 체크박스가 켜져 있음 (기본값) | Password, PASSWORD, password가 모두 소문자로 변환되어 비교되므로 전부 지워집니다. |
| 대소문자 구분 없음 체크박스를 끔 | 목록에 적은 철자와 완전히 같은 대소문자인 키만 지워지고, Password는 남습니다. |
배열과 잘못된 JSON은 어떻게 처리되나
배열 안에 객체가 여러 개 들어 있는 구조도 예외 없이 처리됩니다. 배열은 각 원소를 다시 재귀 함수에 넘겨 순회하므로, 배열 속 객체 하나하나에 들어 있는 대상 키가 모두 지워지고, 그 객체 안에 또 다른 객체가 있다면 그 안까지 내려가서 지웁니다.
입력창에 넣은 텍스트가 유효한 JSON이 아니면 JSON.parse 단계에서 실패하고, 화면에는 파싱 에러 메시지만 뜨고 출력창은 채워지지 않습니다.
결과가 비어 있다면 키 이름보다 먼저 입력 JSON의 문법(따옴표 누락, 트레일링 콤마 등)을 확인하는 것이 순서입니다.
마지막으로, 결과는 버튼을 눌러야만 다시 계산됩니다. 입력창이나 키 목록을 수정하는 도중에는 출력이 자동으로 바뀌지 않고, 키 제거하기 버튼을 다시 눌러야 최신 입력 기준으로 결과가 갱신됩니다.
정리
- 키 목록은 쉼표로 구분하고, 각 항목은 자동으로 트림되어 동시에 매칭 대상이 됩니다.
- 재귀 순회는 배열 속 객체와 깊게 중첩된 객체까지 예외 없이 적용됩니다.
- 대소문자 구분 없음 옵션의 켜짐/꺼짐에 따라
Password와password가 같은 키로 취급되는지가 갈립니다. - 매칭은 완전 일치만 지원하므로 부분 문자열을 포함한 키는 지워지지 않습니다.
- 잘못된 JSON을 넣으면 에러만 뜨고 출력은 비워지며, 결과는 버튼을 눌러야 다시 계산됩니다.
서버 전송 없이 브라우저에서만 계산되며, 여러 키를 쉼표로 한 번에 지정해 재귀적으로 제거합니다
자주 묻는 질문
키 이름의 일부만 같아도 지워지나요?
지워지지 않습니다. 매칭은 트림된 키 이름과의 완전 일치만 확인하므로, 목록에 token만 적었다면 token이라는 키만 지워지고 access_token이나 token_id처럼 이름 일부만 같은 키는 그대로 남습니다.
쉼표 뒤에 공백을 넣지 않고 붙여 써도 되나요?
됩니다. 키 목록은 쉼표를 기준으로 나눈 뒤 각 항목의 앞뒤 공백을 자동으로 제거하므로, password,token처럼 붙여 써도 password, token처럼 띄어 써도 매칭 결과는 같습니다.
배열 안에 있는 여러 객체의 키도 한꺼번에 지워지나요?
지워집니다. 배열을 만나면 각 원소를 다시 재귀적으로 순회하므로, 배열 속 객체 100개에 모두 같은 이름의 키가 있다면 100개 전부에서 지워집니다. 그 객체 안에 또 다른 객체나 배열이 있어도 계속 내려가며 처리합니다.
입력한 JSON 형식이 잘못되면 어떻게 되나요?
JSON.parse가 실패하는 시점에서 처리가 멈추고, 화면에는 파싱 에러 메시지만 표시되며 출력창에는 아무것도 채워지지 않습니다. 따옴표 누락이나 마지막 항목 뒤의 불필요한 쉼표(trailing comma) 같은 문법 오류가 흔한 원인입니다.
