아티클
코드 스니펫을 업로드하지 않고 비교하기
온라인 diff 도구에 두 파일을 붙여넣을 때마다 그 코드는 사용자의 기기를 떠납니다. 설정 파일, 데이터베이스 쿼리, .env 스니펫에 묻혀 있는 API 키 등 모든 것이 사용자가 제어하지 못하는 서버로 전송됩니다. 이 글은 diff 알고리즘의 작동 방식, 세분성 옵션이 실제로 무엇을 의미하는지, 비교를 로컬에 유지하는 것이 중요한 이유를 다룹니다.
Diff가 계산하는 것
diff 도구는 두 텍스트를 받아 하나를 다른 것으로 변환하는 최소 변경 집합을 찾습니다. 핵심 개념은 최장 공통 부분 수열(LCS)입니다. 두 텍스트에 동일한 순서로 나타나는 가장 긴 줄(또는 토큰)의 수열로, 인접하지 않아도 됩니다. 공통 부분 수열에 없는 모든 것은 새 버전에서의 추가 또는 이전 버전에서의 삭제입니다. 이를 위한 고전적인 알고리즘은 Myers(1986)에 의한 것으로, O((N+M)D) 시간에 최단 편집 스크립트를 찾습니다. 여기서 N과 M은 두 텍스트의 길이이고 D는 편집 횟수입니다. 실제로 대부분의 도구는 앞뒤의 공통 줄을 무시하는 전처리 단계를 추가하여 변경된 영역으로 문제를 줄입니다. 결과는 패치입니다. 각각이 연속적인 맥락 줄, 삭제, 추가 블록을 설명하는 덩어리(hunk)의 수열입니다. 이것이 Unix diff, Git, 대부분의 코드 리뷰 도구에서 사용하는 형식입니다.

줄, 단어, 문자 세분성
diff의 세분성은 무엇이 비교 단위로 간주되는지를 결정합니다. 줄 기반 diff는 대부분의 도구에서 기본값입니다. 각 줄을 단일 토큰으로 처리합니다. 빠르고 맥락에서 읽기 쉬운 출력을 생성하지만, 그 줄에서 단 하나의 단어만 다르더라도 전체 줄을 변경된 것으로 표시합니다. 단어 수준 diff는 LCS를 실행하기 전에 각 줄을 단어로 분리합니다. 이는 줄 내에서 변경된 내용의 더 세밀한 그림을 제공하며, 산문, 설정 값, 또는 JSON에 유용합니다. 문자 수준 diff는 더 나아가 긴 식별자 안의 단 하나의 변경된 문자도 강조할 수 있습니다. 공백 처리는 노이즈를 추가합니다. CRLF로 끝나는 줄과 LF로 끝나는 동일한 줄은 엄격한 바이트 비교에서 다르게 표시됩니다. 대부분의 도구는 diff 전에 줄 끝을 정규화하는 옵션을 제공합니다. 마찬가지로 후행 공백, 탭 대 공백 들여쓰기, 빈 줄 모두 불필요한 diff 출력을 생성할 수 있습니다. 다른 편집기나 운영 체제의 코드를 비교할 때는 공백 정규화를 활성화하는 것이 일반적으로 올바른 기본값입니다.
온라인 diff 도구의 개인정보 위험
온라인 diff 및 붙여넣기 서비스는 편리합니다. URL을 열고, 두 스니펫을 붙여넣고, 색상이 표시된 출력을 받습니다. 문제는 붙여넣는 텍스트가 제3자 서버로 전송된다는 점입니다. 서비스에 따라 그 텍스트는 기록, 색인 작성, 무기한 저장, 또는 분석 제공업체와 공유될 수 있습니다. 이는 코드에 민감한 정보가 포함된 경우 특히 중요합니다. 하드코딩된 자격 증명, 내부 호스트명, 독점적인 비즈니스 로직, 또는 개인 식별 데이터가 모두 붙여넣기에 포함될 수 있습니다. 명시적인 비밀이 없더라도 내부 코드의 구조는 비공개로 유지하고 싶은 아키텍처 결정을 드러낼 수 있습니다. 이 위험은 가상의 것이 아닙니다. 보안 연구자들은 공개 붙여넣기에서 자격 증명과 내부 토큰을 반복적으로 발견해 왔습니다. 일부 서비스는 사용자가 삭제한 후에도 캐시나 백업에 복사본이 존재하기 때문에 붙여넣기를 유지합니다. 텍스트가 도착하면 원격 서비스가 무엇을 하는지 확인할 방법이 없습니다. 유일한 신뢰할 수 있는 완화 방법은 diff를 로컬에 유지하는 것입니다. 즉, 텍스트를 네트워크로 전송하지 않는 도구에서 실행하는 것을 의미합니다.

