Skip to main content
Summary

AI가 만든 이미지인지 확인하는 방법은 2026년 8월 기준으로 두 계층이다. 파일에 붙는 C2PA 메타데이터와 픽셀에 박히는 SynthID 워터마크. 앞의 것은 저장 한 번에 날아가고 뒤의 것은 리사이즈를 견딘다. 그래서 어느 도구를 쓸지는 파일이 어디서 왔는지에 달렸다.

결론 먼저: 지금 바로 할 것

  1. 출처를 모르겠으면 Google 검색이나 Gemini 앱에 이미지를 올리고 "이거 AI로 만든 거야?"라고 묻는다. SynthID를 읽는다.

  2. ChatGPT 이미지 같으면 openai.com/research/verify에 올린다. 로그인 없이 되고 C2PA와 SynthID를 동시에 본다.

  3. 편집 이력까지 보고 싶으면 verify.contentauthenticity.org에 끌어다 놓는다. 벤더 무관하게 C2PA를 읽는다.

  4. 어느 쪽이든 아무것도 안 나왔다는 결과는 증거가 아니다. 있으면 강한 증거, 없으면 무증거다.

두 계층은 성질이 정반대다

C2PA는 파일에 붙는 서명된 메타데이터다. 누가 언제 무엇으로 만들었고 어떤 편집을 거쳤는지가 다 들어간다. 정보량이 많은 대신 파일 바깥에 붙어 있어서 재저장 한 번이면 사라진다.

SynthID는 픽셀 값 자체를 미세하게 건드린다. 정보는 "이 모델이 만들었다" 수준으로 빈약한데 리사이즈, 크롭, JPEG 압축을 어느 정도 견딘다. 스크린샷으로 다시 찍어도 남을 수 있다.

둘은 대체재가 아니라 보완재다. 그래서 요즘 주요 벤더는 양쪽을 다 붙인다.

도구별로 뭐가 붙나

도구C2PASynthID
ChatGPT 이미지 (DALL-E 3, gpt-image), Codex, OpenAI APIOO
OpenAI 오디오XO
SoraO미확인
Google Imagen, Gemini 이미지OO
Adobe FireflyO (전량)X
MidjourneyXX
Stable DiffusionStability AI 호스팅만 O. ComfyUI 등 로컬은 XX
ClaudeO (.svg, .png, .jpg)텍스트에만 SynthID-Text

OpenAI는 2024년 DALL-E 3에 Content Credentials를 넣기 시작해서 gpt-image와 Sora로 넓혔고, 2026-07-31 기준으로 ChatGPT와 Codex와 API 이미지에 SynthID까지 함께 붙인다 (OpenAI 2026). 텍스트는 아직 안 된다.

SynthID를 쓰는 곳은 Google 외에 OpenAI, 카카오, ElevenLabs, Nvidia가 있다. Google은 이미지와 영상 1,000억 건, 오디오 6만 년 분량에 이미 표시했다고 밝혔다 (Google 2026).

확인 경로 네 가지

Google 검색, Gemini 앱, Chrome. 일반 사용자가 쓰기 제일 쉽다. 이미지를 올리고 "AI로 만든 거야?"라고 물으면 된다. Gemini 앱은 이미 되고 검색도 열렸다. Chrome은 순차 적용 중이다. Gemini 앱에는 2026-05-19부터 C2PA 확인도 붙었다.

OpenAI 검증 도구. openai.com/research/verify에서 로그인 없이 쓴다. PNG, JPG, WEBP와 오디오 파일을 받고 C2PA와 SynthID를 둘 다 본다. 다만 OpenAI 콘텐츠만 판별한다. 다른 회사 모델 출력은 안 잡힌다.

Content Authenticity Initiative 검증 페이지. verify.contentauthenticity.org는 벤더에 상관없이 C2PA를 읽는다. 편집 이력까지 보려면 여기가 제일 낫다.

