본문 바로가기
Frontend2026년 9월 17일9분 읽기

콘텐츠 진위 증명 구현하기 — C2PA 자격증명을 웹에서 다루는 법

YS
김영삼
조회 204
콘텐츠 진위 증명 구현하기 — C2PA 자격증명을 웹에서 다루는 법

C2PA(Coalition for Content Provenance and Authenticity)는 이미지·영상·오디오에 출처와 편집 이력을 암호학적으로 서명해 붙이는 규격이다. 파일 안에 매니페스트(manifest)가 들어가고, 거기에 누가 만들었는지, 어떤 도구로 어떤 편집을 했는지가 서명과 함께 기록된다.

오해를 먼저 정리하자. C2PA는 "이 사진이 진실하다"를 증명하지 않는다. "이 파일이 서명 이후 변경되지 않았고, 기록된 이력이 서명자에 의해 주장된 것"을 증명한다. 이 구분이 UI 문구 설계에서 결정적이다.

이미지 진위 문제가 실무로 들어온 건 생각보다 빠르다. 중고 거래 플랫폼, 보험 청구, 뉴스 제보, 리뷰 사진 — 사용자가 올린 이미지가 진짜인지 판단해야 하는 서비스가 많다. 완벽한 판별은 불가능하지만, 있는 정보를 버리지 않는 것만으로도 출발점이 된다.

구조 이해

구성내용
매니페스트(manifest)자산에 부착되는 출처·이력 정보의 묶음
어서션(assertion)개별 주장 — 촬영 기기, 편집 동작, 생성 AI 사용 여부 등
클레임(claim)어서션들을 묶어 해시로 고정한 선언
서명클레임에 대한 디지털 서명. 신뢰 목록에 있는 인증서로 검증
소프트 바인딩파일이 재인코딩돼 매니페스트가 떨어진 경우를 대비한 지문·워터마크
왜 소프트 바인딩이 필요한가 대부분의 웹 서비스는 업로드된 이미지를 리사이즈하고 재인코딩한다. 그 과정에서 메타데이터가 통째로 사라지는 경우가 흔하다. 매니페스트가 떨어져 나가면 검증이 불가능해지므로, 지문 기반으로 원본 기록을 다시 찾는 보조 수단이 함께 설계된다.

업로드 파이프라인에서 가장 흔한 실수

서비스 입장에서 첫 번째 과제는 거창한 검증이 아니다. 가지고 있던 정보를 지우지 않는 것이다. 이미지 처리 라이브러리의 기본 설정은 대개 메타데이터를 버린다.

// 문제: 기본 설정이 메타데이터를 제거한다
const out = await sharp(input)
  .resize(1200)
  .jpeg({ quality: 82 })
  .toBuffer();                       // C2PA 매니페스트 소실

// 개선: 메타데이터 보존 옵션을 명시
const out = await sharp(input)
  .resize(1200)
  .withMetadata()                    // EXIF/ICC 등 보존
  .jpeg({ quality: 82 })
  .toBuffer();

// 더 나은 설계: 원본을 별도로 보관하고 파생본만 가공
//  - 원본: 손대지 않고 저장 (검증용)
//  - 파생본: 표시용으로 리사이즈·최적화
//  - 검증은 항상 원본으로 수행
업로드 처리 점검
원본을 별도 보관하고 있는가 — 검증은 원본으로만 가능하다
리사이즈·최적화 단계에서 메타데이터가 제거되지 않는가
CDN 이미지 변환 기능이 메타데이터를 버리지 않는가
워터마크·크롭 같은 편집을 서비스가 가하는 경우, 그 사실을 기록하는가
검증 결과를 캐싱하는가 (매번 서명 검증은 비용이 크다)
개인정보 관점에서 위치·기기 정보 노출을 어떻게 다룰지 정했는가

마지막 항목이 중요하다. 메타데이터를 보존하면 촬영 위치나 기기 식별 정보가 함께 남을 수 있다. 검증을 위해 서버에는 보존하되, 공개 표시용 파생본에서는 제거하는 이중 구조가 필요하다.

검증 결과를 사용자에게 보여 주는 법

여기가 기술보다 어렵다. "검증됨"이라는 배지는 사용자에게 "이 사진은 사실이다"로 읽힌다. 하지만 실제로 증명된 것은 훨씬 좁다.

상태정확한 의미권장 문구 방향
서명 유효서명 이후 변경되지 않았고 발급자를 확인함"출처 정보가 확인됨" + 발급자 표시
서명 없음정보가 없을 뿐, 조작 여부는 알 수 없음"출처 정보 없음" (의심 표현 금지)
서명 무효변조됐거나 서명이 손상됨"출처 정보를 확인할 수 없음" + 사유
AI 생성 기록생성 도구 사용이 기록됨"AI 생성 도구 사용 기록 있음"
절대 하지 말아야 할 표현 "진짜 사진입니다", "조작되지 않았습니다" 같은 단정. 서명은 파일의 무결성과 이력의 주장을 보증할 뿐, 장면의 진실성을 보증하지 않는다. 화면에 띄운 합성 이미지를 카메라로 다시 찍으면 그것도 진짜 촬영이다.

