개인정보 삭제와 감사 요구: 실무적 타협 패턴
개인정보 삭제와 감사 요구를 익명화, 톰스톤, 제한된 히스토리 뷰 같은 실무 패턴으로 균형 있게 처리해 운영을 깨지지 않게 할 수 있습니다.

삭제 요청이 감사 및 리포팅과 충돌하는 이유
사람들은 자신의 데이터를 삭제해 달라고 요청할 권리가 있습니다. 반면 팀은 신뢰할 수 있는 기록을 보관해야 할 현실적인 이유도 있습니다. 이 긴장이 드러나는 순간은 “모두 지워라”라는 요청이 환불, 사기 조사, 세무 감사, 차지백, 고객 지원 후속조치 같은 일상 작업과 충돌할 때입니다.
감사와 리포팅은 과거가 바뀌지 않는다는 전제에 의존합니다. 재무는 지난달 마감과 합계가 맞아야 하고, 보안은 사고 때 무슨 일이 있었는지 파악해야 합니다. 운영은 주문이 왜 취소됐는지, 왜 접근이 허용됐는지 설명할 필요가 있습니다. 삭제 요청으로 핵심 필드가 제거되거나 바뀌면 이런 기록들이 깨지고 리포트가 이전 승인된 내용과 일치하지 않게 됩니다.
이 충돌은 보통 작고 지저분한 곳에서 나타납니다:
- 지원 담당자가 티켓 스레드를 보는데 고객 식별 정보가 사라져 동의 내역을 확인할 수 없음.
- 재무 리포트는 합계가 맞지만, 인보이스가 더 이상 존재하지 않는 고객 레코드를 참조해 감사인이 문제 제기.
- 보안팀은 로그에 "User deleted"만 보이고 시스템 간 이벤트를 연결할 수 없어 접근 내역을 확인할 수 없음.
“충분히 좋음”은 대개 “모든 것을 영구 보관”이나 “모든 흔적을 지움”이 아닙니다. 실무 목표는 더 이상 필요 없는 개인 데이터를 삭제하거나 비식별화하면서도 법적 의무와 시스템 무결성을 위해 최소한의 방어 가능한 기록을 보관하는 것입니다. 핵심은 증명해야 할 것(사건이 발생했다, 결제가 이루어졌다, 정책이 수락됐다)과 사람을 식별하는 것(이름, 이메일, 전화, 주소, 기기 식별자)을 분리하는 것입니다.
다음 질문들이 기준을 정하는 데 도움이 됩니다:
- 법적으로 보관해야 하는 항목(세무, 회계, 고용 등)은 무엇이며 보관 기간은 얼마인가?
- 보안상 보관해야 하는 항목(사기, 남용, 조사 등)은 무엇이며 보관 기간은 얼마인가?
- 비식별화된 형태로만 보관할 수 있는 항목은 무엇인가?
- 보관된 기록에 누가 어떤 승인으로 접근할 수 있는가?
이 결정은 제품만의 문제가 아닙니다. 법무는 보존 및 삭제 규칙을 정의하고, 보안은 어떤 로그가 필요하고 누가 볼 수 있는지 정합니다. 운영과 재무는 무엇이 실무에서 유지되어야 하는지 정의합니다. 제품과 엔지니어링은 뚫린 구멍 없이 구현하는 방식을 결정합니다.
패턴을 선택하기 전에 알아둘 핵심 용어
팀들은 종종 데이터 타입과 ‘히스토리’의 종류를 섞어 씁니다. 초기에 용어를 분명히 해두면 준수하는 것처럼 보이지만 리포팅, 지원, 재무를 망가뜨리는 프로세스를 피할 수 있습니다.
개인 데이터는 사람을 직접 또는 간접적으로 식별할 수 있는 모든 것입니다. 이름, 이메일, 전화, 주소 같은 명백한 필드뿐 아니라 기기 ID, IP 주소, 누군가를 언급한 자유형 노트도 포함됩니다. 고유한 고객 ID도 해당 인물로 다시 매핑할 수 있다면 개인 데이터가 됩니다.
비즈니스 기록은 인보이스, 결제 확인, 배송 기록, 계약 메타데이터처럼 운영 또는 법적 이유로 보관해야 하는 문서들입니다. 이러한 기록은 종종 개인 데이터를 포함하므로 “인보이스를 보관하라”는 말은 보통 “인보이스는 보관하되 사람을 식별하는 정보는 제거하거나 대체하라”는 뜻입니다.
삭제 관련 일반 용어:
- 하드 삭제(Hard delete): 데이터베이스 행을 완전히 제거해 더 이상 접근할 수 없게 함.
- 소프트 삭제(Soft delete): 행은 남아 있지만 삭제로 표시되어 대부분 화면에서는 숨김.
- 가명처리(Pseudonymization): 식별자를 플레이스홀더로 대체하지만 키나 매핑으로 나중에 재식별이 가능함.
- 익명화(Anonymization): 재식별이 현실적으로 불가능하도록 식별자를 제거함.
감사 로그, 활동 히스토리, 분석 테이블도 서로 다릅니다.
- 감사 로그는 "누가, 언제, 무엇을 변경했나"에 답하며 보통 추가(append-only) 방식입니다.
- 활동 히스토리는 사용자 대상의 타임라인(티켓 업데이트, 발송된 이메일, 상태 변경)입니다.
- 분석 테이블은 집계 리포팅용이며 보통 직접 식별자가 거의 필요하지 않습니다.
보존 기간(retention window)은 데이터를 보관하는 시간 한도입니다. 법적 보류(legal hold)는 조사, 분쟁 또는 규제 필요로 인해 삭제를 일시 중단하는 예외입니다.
간단한 결정 테스트는: 삭제 후에도 무엇을 증명해야 하고(결제, 승인, 접근), 무엇을 제거하거나 일반화해도 그 증명이 깨지지 않는가? 입니다.
패턴 1: 신중한 익명화 및 가명처리
기록을 완전히 삭제하면 운영이 깨지는 경우가 있습니다. 인보이스는 세무상 필요할 수 있고, 지원 티켓은 품질 검토를 위해 필요할 수 있으며, 보안 이벤트는 사고 대응에 필요할 수 있습니다. 이런 경우 개인 데이터를 통째로 지우는 것보다 대체하는 것이 더 안전할 때가 많습니다.
익명화는 실질적으로 개인으로 되돌아갈 수 없게 하는 것이고, 가명처리는 추가 데이터(매핑 테이블 등)를 통해 재식별할 수 있게 합니다. 많은 팀에게 가명처리는 실용적인 중간 지점이지만, 재식별 경로를 남기므로 매우 민감하게 다뤄야 합니다.
직접 식별하는 필드부터 시작해, 신원을 ‘유출’할 수 있는 필드들을 처리하세요.
우선 익명화할 항목
직접 식별자(이름, 이메일, 전화번호, 주소)와 흔한 간접 식별자(기기 ID, 광고 ID, IP 주소, 정밀 위치)를 우선 처리하세요. 그다음 가장 까다로운 항목인 자유형 텍스트를 다루세요.
자유형 텍스트 때문에 많은 삭제 계획이 실패합니다. 구조화된 필드를 지워도 지원 노트에 "ACME의 John이 +1...에서 전화함" 같은 내용이 남을 수 있습니다. 자유형 텍스트를 유지해야 한다면 마스킹 규칙을 적용하거나 더 짧은 보존 기간의 별도 저장소로 옮기는 것을 고려하세요. 첨부파일과 이미지도 얼굴, 신분증, 서명이 예상치 못한 곳에 저장되는 경우가 많으니 주의가 필요합니다.
정체성 없이 고유성 유지하기
리포팅과 중복 제거에는 흔히 안정성이 필요합니다: "이전 고객과 같은 사람인가?"를 알되 누군지 몰라야 합니다. 일반적인 방법은 시크릿 솔트로 해시하거나, 토큰화(랜덤 토큰), 매핑 테이블을 사용하는 것입니다.
매핑 테이블을 유지한다면 고위험 자산으로 취급하세요. 접근을 제한하고, 모든 접근을 로그로 남기며, 재식별 시 명시적 승인이 필요하도록 권한을 분리하는 방안을 고려하세요. 그렇지 않으면 “어차피 다 볼 수 있다”는 패턴으로 무력화됩니다.
구체적 예: 주문 기록은 유지하되 customer_name과 email은 토큰으로 대체합니다. 세금 보고를 위해 국가 정보는 유지하고, 중복 제거를 위해 원래 이메일의 솔트 해시를 보관합니다.
실무적 테스트는 간단합니다: 변경 후 일반 운영자가 여전히 업무(재무 합계, 티켓 수, 사기율 등)를 수행할 수 있으면서도 특정 인물을 식별할 수 없어야 합니다.
패턴 2: 전체 레코드 대신 톰스톤(tombstones)
톰스톤 레코드는 삭제된 레코드의 의도적으로 비어 있는 버전으로, 다른 데이터가 참조할 수 있는 스텁(stub) 행을 유지합니다. 이렇게 하면 개인 데이터를 제거하면서도 참조가 끊기는 것을 방지할 수 있습니다.
고객을 하드 삭제하면 그 고객을 참조하던 인보이스, 티켓, 메시지, 로그가 리포트나 앱에서 오류를 내거나 실패할 수 있습니다. 톰스톤은 관계를 유지해 합계가 맞고 티켓이 열려 있으며 감사 추적이 존재했다는 사실을 노출하지만, 누가 그 사람인지 드러내지 않습니다.
톰스톤에 보통 포함되는 항목
좋은 톰스톤은 최소한만 포함합니다: 시스템이 작동하도록 하고 삭제가 발생했음을 증명할 정도의 정보이면서 재식별 가능성은 없애는 것입니다. 실제로는 삭제 상태, 삭제 타임스탬프(때로는 누가 승인했는지), 사유 코드, 무결성에 필요한 내부 식별자 정도가 포함됩니다. 포함해서는 안 되는 것은 이름, 이메일, 전화번호, 주소, 메시지 본문, 첨부파일, 자유형 메모 등입니다.
외래키, 인보이스, 티켓, 메시지 처리
대부분 시스템은 기본 키와 외래키는 유지하되 개인 필드는 지우거나 널(null)로 만듭니다. 인보이스는 동일한 customer_id를 계속 참조할 수 있고, UI에서는 이름 대신 “삭제된 고객” 같은 문구를 표시할 수 있습니다.
티켓과 메시지는 콘텐츠 안에 개인 정보가 자주 들어 있으므로 추가 조치가 필요합니다. 안전한 접근은 관계 포인터는 유지해 리포트와 조인이 작동하도록 하고, 메시지 텍스트나 첨부파일 같은 콘텐츠 필드는 마스킹하거나 삭제하는 것입니다. 규정 준수를 위해 일부 세부 정보가 필요하다면 더 엄격한 접근 통제를 가진 별도 저장소에 보관하세요.
톰스톤이 적합하지 않은 경우
레코드 자체가 본질적으로 민감하거나 엄격히 규제되는 경우(건강 관련 정보, 정부 발급 ID, 생체 정보, 정밀 위치 기록 등)에는 톰스톤이 적합하지 않습니다. 이런 경우 원본 행을 완전히 삭제하고 별도의 비식별 감사 이벤트(예: "record deleted at time X")만 남겨야 할 수 있습니다.
감사인을 위한 톰스톤 문서화
감사인은 보통 개인 데이터 자체보다 통제 증거를 원합니다. 무엇을 지웠고 무엇을 남겼는지, 그리고 그 이유를 문서화하세요. 누가 삭제된 레코드를 볼 수 있는지, 리포트에서 어떻게 보이는지, 재식별을 방지하기 위해 어떤 조치를 취했는지(예: 자유형 ‘사유’ 메모 금지하고 사유 코드를 사용) 명확히 하세요.
패턴 3: 제한된 히스토리 뷰와 마스킹
항상 개인 데이터가 영구히 필요한 것은 아닙니다. 필요한 것은 어떤 작업이 일어났다는 증거일 뿐인 경우가 많습니다. 이 패턴은 감사 증거와 편의용 뷰를 분리합니다.
실무적으로는 "인보이스 승인됨"이나 "환불 처리됨" 같은 이벤트를 감사 로그로 유지하고, 사용자용 히스토리에서는 누가 어떤 세부 정보를 봤는지 보여주도록 분리하는 방식을 많이 씁니다. 삭제 요청 이후에는 감사 로그는 남기되 히스토리에 표시되는 개인 필드는 역할에 따라 가려지는 방식입니다.
역할 기반 접근: 누가 무엇을 볼 수 있나
민감한 히스토리는 공용 복도처럼 다루지 말고 통제된 방처럼 다루세요. 실제로 어떤 역할이 무엇을 필요로 하는지 결정하세요. 지원은 티켓 상태와 타임스탬프를, 재무는 거래 ID를 필요로 할 수 있지만 둘 다 전체 프로필을 볼 필요는 없습니다.
간단한 규칙 몇 가지로 충분한 경우가 많습니다: 대부분 직원은 기본적으로 마스킹된 히스토리를 보고, 소수의 프라이버시/보안 역할은 사유를 제시하면 더 많은 정보를 볼 수 있도록 하며, 엔지니어는 요청 ID나 오류 코드 같은 기술 필드는 보되 사용자 텍스트는 보지 않도록 합니다. 관리자인 것이 자동으로 "모든 것을 볼 수 있음"을 의미해서는 안 됩니다.
지저분한 데이터에 대한 마스킹 규칙
구조화된 필드는 지우기 쉽습니다. 자유형 텍스트와 파일이 프라이버시 유출의 주요 원인입니다. 자유형 텍스트에 대한 명시적 규칙(이메일, 전화번호, 주소 제거), 첨부파일(삭제하거나 비노출 해시 및 파일 타입/크기만 보관), 내부 메모, 검색 기능에 대한 규칙을 만드세요. 검색은 흔한 유출 경로입니다: 누군가 삭제된 이메일로 검색할 수 있다면 UI에서 가린다고 해도 의미가 없습니다.
조사 중에는 시간 제한된 접근이 유용합니다. 누군가가 비마스킹 히스토리에 접근해야 할 경우 접근 권한이 자동으로 만료되도록 하고, 사유 코드를 요구하며 그 접근을 기록하세요.
또한 로그에 대한 접근 자체를 기록하세요. 민감한 히스토리를 본 행위는 별도의 감사 이벤트로 남겨야 합니다: 누가 무엇을 언제 왜 봤는지 기록하세요.
현실 점검: 지원 담당자가 옛 노트에서 삭제된 이메일을 복사-붙여넣기할 수 있다면, 당신의 "삭제"는 단지 외관상의 처리에 불과합니다.
단계별: 감사 기능을 유지하는 삭제 워크플로 설계
좋은 워크플로는 하나의 큰 "삭제" 버튼보다 명확한 선택을 하고 그 선택을 증명하는 것에 가깝습니다.
먼저 개인정보가 실제로 어디에 존재하는지 매핑하세요. 대개 몇몇 DB 테이블에만 있지 않습니다. 로그, 분석 이벤트, 내보내기 파일, 첨부파일, 백업에도 존재합니다.
그다음 데이터 타입별로 결과를 정의하세요. 어떤 필드는 삭제해야 하고, 어떤 필드는 익명화해야 하고, 어떤 필드는 법적/재무적 이유로 보관하되 최소화하고 잠그는지 정하세요.
대부분 제품이 일관되게 실행할 수 있는 시퀀스 예시는 다음과 같습니다:
- 데이터 위치(핵심 테이블, 이벤트 로그, 내보내기, 백업)를 인벤토리화하고 각 항목의 소유자를 지정합니다.
- 데이터 타입별 규칙을 설정합니다: 삭제, 익명화, 보관 — 각 항목에 대한 이유와 보존 기간을 명시합니다.
- 요청 접수 시 신원 확인 절차를 추가합니다(결제가 있는 계정은 사기 검사도 수행).
- 감사 가능한 워크플로로 실행합니다: 필요 시 승인, 일관된 작업(job), 명확한 타임스탬프.
- 개인 데이터를 다시 저장하지 않고 수행 사실을 증명하는 완료 기록을 작성합니다.
많은 팀이 마지막 항목에서 실수합니다. "삭제 증명서"에는 이전 이메일, 전체 이름, 주소, 자유형 노트 같은 개인 데이터가 포함되어서는 안 됩니다. 케이스 ID, 관련 내부 ID, 실행된 작업, 승인자 및 시간 범위를 포함하세요.
사람들이 잊는 복사본 모니터링
데이터베이스 워크플로가 좋아도 개인 데이터는 주변 채널로 새어나갑니다. 주의해야 할 곳은 CSV 내보내기, 이메일 인박스와 전달 스레드, 운영/영업팀이 사용하는 스프레드시트, 지원 티켓과 첨부파일, 웹훅으로 데이터가 전달되는 타사 도구 등입니다.
예시: 재무와 지원 기록을 사용 가능하게 유지하며 고객 삭제하기
고객이 계정 삭제를 요청했습니다. 동시에 유료 인보이스(세무 목적 및 차지백 분쟁 대응 필요)와 1년치 지원 티켓(품질 지표와 반복 버그 분석 필요)이 있습니다. 이것이 전형적인 "개인정보 삭제 vs 감사 필요"의 충돌입니다.
실무적 분리는 보통 다음과 같습니다(법적 근거가 제한된 재무 보존을 허용한다고 가정): 프로필 세부(이름, 이메일, 전화), 저장된 주소, 마케팅 설정, 기기 지문, 개인 정보가 포함될 수 있는 자유형 노트를 제거합니다; 지원 티켓과 분석에서는 무작위의 비가역 토큰으로 고객 식별자를 익명화합니다; 인보이스, 결제 상태, 세금 필드 등 사건을 증명하는 필드는 보관하되 접근을 제한합니다.
지원 티켓에서 문제를 먼저 느끼는 경우가 많습니다. 고객 레코드를 하드 삭제하면 타임라인이 깨집니다: "티켓 배정" 이벤트가 맥락을 잃고 지표가 누락되며 감독자가 사례를 검토할 수 없습니다. 흔한 해결책은 톰스톤입니다: 고객 행을 유지하되 개인 필드를 지우고 삭제로 표시합니다.
감사인은 삭제가 수행되었다는 증거를 원하지만 대부분 직원은 식별 데이터를 볼 필요가 없습니다. 제한된 히스토리 뷰를 사용하세요: 일반 상담원은 마스킹된 필드를 보고, 소수의 프라이버시+재무 역할은 보존 이유와 변경 내역을 볼 수 있도록 합니다.
최종 감사 항목은 비엔지니어도 읽을 수 있어야 합니다. 예:
2026-01-25 14:32 UTC: Deletion request completed for Customer ID 18429.
Personal fields removed (name, email, phone, address).
Support tickets re-linked to Anon ID A9F3K.
Invoices retained for 7 years due to accounting obligations; access limited to Finance role.
Action approved by Privacy Officer (user: m.lee).
Export of retained fields stored.
자주 하는 실수와 함정
가장 큰 함정 중 하나는 소프트 삭제(soft delete)를 법적 방패로 취급하는 것입니다. 행을 플래그로 숨겨두는 것은 데이터베이스, 백업, 내보내기, 로그에 여전히 개인 데이터가 남아 있음을 의미합니다. 정책에 "삭제"라고 적혀 있다면 규제 당국은 보통 개인 필드가 제거되거나 돌이킬 수 없게 변경되기를 기대합니다. 단지 UI에서 숨기는 것만으로는 부족합니다.
또 다른 문제는 익명화된 ID를 실제 사람과 매핑하는 "비밀" 조회 테이블을 만들고 너무 많은 역할에 접근을 허용하는 것입니다. 재식별 경로가 정말 필요하다면(예: 짧은 분쟁 기간 동안) 범위를 엄격히 제한하세요: 시간 제한, 접근 제한, 강력한 로깅.
자주 반복되는 문제들:
- 핵심 데이터베이스 외부의 데이터(내보내기, 이메일 인박스, 분석 이벤트, 오래된 CSV)를 잊음.
- 자유형 필드에 개인 데이터를 아무런 마스킹 없이 저장.
- 조인, 집계, 재무 정산에 사용되는 키를 삭제해 리포트가 깨짐.
- 감사 로그를 과도하게 공유해 "누구나 다 볼 수 있음" 상황이 됨.
- 무슨 일이 있었는지, 언제, 누가 승인했는지 증명할 수 있는 기록이 없음.
특히 자유형 텍스트는 계획에 없던 곳으로 개인 데이터를 퍼뜨리므로 까다롭습니다. 입력 가능한 내용을 제한하고, 마스킹 도구를 추가하며, 제어 가능한 구조화된 필드로 세부를 옮기는 것을 미리 계획하세요.
비즈니스가 의존하는 키를 삭제해 버리면 주의하세요. 인보이스 행이 고객 레코드에 조인한다면 고객 ID를 삭제하면 월말 합계가 엉망이 됩니다. 톰스톤과 비식별 참조 키는 신원 정보를 유지하지 않으면서 리포팅을 보존합니다.
증명 설계를 건너뛰지 마세요. 규제기관이 누군가의 데이터에 무슨 일이 있었는지 물으면 추측에 의존하지 않는 답을 줄 수 있어야 합니다.
정책을 공개하기 전 간단한 점검
삭제 정책을 발표하기 전에 드라이 런을 해보세요. 정책은 읽기에는 명확하지만 일관되게 실행할 수 없을 때 실패합니다.
데이터를 실제로 찾을 수 있는지 확인하세요. 개인 데이터는 노트, 지원 티켓, 이벤트 로그, 첨부파일, 커스텀 필드 등 곳곳에 숨습니다.
대부분 문제를 잡아내는 짧은 체크리스트:
- 하나의 식별자만으로 한 사람의 개인 데이터를 테이블, 로그, 파일, 서드파티 도구 전반에서 모두 찾아낼 수 있는가?
- 각 필드별로 삭제/익명화/보관(그리고 그 이유)을 표시한 결정 표가 있는가?
- 톰스톤을 사용하는 경우 그것들이 정말 최소한이며 간접 식별자를 포함하지 않는가?
- 감사 및 히스토리 뷰는 역할별로 제한되어 있고, 민감 히스토리의 모든 뷰나 내보내기가 로그로 남는가?
- 백업과 내보내기에 대한 규칙(무엇을 삭제하고 무엇이 만료되는지)과 그 일정을 지킬 수 있는가?
어떤 질문이라도 "그런가 보다"면 설계를 멈추고 강화하세요. "그런가 보다"는 대개 누군가가 나중에 잊힌 내보내기, 오래된 분석 테이블, 또는 여전히 개인 정보를 포함한 지원 첨부파일을 발견하게 된다는 의미입니다.
실무 테스트로는 실제 사용자를 하나 골라 데이터가 끝까지 어디에 나타나는지 추적해 보세요. 모든 등장 위치를 적고 요청을 시뮬레이션해 어떤 것이 즉시 바뀌고(예: DB), 어떤 것이 나중에 바뀌는지(예: 백업), 무엇이 남는지를 확인하세요. 팀이 이 작업을 한 시간 내에 못하면 워크플로가 준비되지 않은 것입니다.
다음 단계: 팀 속도를 늦추지 않고 패턴을 제품에 적용하기
규칙을 작고 눈에 보이며 테스트 가능한 형태로 만드세요. 한 페이지짜리 결정 표가 잘 통합니다: 데이터 타입 -> 조치 -> 보존 기간 -> 삭제 후 누가 무엇을 볼 수 있는가. 문구는 간단히 하고 행동 수는 제한해 사람들이 압박받을 때 새로운 행동을 만들지 못하게 하세요.
간단한 계획:
- 상위 데이터 타입(고객, 인보이스, 티켓, 메시지, 기기 ID)별 결정 표 초안 작성.
- 몇 개의 역할을 선택하고 삭제 후 접근 권한 정의(예: 상담원, 매니저, 감사인).
- 소규모 샘플에 워크플로 프로토타입 적용: 고객 프로필 + 재무 기록 하나 + 지원 기록 하나 + 감사 이벤트 하나.
- 실사용 환경에서 끝에서 끝까지 삭제 요청을 실행해 보고, 내보내기와 리포트를 포함해 테스트.
- 법적 보류와 사기 예외 처리를 위한 절차와 책임자를 정함.
이걸 AppMaster(appmaster.io)에서 구현한다면 데이터 스키마에 보존 선택을 직접 모델링하고 Business Processes와 역할 기반 화면으로 이를 강제하는 것이 도움이 됩니다. AppMaster는 요구사항이 바뀔 때 실제 소스 코드를 재생성하므로 보존 규칙을 반복적으로 바꾸더라도 이전 로직이 남아 있는 상태로 남기기 쉽지 않습니다.
자주 묻는 질문
더 이상 필요하지 않은 개인 데이터를 제거하거나 되돌릴 수 없을 정도로 비식별화하면서도 핵심 비즈니스 이벤트(결제, 승인, 접근 등)를 증명하고 보고가 일관되게 유지되도록 최소한의 기록을 남기세요. 실무적으로는 “사건을 증명하라(prove the event)”와 “사람을 식별하라(identify the person)”를 분리하는 것이 핵심입니다.
Hard delete는 행 자체를 완전히 삭제해 외래키, 보고서, 과거 참조를 깨뜨릴 수 있습니다. Soft delete는 행을 숨기지만 개인 데이터는 보통 여전히 남아 있으므로, 개인 정보를 완전히 지우려면 식별 필드를 지우거나 변형하는 추가 조치가 필요합니다.
Pseudonymization은 식별자를 대체하되(매핑 테이블이나 키로) 나중에 다시 식별할 수 있는 경로를 남깁니다. 그래서 민감 자산으로 취급해 엄격한 접근 통제를 적용해야 합니다. Anonymization은 재식별이 현실적으로 불가능하도록 식별자를 제거하는 것으로, 더 안전하지만 자유형 텍스트나 고유 패턴이 있을 때 정확하게 수행하기 어렵습니다.
자유형 텍스트는 이름, 이메일, 전화번호, 주소 등 구조화된 필드 삭제 규칙을 우회하는 정보가 들어있기 쉽습니다. 텍스트를 유지해야 한다면 적절한 마스킹/조회 규칙을 적용하거나 별도 저장소에 보관해 보존 기간을 짧게 하고 접근을 엄격히 제한해야 합니다. 그렇지 않으면 삭제는 대부분 겉치레에 불과합니다.
톰스톤은 개인 정보를 제거하면서도 다른 데이터가 참조할 수 있는 최소한의 자리(stub)를 남기는 방식입니다. 이를 통해 송장, 티켓, 로그 등이 같은 ID로 연결되어 합계가 맞고 앱이 정상 동작하도록 할 수 있습니다. UI에는 예를 들어 “삭제된 고객”과 같은 중립 라벨을 표시할 수 있습니다.
무결성과 증명을 위해 필요한 최소한만 남기세요: 삭제 플래그, 삭제 시각(및 필요 시 승인자), 사유 코드, 조인 및 재무 정산에 필요한 내부 식별자 등. 이름, 이메일, 전화번호, 주소, 메시지 본문, 첨부파일, 자유형 ‘사유’ 메모 등은 포함하면 안 됩니다.
업무상 누가 어떤 히스토리 필드를 실제로 필요로 하는지 정의하고, 기본적으로는 마스킹된 뷰를 제공하세요. 조사 목적으로 더 많은 정보가 필요하면 사유 코드로 시간 제한된 접근을 부여하고 그 접근 자체를 감사 기록으로 남기면 됩니다.
감사 로그는 “누가 무엇을 언제 했는가”에 답하는 append-only 기록이고, 사용자용 히스토리는 편의성을 위한 것으로 종종 식별 정보를 포함합니다. 삭제 이후에는 최소한의 사건 중심 감사 로그를 유지하되 사용자용 히스토리에서는 식별 정보를 마스킹하는 접근이 일반적입니다.
재도입할 수 있는 개인 데이터를 다시 저장하지 않도록 하면서 수행한 작업을 증명해야 합니다. 케이스 ID, 내부 레코드 ID, 실행한 작업 목록, 타임스탬프, 승인자, 보존 사유 등을 포함하세요. 이전 이메일, 전체 이름, 주소, 삭제 전 데이터의 스크린샷 등은 저장하지 마십시오.
데이터 스키마에 보존 결과를 모델링하고, 특정 필드를 지우거나 변형하는 감사 가능한 워크플로로 구현하세요. AppMaster에서는 Business Processes와 역할 기반 화면으로 이를 강제해 수작업 예외 없이 일관된 삭제를 구현하는 경우가 많습니다.