명령줄. 여러 장을 한 번에 보거나 CI에 넣을 거면 파이썬이 빠르다.

pip install c2pa-python
import c2pa, json

def check(path):
    try:
        d = json.loads(c2pa.Reader(path).json())
        m = d["manifests"][d["active_manifest"]]
        print(path, "-> 매니페스트 있음")
        print("  만든 도구:", m.get("claim_generator"))
        print("  서명자:", (m.get("signature_info") or {}).get("issuer"))
        print("  검증 상태:", d.get("validation_status", "통과"))
    except Exception as e:
        print(path, "-> 매니페스트 없음:", str(e)[:60])

c2pa.Reader가 파일에서 JUMBF 블록을 찾는다. 없으면 ManifestNotFound: no JUMBF data found를 던지니 예외를 잡아 없음으로 처리하면 된다. 맥이면 brew install c2patool도 있다.

직접 돌려본 결과: C2PA는 저장 한 번에 사라진다

2026-08-31에 c2pa-python 0.90.15로 다섯 개 파일을 확인했다. 기준 파일은 C2PA 공식 저장소(contentauth/c2pa-rs)의 서명된 테스트 이미지 CA.jpg다.

파일결과
CA.jpg (원본, 서명됨)매니페스트 있음. 상태 signingCredential.untrusted
Pillow로 그냥 재저장매니페스트 없음
절반 크기로 리사이즈매니페스트 없음
절반으로 크롭매니페스트 없음
픽셀 1바이트만 변조매니페스트 있음. 상태에 assertion.dataHash.mismatch 추가

원본에서는 claim_generator가 make_test_images/0.33.1 c2pa-rs/0.33.1, 서명자가 C2PA Test Signing Cert, 서명 시각이 2024-08-06으로 나왔다. 편집 이력은 c2pa.opened와 c2pa.color_adjustments 두 건이 기록돼 있었다. 상태에 뜬 signingCredential.untrusted는 테스트용 인증서라서 신뢰 목록에 없다는 뜻. 변조 신호와는 무관하다.

제일 중요한 줄은 2번부터 4번이다. Pillow로 열어서 그대로 다시 저장만 했는데 매니페스트가 사라졌다. 조작 의도 없이 저장 한 번이면 이렇게 된다. 이미지 라이브러리 대부분이 저장할 때 메타데이터를 새로 쓰기 때문이다.

이게 SynthID 같은 픽셀 워터마크가 필요한 이유다. SNS 업로드, 캡처, 포맷 변환, 썸네일 생성이 전부 위 2번부터 4번에 해당한다. C2PA만 보고 판정하면 실제로는 거의 매번 없음이 나온다.

픽셀을 건드리면 서명은 남고 상태가 바뀐다

반대 방향도 재봤다. 매니페스트는 그대로 두고 JPEG의 SOS 마커 이후 압축 데이터에서 1바이트만 XOR로 뒤집었다. 이때는 매니페스트가 살아남고 검증 상태에 assertion.dataHash.mismatch가 추가됐다.

이게 C2PA가 확실하게 해주는 일이다. 파일이 서명 이후에 손을 탔는지를 판정한다. 서명이 살아있으면서 해시가 안 맞으면 변조다. AI 생성 여부보다 이쪽이 더 신뢰할 만한 신호다.

클로드는 어디에 해당하나

클로드에는 텍스트를 그림으로 바꾸는 이미지 생성 모델이 없다 (Anthropic 헬프센터). 사진이나 일러스트를 뽑아주지 않는다. 클로드가 내놓는 그림은 둘뿐이다. 모델이 마크업을 직접 써내는 SVG와 HTML 아티팩트, 그리고 클로드가 짜준 코드가 실행돼서 나오는 PNG.

2026-08-02 이후 출시된 모델부터 .svg, .png, .jpg에 C2PA가 붙는다 (Anthropic 헬프센터). 픽셀 워터마크는 없다. 텍스트에는 SynthID-Text가 들어가는데 탐지 도구가 아직 안 나왔다.