검증 흐름 구현

1
원본 확보
검증은 가공 전 원본으로 수행한다. 파생본으로는 대부분 실패한다.
2
매니페스트 추출
파일에서 매니페스트를 읽는다. 없으면 "정보 없음"으로 처리하고 끝낸다.
3
서명 검증
신뢰 목록의 인증서로 서명을 확인한다. 인증서 만료·폐기 상태도 확인 대상이다.
4
이력 해석
어떤 편집이 기록돼 있는지, 생성 도구 사용 기록이 있는지 읽는다.
5
결과 저장
검증 결과와 검증 시각을 함께 저장한다. 표시할 때마다 재검증하면 비용이 크다.
6
표시
상태별로 정확한 문구를 쓰고, 상세 정보를 볼 수 있는 경로를 제공한다.
// 검증 결과를 다루는 모델 (개념)
type VerdictStatus = 'valid' | 'invalid' | 'absent' | 'error';

interface Verdict {
  status: VerdictStatus;
  issuer?: string;          // 서명 발급자 (표시할 핵심 정보)
  signedAt?: string;
  edits?: string[];         // 기록된 편집 이력
  aiGenerated?: boolean;    // 생성 도구 사용 기록 여부
  checkedAt: string;        // 검증 시각 — 캐시 무효화 기준
}

// UI 규칙
//  valid   → "출처 정보 확인됨 · {issuer}"  (녹색이되 과하지 않게)
//  absent  → "출처 정보 없음"               (중립색. 경고색 금지)
//  invalid → "출처 정보를 확인할 수 없음"    (주의색 + 사유 링크)

한계 — 솔직하게 알아 둘 것

  • 재촬영은 못 막는다 — 화면에 띄운 합성 이미지를 카메라로 찍으면 정상 서명이 붙는다.
  • 정보 없음이 다수다 — 대부분의 이미지에는 아직 자격증명이 없다. 없다고 의심하면 오탐이 폭발한다.
  • 메타데이터는 쉽게 사라진다 — 메신저, 소셜 미디어, CDN 변환을 거치면 대개 제거된다.
  • 신뢰는 인증서에 의존한다 — 누구의 서명을 믿을 것인가라는 정책 문제가 남는다.
  • 프라이버시 상충 — 출처를 자세히 기록할수록 촬영자 정보가 드러날 수 있다.

그래서 현실적인 활용은 "없으면 차단"이 아니라 "있으면 가점" 쪽이다. 보험 청구나 제보처럼 신뢰가 중요한 흐름에서, 자격증명이 있는 제출물에 우선순위를 주거나 추가 확인을 생략하는 식이다.

지금 시작한다면

전면 도입 전에 할 수 있는 가장 값싼 조치는 두 가지다. 첫째, 원본을 버리지 않는 것. 둘째, 파이프라인이 메타데이터를 지우지 않게 하는 것. 이 둘만 해 두면 나중에 검증 기능을 붙일 때 과거 데이터에도 소급 적용할 수 있다. 반대로 지금 버리고 있으면, 나중에 되살릴 방법이 없다.

자주 묻는 질문

C2PA는 무엇을 증명하나요?

파일이 서명 이후 변경되지 않았다는 점과, 매니페스트에 기록된 출처·편집 이력이 서명자에 의해 주장됐다는 점을 증명합니다. 촬영된 장면이 진실한지, 내용이 사실인지는 증명하지 않습니다.

이미지를 리사이즈하면 자격증명이 사라지나요?

대부분의 이미지 처리 라이브러리와 CDN 변환은 기본 설정에서 메타데이터를 제거하므로 사라집니다. 검증이 필요하다면 원본을 별도로 보관하고, 표시용 파생본만 가공하는 구조로 설계해야 합니다.

자격증명이 없는 이미지는 의심해야 하나요?

아닙니다. 아직 대부분의 이미지에는 자격증명이 없습니다. "정보 없음"을 "조작 의심"으로 표시하면 오탐이 대량 발생하고 사용자 신뢰를 잃습니다. 중립적인 문구로 정보 부재만 표시하세요.

검증 결과를 UI에 어떻게 표시해야 하나요?

상태별로 정확한 표현을 쓰는 것이 핵심입니다. 유효한 경우에도 "진짜 사진"이 아니라 "출처 정보 확인됨"과 발급자를 함께 보여 주고, 상세 이력을 확인할 수 있는 경로를 제공하세요.

메타데이터 보존이 개인정보 문제가 되지 않나요?

될 수 있습니다. 촬영 위치와 기기 정보가 함께 남을 수 있으므로, 검증용 원본은 서버에 접근 제한을 두고 보관하되 공개되는 파생본에서는 민감한 필드를 제거하는 이중 구조가 필요합니다.

지금 당장 무엇부터 하면 되나요?

업로드된 원본을 보존하고, 이미지 처리 파이프라인이 메타데이터를 제거하지 않도록 설정을 점검하세요. 이 두 가지만 해 두면 이후에 검증 기능을 추가할 때 과거 데이터에도 적용할 수 있습니다.

댓글 0

아직 댓글이 없습니다.
Ctrl+Enter로 등록