로컬 diff의 실용적인 용도
Diff는 코드 리뷰에만 사용되지 않습니다. 로컬 diff가 유용한 몇 가지 일반적인 경우: 커밋 전에 문서나 설정 파일의 편집을 검토할 때. Dockerfile, Nginx 설정, 또는 Kubernetes 매니페스트의 두 버전을 비교하여 배포 간에 정확히 무엇이 변경되었는지 파악할 때. 환경 간 설정 드리프트를 확인할 때. 프로덕션과 스테이징 설정이 호스트명과 비밀을 제외하고 동일해야 한다면, diff로 의도하지 않은 차이를 즉시 표시할 수 있습니다. 디버깅 중 API 응답을 비교할 때. REST 또는 GraphQL API의 두 JSON 페이로드를 붙여넣고 단어 수준 diff를 실행하면 수백 줄을 수동으로 읽지 않고도 추가된 필드, 변경된 값, 제거된 키를 정확히 찾아냅니다. LLM이 생성한 코드를 기준선과 비교할 때. 모델이 함수를 다시 작성할 때 줄 수준 diff는 어떤 로직이 변경되었고 어떤 것이 그대로 유지되었는지 두 버전을 독립적으로 읽는 것보다 빠르게 보여줍니다. 이 모든 경우에 관련 텍스트는 민감할 수 있으며, 원격 서버에서 벗어나게 하지 않는 것이 단순한 선택입니다.
업로드 없이 브라우저에서 처리하기
이 사이트의 text-diff 도구는 JavaScript를 사용하여 브라우저에서 전체 diff 계산을 실행합니다. 두 패널에 두 텍스트를 붙여넣으면 diff가 줄 단위로 즉시 렌더링되며, 한쪽당 최대 3000줄까지 처리합니다. 서버로 전송되는 것은 없습니다. 텍스트는 기기를 벗어나지 않습니다. 구현은 줄 단위로 동작하는 표준 LCS 기반 알고리즘을 사용합니다. 각 줄이 하나의 토큰이며, 도구는 두 버전 사이의 최장 공통 부분열을 찾아 그 줄이 변경되지 않았는지, 추가되었는지, 삭제되었는지를 판단합니다. 변경되지 않은 줄은 강조 없이, 추가된 줄은 초록, 삭제된 줄은 빨강으로 표시되며, 옆에 추가/삭제 줄 수의 누적 카운트가 표시됩니다. 오늘은 단어 단위나 문자 단위 모드가 없고 공백 정규화 전환 기능도 없으므로, 후행 공백이나 줄바꿈 방식만 다른 줄도 변경된 것으로 표시됩니다. 계산이 클라이언트 측에서 실행되기 때문에 오프라인에서도 작동합니다. 계정도 없고, 기록도 없고, 보존도 없습니다. 로컬 설정 파일을 템플릿과 비교하거나, 패치를 적용하기 전에 검토하거나, 두 API 응답을 확인할 수 있으며 그 텍스트 중 어떤 것도 제3자에게 도달하지 않습니다.
이 아티클의 도구
자주 묻는 질문
코드에는 줄 기반 diff와 단어 기반 diff 중 어느 것이 더 낫나요?
대부분의 코드 리뷰 작업에서는 줄 기반 diff가 표준이며 읽기 가장 쉽습니다. 코드가 줄로 구조화되어 있기 때문입니다. 단어 기반 diff는 줄이 길고 단일 줄 JSON 값처럼 일부만 변경된 경우 도움이 될 수 있지만, 이 도구는 줄 단위로만 비교합니다. 그런 경우에는 강조된 줄을 단서로 삼아 그 안의 작은 차이를 직접 눈으로 확인하세요.
온라인 diff 도구가 HTTPS를 사용하더라도 개인정보 위험이 있는 이유는 무엇인가요?
HTTPS는 도청으로부터 전송 중인 텍스트를 보호하지만, 서버에 도달한 후에는 보호하지 않습니다. 서비스 운영자는 붙여넣은 콘텐츠에 완전한 접근 권한을 가지며 기록, 저장, 또는 공유할 수 있습니다. TLS는 전송 보안에 관한 것이지 수신자가 데이터로 무엇을 하는지에 관한 것이 아닙니다.
text-diff 도구는 과거 비교 기록을 저장하나요?
아니오. 이 도구는 백엔드가 없고 네트워크 요청을 하지 않습니다. 탭을 닫거나 새로 고침하면 텍스트는 사라집니다. 계정도 없고, 저장된 기록도 없고, 서버 측 로그도 없습니다.