두 번째 경로도 재봤다. Cowork 세션에서 클로드가 SVG를 만들고 PNG로 렌더링한 다음 확인했더니 둘 다 no JUMBF data found였다. 바이트 단위로 c2pa, jumb, contentauth 문자열을 grep해도 안 걸렸다. 파이썬 스크립트가 디스크에 쓴 파일이라서 모델이 낸 산출물로 취급되지 않았을 가능성이 크다.

판정 규칙

세 도구를 다 돌려도 아무것도 안 나올 수 있다. 이때 내릴 수 있는 결론은 하나뿐이다. 판단 보류.

  • 신호 있음 = 그 모델이 관여했다는 강한 증거

  • 신호 없음 = 아무 정보 없음. 사람이 만들었다는 뜻이 전혀 아니다

  • C2PA 있는데 해시 불일치 = 서명 이후 변조됨. 이게 제일 확실한 판정

OpenAI도 자기네 도구 설명에서 같은 말을 한다. 신호가 없어도 메타데이터가 벗겨졌거나 신호 도입 이전에 만들어졌을 수 있다고.

이 방법이 안 맞는 경우

  • Midjourney 이미지. C2PA도 SynthID도 안 붙는다

  • 로컬 Stable Diffusion. ComfyUI나 Automatic1111은 기본적으로 아무것도 안 넣는다

  • 텍스트. C2PA는 파일 메타데이터고 SynthID-Text는 탐지 도구가 없다

  • 강한 압축이나 반복 편집을 거친 이미지. SynthID도 열화된다

  • 2026-08-02 이전 클로드 출력. 소급 적용은 진행 중이다

내가 확인 못한 것

실측은 C2PA 쪽만 했다. SynthID는 탐지가 Google과 OpenAI 서버에서만 되고 로컬로 돌릴 방법이 없어서 직접 재보지 못했다. 벤더별 지원 표는 각 사 공식 문서와 C2PA 커뮤니티 자료를 옮긴 것이고 내가 파일마다 확인한 게 아니다.

클로드 앱에서 아티팩트로 만들어 내려받은 SVG에 C2PA가 붙는지도 확인하지 못했다. 재현하면 이 문단을 갱신한다.

제품 만드는 사람이 지금 할 것

사용자 생성 콘텐츠를 받는 서비스라면 업로드 경로에 C2PA 확인을 붙이는 건 지금 가능하고 비용도 pip 한 줄이다. 다만 판정 로직은 "없음 = AI 아님"으로 짜면 안 된다. 있으면 기록하고 없으면 판단 보류가 맞다.

서명이 살아있는데 해시가 안 맞는 경우만 따로 플래그를 세우면 오탐 없이 변조 탐지가 된다. 이게 지금 확실하게 얻을 수 있는 유일한 신호다.

픽셀 워터마크까지 필요하면 Google Cloud가 Gemini Enterprise Agent Platform에 AI 콘텐츠 탐지 API를 열었다. 여러 모델 출처를 한 번에 본다.


발행일 2026-08-31 / 최종 수정일 2026-08-31 글쓴이: Wislan (TILNOTE 운영) 실측 환경: c2pa-python 0.90.15, Python 3, Cowork 리눅스 컨테이너, 2026-08-31 실행 AI 사용 고지: 리서치와 초안 작성에 Claude를 사용했다. 표의 실측 수치는 위 환경에서 실제로 실행한 결과이고 저자가 확인했다.

참고

이 노트는 보도·비평·교육·연구 목적으로 작성되었습니다. 저작권 문의가 있으시면 에서 알려주세요.

틸노트는 사용자가 AI를 활용해 노트를 쉽게 작성하거나 편집할 수 있는 서비스입니다.

AI 스퀘어 단톡방에 함께해요

AI 활용과 틸노트 사용 팁을 나누는 오픈채팅방입니다. 입장 비밀번호는 tilnote입니다.

참여하기