클라이언트 사이드 웹 도구 아키텍처: 개인정보 보호와 보안

Web Workers, Web Crypto API, Canvas 기술을 활용하여 서버 데이터 전송 없이 브라우저 내부에서 안전하고 빠르게 동작하는 웹 도구의 원리를 분석합니다.

기존의 온라인 도구들은 전형적인 요청-응답(Request-Response) 모델에 의존해 왔습니다. 사용자가 중요한 PDF 계약서나 미공개 JSON 데이터, 기업 이미지를 원격 서버로 업로드하면 서버가 이를 가공하여 다운로드 링크를 제공하는 방식이었습니다. 그러나 이 구조는 데이터 유출, 외부 서버 보관 리스크, 네트워크 지연을 필연적으로 동반합니다.

반면 현대 웹 브라우저는 독립적인 고성능 실행 환경으로 진화했습니다. Web Crypto API, HTML5 Canvas 2D, WebAssembly (WASM), 순수 자바스크립트 엔진인 pdf-lib 등을 통해 문서 병합, 암호화 해싱, 코드 압축, 이미지 리사이징 등 모든 작업을 100% 브라우저 메모리 안에서 직접 수행할 수 있습니다.

핵심 요약

  • 서버 저장 제로: 모든 계산과 변환이 클라이언트 내부에서 발생하므로 단 1바이트의 사용자 데이터도 기기 밖으로 유출되지 않습니다.
  • 하드웨어 가속: Canvas 렌더링과 Web Crypto는 네트워크 대역폭 소모 없이 로컬 기기의 GPU와 CPU 자원을 효율적으로 활용합니다.
  • 오프라인 동작: 웹 에셋이 캐시된 후에는 인터넷 연결이 끊겨도 완벽하게 독립 실행됩니다.
  • 즉각적인 반응: 원격 서버 왕복 통신(Round-trip)이 제거되어 클릭 즉시 결과가 도출됩니다.

클라이언트 연산이 개인정보 보호의 표준인 이유

JWT 인증 토큰이나 데이터베이스 덤프와 같은 민감한 개발 데이터를 검증되지 않은 서버 기반 변환기에 입력하는 것은 치명적인 보안 취약점을 유발합니다.

순수 프론트엔드 도구는 이러한 공격 표면을 원천 차단합니다. JavaScript Minifier를 사용할 때 구문 분석과 압축은 사용자 브라우저의 자바스크립트 엔진(JSON.parse 및 AST 파서)이 직접 실행합니다. 외부 백엔드로 전송되는 HTTP POST 요청은 전혀 없습니다.

// Pure client-side parsing and formatting
function formatJsonSafely(rawInput, spaces = 2) {
  try {
    const parsed = JSON.parse(rawInput);
    return {
      formatted: JSON.stringify(parsed, null, spaces),
      isValid: true,
      error: null
    };
  } catch (err) {
    return {
      formatted: null,
      isValid: false,
      error: err.message
    };
  }
}

브라우저 메모리에서의 바이너리 제어: PDF 처리 원리

여러 PDF 파일을 병합하거나 방향을 회전할 때 Ghostscript 같은 서버 바이너리가 필수적이라고 오해하는 경우가 많습니다.

최신 구현체는 pdf-lib 엔진을 활용합니다. 사용자 기기의 로컬 파일은 표준 FileReader를 통해 메모리상의 ArrayBuffer로 직접 로드되며, Web Worker 메모리 내부에서 페이지 트리와 오브젝트를 재구성하여 새로운 Blob 파일로 완성됩니다.

import { PDFDocument, degrees } from 'pdf-lib';

async function mergePdfFiles(arrayBuffers) {
  const mergedPdf = await PDFDocument.create();
  
  for (const buffer of arrayBuffers) {
    const donorDoc = await PDFDocument.load(buffer);
    const copiedPages = await mergedPdf.copyPages(
      donorDoc,
      donorDoc.getPageIndices()
    );
    copiedPages.forEach((page) => mergedPdf.addPage(page));
  }
  
  const mergedBytes = await mergedPdf.save();
  return new Blob([mergedBytes], { type: 'application/pdf' });
}

당사의 PDF Editor & Merger가 바로 이 방식을 사용합니다. 외부 유출 우려 없이 대외비 문서를 안전하게 편집할 수 있습니다.

HTML5 Canvas를 이용한 고성능 이미지 압축

브라우저 내 이미지 리사이징은 GPU 가속을 활용하여 매우 빠릅니다:

  1. 선택한 파일이 URL.createObjectURL(file)을 통해 메모리상에 로드됩니다.
  2. 보이지 않는 오프스크린 <canvas> 엘리먼트에 목표 해상도를 설정합니다.
  3. 2D 렌더링 컨텍스트의 drawImage() 함수가 쌍입방 보간법을 수행합니다.
  4. canvas.toBlob() 호출 시 브라우저 내장 네이티브 C++ JPEG/WebP 인코더가 작동합니다.
async function compressImageClientSide(file, maxWidth, quality = 0.8) {
  const img = new Image();
  const objectUrl = URL.createObjectURL(file);
  img.src = objectUrl;
  await img.decode();
  URL.revokeObjectURL(objectUrl);

  const scale = Math.min(1, maxWidth / img.naturalWidth);
  const canvas = document.createElement('canvas');
  canvas.width = Math.round(img.naturalWidth * scale);
  canvas.height = Math.round(img.naturalHeight * scale);

  const ctx = canvas.getContext('2d');
  ctx.drawImage(img, 0, 0, canvas.width, canvas.height);

  return new Promise((resolve) => {
    canvas.toBlob((blob) => resolve(blob), 'image/jpeg', quality);
  });
}

데이터 요금 소모 없이 Image CompressorImage Editor에서 이 워크플로우를 이용해 보세요.

브라우저 표준 암호화 엔진: Web Crypto API

과거에는 무거운 타사 암호화 라이브러리를 임포트해야 했지만, 오늘날 모든 최신 브라우저는 표준 SubtleCrypto 인터페이스(crypto.subtle)를 기본 탑재하고 있어 네이티브 머신 코드로 초고속 해시를 생성합니다:

async function computeSha256(plainText) {
  const encoder = new TextEncoder();
  const data = encoder.encode(plainText);
  const hashBuffer = await crypto.subtle.digest('SHA-256', data);
  
  const hashArray = Array.from(new Uint8Array(hashBuffer));
  return hashArray.map(b => b.toString(16).padStart(2, '0')).join('');
}

주요 이점:

  1. 보안성: 순수 JS 코드보다 타이밍 사이드채널 공격에 대한 방어력이 뛰어납니다.
  2. 성능: 대용량 텍스트 해싱도 단 수 밀리초 만에 처리합니다.

UUID GeneratorBase64 Encoder & Decoder를 통해 이를 직접 확인해 보세요.

자주 묻는 질문

내 데이터가 정말 서버로 전송되지 않나요? 네. 브라우저의 개발자 도구(F12)를 켜고 네트워크(Network) 탭을 관찰하면, 도구를 사용하는 동안 외부로 나가는 어떠한 POST나 PUT 요청도 발생하지 않음을 직접 확인할 수 있습니다.

인터넷이 끊겨도 정상 작동하나요? 네. 브라우저 캐시와 서비스 워커에 의해 모든 연산 스크립트가 사용자의 CPU와 RAM 위에서 완전히 독립적으로 실행됩니다.

브라우저 PDF 편집 시 파일 크기 제한이 있나요? 기기의 사용 가능한 물리 RAM 용량에 좌우됩니다. 일반적인 1~100페이지 분량의 문서는 지연 없이 매끄럽게 처리됩니다.