콘텐츠로 이동

C2PA 빠른 시작 가이드

5분 안에 C2PA를 시작하세요! 이 가이드는 C2PA 서명 콘텐츠를 이해하고, 검증하고, 생성하는 데 도움이 됩니다.

  1. C2PA 이해하기
  2. C2PA 콘텐츠 검증
  3. C2PA 콘텐츠 생성
  4. 다음 단계

C2PA는 다음을 포함하는 암호화 서명된 “매니페스트(manifest)“를 미디어 파일에 추가합니다:

  • 누가: 크리에이터/편집자 신원
  • 무엇을: 수행된 작업(생성됨, 편집됨, AI 생성됨)
  • 언제: 타임스탬프
  • 어떻게: 사용된 도구 및 설정
  • 어디서: 소스 자료(재료)
원본 사진 → [C2PA 매니페스트 추가] → 서명된 사진
메타데이터 포함:
• 크리에이터: John Doe
• 카메라: Nikon Z9
• 날짜: 2025-11-21
• GPS: 37.7749°N, 122.4194°W
• 서명: ✓ 유효함

편집할 때:

서명된 사진 → [Photoshop에서 편집] → 새로 서명된 사진
새 매니페스트가 원본을
"재료"로 참조

결과: 원본에서 현재 버전까지의 완전한 출처 체인.


방법 1: 온라인 도구 (가장 쉬움)

섹션 제목: “방법 1: 온라인 도구 (가장 쉬움)”

설치 불필요!

  1. https://contentcredentials.org/verify 방문
  2. 이미지/비디오/문서 드래그 앤 드롭
  3. 출처 정보 보기:
    • 크리에이터 신원
    • 편집 기록
    • 서명 상태
    • 원본 콘텐츠(사용 가능한 경우)

지금 시도해 보세요 샘플 이미지: https://contentauthenticity.org/examples

방법 2: 브라우저 확장 프로그램

섹션 제목: “방법 2: 브라우저 확장 프로그램”

브라우징 중 자동 검증:

  1. Content Credentials 확장 프로그램 설치
    • Chrome, Edge, Brave에서 사용 가능
  2. 정상적으로 브라우징
  3. 확장 프로그램이 C2PA 콘텐츠를 자동으로 탐지
  4. 아이콘을 클릭하여 출처 세부 정보 보기

개발자 및 고급 사용자용:

Terminal window
# macOS/Linux (Cargo 사용)
cargo install c2patool
# macOS (Homebrew 사용)
brew install c2patool
# Windows
# 다운로드: https://github.com/contentauth/c2patool/releases
Terminal window
# 기본 검증
c2patool photo.jpg
# 상세한 JSON 출력
c2patool photo.jpg --detailed
# 매니페스트를 JSON 파일로 저장
c2patool photo.jpg --output manifest.json
# 여러 파일 확인
c2patool *.jpg
File: photo.jpg
Status: ✓ Valid C2PA signature
Creator: John Doe (john@example.com)
Created: 2025-11-21T10:30:00Z
Camera: Nikon Z9
Signature: Valid
Certificate: DigiCert
Actions: Captured

앱에 검증 통합:

const c2pa = require('c2pa-node');
async function verify(imagePath) {
const manifest = await c2pa.read(imagePath);
if (manifest) {
console.log('Creator:', manifest.claim.creator);
console.log('Created:', manifest.claim.created);
console.log('Valid:', manifest.validation_status);
} else {
console.log('No C2PA data found');
}
}
verify('photo.jpg');
from c2pa import Reader
reader = Reader('photo.jpg')
manifest = reader.manifest()
if manifest:
print(f"Creator: {manifest.creator}")
print(f"Created: {manifest.created}")
print(f"Valid: {manifest.is_valid}")
else:
print("No C2PA data found")

방법 1: 지원되는 소프트웨어 사용

섹션 제목: “방법 1: 지원되는 소프트웨어 사용”

코딩 불필요:

  1. Photoshop/Lightroom에서 이미지 열기
  2. 편집 → Content Credentials로 이동
  3. 크리에이터 정보 입력
  4. 파일 저장 → C2PA 매니페스트가 자동으로 추가됨
  • Nikon Z9/Z8: 카메라 설정에서 활성화 → 촬영 시 사진 서명
  • Leica M11-P/SL3: 자동 서명 활성화됨
  • Sony Alpha 시리즈: 펌웨어 업데이트를 통해 활성화

서명 인증서가 필요합니다:

테스트용(자체 서명):

Terminal window
# 테스트 인증서 생성(검증자에게 신뢰받지 않음)
openssl req -x509 -newkey rsa:2048 -keyout key.pem -out cert.pem -days 365 -nodes

프로덕션용:

  • 신뢰할 수 있는 CA에서 인증서 구매(DigiCert, GlobalSign 등)
  • C2PA 키 사용 요구 사항 지정

manifest.json 생성:

{
"claim_generator": "my-app/1.0",
"assertions": [
{
"label": "stds.schema-org.CreativeWork",
"data": {
"@context": "https://schema.org",
"@type": "CreativeWork",
"author": [
{
"@type": "Person",
"name": "John Doe"
}
]
}
},
{
"label": "c2pa.actions",
"data": {
"actions": [
{
"action": "c2pa.created"
}
]
}
}
]
}
Terminal window
# 인증서로 서명
c2patool photo.jpg \
--manifest manifest.json \
--signer-cert cert.pem \
--signer-key key.pem \
--output signed_photo.jpg
# 작동하는지 확인
c2patool signed_photo.jpg
use c2pa::{Builder, SigningAlg};
fn main() -> Result<(), Box<dyn std::error::Error>> {
let mut builder = Builder::from_file("input.jpg")?;
// 크리에이터 어서션 추가
builder.add_assertion("stds.schema-org.CreativeWork",
r#"{"author": [{"name": "John Doe"}]}"#)?;
// 서명 및 저장
let signer = get_signer(); // 인증서/키
builder.sign("output.jpg", signer)?;
Ok(())
}
const c2pa = require('c2pa-node');
async function sign(inputPath, outputPath) {
const manifest = {
claim_generator: 'my-app/1.0',
assertions: [
{
label: 'stds.schema-org.CreativeWork',
data: {
author: [{ name: 'John Doe' }]
}
}
]
};
const signer = {
cert: 'path/to/cert.pem',
key: 'path/to/key.pem'
};
await c2pa.sign(inputPath, outputPath, manifest, signer);
console.log('Signed successfully!');
}
sign('input.jpg', 'output.jpg');
from c2pa import Builder, Signer
# 빌더 생성
builder = Builder.from_file('input.jpg')
# 어서션 추가
builder.add_assertion('stds.schema-org.CreativeWork', {
'author': [{'name': 'John Doe'}]
})
# 서명
signer = Signer('cert.pem', 'key.pem')
builder.sign('output.jpg', signer)
print('Signed successfully!')

방법 4: 서명된 콘텐츠 편집 (출처 보존)

섹션 제목: “방법 4: 서명된 콘텐츠 편집 (출처 보존)”

C2PA 서명 콘텐츠를 편집할 때 원본을 “재료”로 참조하세요:

Terminal window
# 편집하고 체인 보존
c2patool edited_photo.jpg \
--parent original_photo.jpg \
--manifest edit_manifest.json \
--signer-cert cert.pem \
--signer-key key.pem \
--output final_photo.jpg

새 매니페스트는 original_photo.jpg를 재료로 참조하여 전체 기록을 보존합니다.


규격 이해:

도구 탐색:

일반적인 질문:

공식 튜토리얼:

코드 예제:

라이브로 전환하기 전에:

  1. 프로덕션 인증서 받기

    • 신뢰할 수 있는 CA에서 구매(DigiCert, GlobalSign 등)
    • C2PA 호환 키 사용 확인
    • 비용: 연간 약 $50-500
  2. 보안 키 저장소

    • 개인 키에 대해 HSM(Hardware Security Module) 사용
    • 또는 클라우드 HSM(AWS CloudHSM, Azure Key Vault)
    • 소스 제어에 키를 커밋하지 마세요
  3. 철저히 테스트

    • 여러 검증자로 서명 확인
    • 다양한 파일 형식에서 테스트
    • 크로스 플랫폼 호환성 확인
  4. 모니터링 및 유지 관리

    • 인증서 교체 구현
    • 취소 모니터링
    • SDK를 최신 상태로 유지

주요 통합 지점:

앱 워크플로:
1. 콘텐츠 생성/업로드
2. [C2PA 매니페스트 추가] ← 통합 지점
3. 인증서로 서명
4. 서명된 콘텐츠 저장/게시
5. [선택 사항] 표시 시 검증 ← 또 다른 통합 지점

일반적인 통합 시간:

  • 간단한 검증: 1-2일
  • 기본 서명: 3-5일
  • 전체 프로덕션 배포: 2-4주

테스트(무료):

  • 자체 서명 인증서
  • 개발에만 적합
  • 검증자에게 신뢰받지 않음

프로덕션:

도움 받기:

기여하기:


Terminal window
c2patool image.jpg
Terminal window
c2patool input.jpg \
--manifest manifest.json \
--signer-cert cert.pem \
--signer-key key.pem \
--output signed.jpg
https://contentcredentials.org/verify
{
"claim_generator": "app-name/version",
"assertions": [
{
"label": "stds.schema-org.CreativeWork",
"data": {
"author": [{"name": "Creator Name"}]
}
}
]
}

  • 파일에 C2PA 매니페스트가 없을 수 있습니다
  • 메타데이터가 제거되었을 수 있습니다
  • 다른 파일 형식을 시도해 보세요
  • 서명 후 파일이 수정되었습니다
  • 인증서가 취소되었거나 만료되었습니다
  • 신뢰 체인이 깨졌습니다
  • 자체 서명 인증서 사용(테스트에서 예상됨)
  • CA가 신뢰 목록에 없습니다
  • 필요한 경우 사용자 정의 신뢰 앵커 추가
  • C2PA는 매니페스트당 약 10-50KB를 추가합니다(최소)
  • 서명은 일반적인 파일의 경우 1초 미만입니다
  • 검증은 거의 즉시 이루어집니다

시작할 준비가 되셨나요? 위의 방법을 선택하고 시작하세요!

질문이 있으신가요? FAQ를 확인하거나 이슈를 열어주세요.


최종 업데이트: 2025년 11월