검은색 상자만으로는 부족한 이유

대부분의 PDF 도구는 민감한 텍스트 위에 검은색 사각형을 그려 "검열(redact)"할 수 있게 합니다. 이 사각형은 화면에서 단어를 숨겨주지만, 그 아래의 문자는 파일의 콘텐츠 스트림에 그대로 남아 있습니다. 누구나 숨겨진 텍스트를 선택하여 복사하거나, 간단한 스크립트를 실행해 추출할 수 있습니다. 다시 말해, 데이터는 여전히 존재하며 검은색 상자는 시각적인 덮개일 뿐입니다.

개발자가 직면한 문제

저자는 파일을 서버에 업로드하지 않고 브라우저에서만 완전히 실행되는 PDF 편집기가 필요했습니다. 이러한 제약 조건 때문에 텍스트를 제거하기 위해 백엔드 서비스에 의존하는 것은 불가능합니다. 기존의 클라이언트 측 솔루션은 단순히 콘텐츠 위에 도형을 추가할 뿐이어서 원본 텍스트가 그대로 유지됩니다. 과제는 작업을 빠르게 유지하고 문서의 사용성을 보존하면서 텍스트를 영구적으로 제거하는 것이었습니다.

선택적 페이지 래스터화: 핵심 아이디어

파일 크기를 키우고 검색 기능을 망가뜨리는 전체 PDF 이미지 변환 대신, 이 솔루션은 검열이 포함된 페이지 래스터화합니다. 해당 페이지들은 비트맵이 되며, 나머지 모든 페이지는 벡터 PDF로 유지되어 텍스트 선택, 검색 기능 및 작은 파일 크기를 보존합니다.

이 방식은 일반적인 문서처럼 느껴지는 결과물을 만들어냅니다. 19개 페이지는 선명하고 검색 가능한 상태로 유지되는 반면, 민감한 한 페이지는 숨겨진 정보가 더 이상 존재하지 않는 픽셀 전용 이미지가 됩니다.

신뢰할 수 있는 변환을 위한 세 가지 실무 규칙

  1. 3배 스케일로 렌더링 – 비트맵은 페이지의 일반 해상도보다 3배 높은 해상도로 생성됩니다. 저해상도 렌더링은 주변의 벡터 페이지 옆에서 흐릿하게 보여 의구심을 자아내거나 단순히 전문성이 떨어져 보일 수 있습니다.
  2. 모든 시각적 요소를 비트맵으로 병합 – 주석, 서명, 워터마크 및 검열 사각형은 페이지가 래스터화되기 전에 함께 합성됩니다. 동일한 페이지에 벡터 주석과 래스터 이미지를 혼합하면 PDF 리더가 혼란을 겪어 표시 오류가 발생할 수 있습니다.
  3. 픽셀이 아닌 뷰포트에 고정 – 주석은 페이지의 뷰포트 좌표에 연결됩니다. 사용자가 확대/축소할 때 요소들이 어긋나거나 일관성 없이 크기가 변하지 않고 정렬 상태를 유지하며, 그렇지 않으면 아래의 텍스트가 노출될 수 있습니다.

레이스 컨디션(Race Conditions) 방지

각 페이지를 렌더링하는 것은 비동기 작업입니다. 사용자가 브라우저 창 크기를 빠르게 조절하면 여러 렌더링 작업이 겹쳐 캔버스에 깨지거나 겹치는 프레임이 생성될 수 있습니다. 구현 방식에는 페이지별 렌더링 토큰이 도입되었습니다. 새로운 렌더링 요청이 들어올 때마다 이전 토큰을 무효화하여 이전 작업이 스스로 취소되도록 합니다. 그 결과 급격한 UI 변경 상황에서도 매끄럽고 오류 없는 경험을 제공합니다.

트레이드오프(Trade-offs) 분석

페이지를 비트맵으로 변환하면 숨겨진 텍스트는 모두 제거되지만, 해당 페이지의 내용을 검색하거나 복사하는 기능도 사라집니다.

향후 발전 방향

핵심 요약

단순한 검은색 상자는 데이터를 삭제하는 것이 아니라 단지 숨길 뿐입니다. 검열이 필요한 페이지를 고해상도 비트맵으로 변환하고 나머지 PDF는 벡터 기반으로 유지함으로써, 브라우저 전용 편집기는 문서를 빠르고 검색 가능하며 프라이버시가 보호되는 상태로 유지하면서도 민감한 텍스트를 영구적으로 삭제할 수 있습니다. 이 방법은 보안과 사용성 사이의 균형을 맞추지만, 많은 페이지를 검열할 때는 파일 크기와 검색 기능에 미치는 누적 영향을 주의해야 합니다.