AI팀 설계서2026-09-01v6

챗봇에서 편집기까지

Claude·ChatGPT 대화에서 스냅스 상품이 제안되고, 링크 하나로 이미 조립된 편집기가 열리게 만드는 방법. 접힌 항목은 눌러서 펼치면 근거와 세부가 나옵니다.

월 운영비
₩28,000서버 비용
최소 착수
3~4주37종 먼저 내보내기
전 상품
9~10주웹 편집기 기준
남은 블로커
없음확인 두 건 모두 통과

원격 MCP 서버 하나를 만든다. 챗봇은 “무엇을 만들지”만 정하고, 이미지는 편집기에서 원본으로 받는다.

상품 대부분이 이미지 한 장짜리이고, 그중 37종은 API 호출 없이 링크만 조립하면 편집기가 열린다. 여기서 시작하는 게 가장 빠르다.

01이미지 문제 — 정확히 무엇이 막히나

이 부분이 계속 헷갈렸으니 먼저 정리한다. “URL로 전달”은 막힌 적이 없다. 막힌 건 다른 것이다.

사용자가 하는 행동우리 서버까지 오나
URL을 직접 입력
“이 그림으로 스티커 만들어줘 https://…”
✅ 온다 URL은 그냥 글자다. 툴에 문제없이 전달되고 우리가 받아서 내려받으면 된다
사진첩에서 파일 첨부
ChatGPT 웹
✅ 온다
단 원본 보장 없음
호스트가 임시 URL을 만들어 준다 (download_url). 그 URL이 원본인지 축소본인지는 문서화돼 있지 않다 — 아래 참조
사진첩에서 파일 첨부
ChatGPT 모바일
❌ 안 온다 파일 대신 껍데기 참조만 오는 버그가 아직 열려 있다
사진첩에서 파일 첨부
Claude · Cursor · VS Code
❌ 안 온다 붙인 사진을 툴로 넘기는 통로가 아예 없다

정리하면 이렇다.

사진첩에서 고른 사진에는 애초에 URL이 없다. Claude는 그 사진의 URL을 만들어 주지 않으므로 우리에게 넘길 방법이 없다. URL 전달이 안 되는 게 아니라, 넘길 URL이 존재하지 않는 것이다.

왜 사진을 글자로 바꿔서 보낼 수는 없나 (근거)

툴에 넘기는 값은 모델이 한 글자씩 만들어내는 출력이다. 사진을 글자로 바꿔(base64) 넣으려면 모델이 그 긴 문자열을 오타 없이 전부 뱉어야 한다.

  • 126KB 이미지 → 약 12만 토큰. 가장 큰 모델의 한 번 출력 한도(12.8만)의 94%
  • 500KB 사진 → 약 49만 토큰. 한도의 4배
  • 공식 Python SDK는 4MiB 넘는 요청 본문을 파싱 전에 413으로 거절

최적화로 해결되는 문제가 아니라 구조적으로 불가능하다. Canva도 같은 이유로 upload-asset-from-url(URL로만 받기) 하나만 남겨뒀다.

ChatGPT가 주는 URL은 원본인가? — 조사했지만 증명할 수 없다

판정: 문서화되지 않음. 원본이라고도 축소본이라고도 확정할 수 없다.

공식 문서는 침묵한다

Apps SDK 레퍼런스와 변경 이력을 전수 확인했다. getFileDownloadUrl 설명은 “파일의 임시 다운로드 URL을 가져온다”가 전부다. 원본 여부, 리사이즈, 재인코딩, EXIF, 만료 시간 — 어느 것도 언급이 없다.

증거가 양쪽으로 갈린다
증거가리키는 방향
2024-09 실측: 40MB·5000px PNG 업로드 → 2.3MB·2048px·WebP로 변해 있었음. .zip으로 감싸면 5000px 유지축소된다
같은 글의 결론: “업로드 도중에 줄이고 있다” — 사실이면 서버에 원본이 아예 없다치명적
2026년 실제 페이로드에 mime_type: image/png와 원본 파일명이 살아 있음 (WebP로 변환됐다면 불가능)원본일 수 있다
Adobe가 ChatGPT 안에서 HEIC 40MB를 받고 있음 — HEIC는 OpenAI 비전이 지원하지 않는 포맷원본일 수 있다
download_url의 바이트를 실제로 비교해본 공개 사례0건

2024년 자료는 오래됐고, 측정 대상도 download_url이 아니라 다른 경로의 사본이었다. 결정적 실측은 아직 아무도 하지 않았다.

화질 이전에 막는 것들
  • 모바일은 아예 안 된다 — 파일 대신 껍데기 참조만 오는 버그가 열려 있다
  • 이미지 20MB 상한 — 인쇄 원고는 넘기기 쉽다
  • HEIC 불안정 — 아이폰 기본 포맷인데도
  • URL 만료 시간이 문서화돼 있지 않다
  • ICC 프로파일·EXIF 보존이 보장되지 않는다 — 색이 틀어져도 알 방법이 없다
확인하려면

6000×4000 PNG에 고유 EXIF와 AdobeRGB ICC를 심고 해시를 기록한 뒤, 더미 툴로 받아서 해시·크기·ICC를 찍어보면 10분이면 끝난다. 2048px로 돌아오면 인쇄 불가 확정. 다만 ChatGPT 앱을 하나 만들어야 해서 4단계에서나 가능하다. 절차는 scratchpad-research/chatgpt-file-fidelity.md에 있다.

그런데 인쇄 관점에서는 이게 오히려 맞다

챗봇을 거쳐 온 이미지는 원본이라는 보장이 없다. 호스트가 리사이즈했는지 다시 압축했는지 알 방법이 없고, 인쇄물은 원본 화질이 곧 상품 품질이다.

그래서 방침을 이렇게 정한다.

  • 인쇄에 쓰는 이미지는 우리가 직접 받은 원본만 쓴다. 편집기 업로드, 또는 아래의 위젯 직접 업로드
  • 호스트를 거쳐 온 이미지는 인쇄에 쓰지 않는다. 그건 “무슨 그림인지 파악해 상품을 고르는 용도”다
  • 해상도가 모자라면 원본을 요청하거나 더 작은 상품을 제안한다

원본이 온다는 것이 나중에 확인되더라도 이 방침은 유지하는 편이 낫다. 보증이 없는 경로에 인쇄를 걸 수는 없다 — 상대가 조용히 바꿔도 우리는 알 수 없고, 인쇄 사고는 이미 종이에 찍혀 나간 뒤라 되돌릴 수 없다.

다만 “미리보기용”으로는 값어치가 있다

챗에서 받은 이미지로 목업 미리보기를 그려서 보여주는 것은 별개다. 인쇄가 아니니 화질 요구가 낮고, 사용자는 “내 그림이 이 굿즈에 얹힌 모습을 이미 봤다”는 경험을 얻는다. 인쇄 파일만 편집기에서 다시 받으면 리스크 없이 체감 품질만 가져올 수 있다.

그럼 Canva는 어떻게 하고 있나

당연히 나오는 질문이다. Canva는 챗봇에서 디자인을 만들어 주는데, 그럼 사용자 사진을 어떻게 받는 걸까. 답은 “받지 못한다”이다.

Canva MCP의 에셋 관련 툴하는 일
upload-asset-from-urlURL로만 받는다
get-assetsCanva에 이미 있는 에셋 조회

파일을 받는 툴이 없다. 우리와 정확히 같은 벽에 막혀 있다. 게다가 Canva의 URL 업로드 API(/v1/url-asset-uploads)는 preview 단계라 문서에 이렇게 적혀 있다 — “preview API를 쓰는 공개 integration은 심사를 통과하지 못한다.” 자기 앱이니 쓰는 것이지 파트너에게 열어준 길이 아니다.

그럼 Canva는 무엇으로 디자인을 만드나 — 그리고 우리와 무엇이 다른가
Canva가 쓰는 재료 세 가지
  • 이미 Canva에 있는 에셋 — 사용자가 예전에 올려둔 것을 get-assets로 꺼낸다
  • 템플릿과 스톡 소재 — Canva가 보유한 디자인 요소와 사진
  • 텍스트에서 생성generate-design(prompt)로 프롬프트만 가지고

셋 다 “사용자가 방금 채팅에 붙인 사진”이 아니다.

결정적 차이 — 상품의 본질

Canva 상품의 본질은 디자인이다. 인스타 포스트, 프레젠테이션 — 사용자 사진이 없어도 텍스트·레이아웃·스톡 소재만으로 완성품이 나온다. 우리 상품의 본질은 사용자의 사진 그 자체다. 사진 없는 포토북은 상품이 아니다.

같은 벽 앞에서 할 수 있는 일이 다르다. Canva는 이 제약을 우아하게 피해 갈 수 있고 우리는 피할 수 없다. 이것이 “Canva는 되는데 왜 우리는 안 되나”의 답이다.

그래도 가져올 조각

get-assets는 우리 search_my_photos와 같은 발상이다. 스냅스에 사진을 올려둔 재구매 고객에게는 그대로 통한다 — “작년 제주도 사진으로 포토북”이면 바로 꺼낼 수 있다. 신규 고객만 새 업로드가 필요하다.

우리가 더 나은 지점
Canva스냅스
인증 시점디자인 생성보다 . 챗봇에서 넘어온 낯선 사용자에게 가입부터 요구로그인 없이 편집 진입 가능(확대 예정). 결과물을 먼저 보여주고 주문 때 로그인
편집기 소유파트너 사이트 → Canva → 복귀. JWT 서명 검증이 필요한 왕복편집기가 우리 것이라 왕복 자체가 없다

Figma는 또 다른 선택을 했다 — 미인증 상태로 만든 결과물을 추측 불가능한 URL에 두고 나중에 소유권을 주장(claim)하게 한다. 이커머스 전환에는 이쪽이 유리하고, 우리 익명 진입 구조와 같은 발상이다.

업계 전체가 같은 벽에 있다

Canva·Figma·Adobe 모두 URL이 아니면 받지 못하고, Mixbook은 아예 20장 업로드를 앱에서 받는다. 사진을 챗봇으로 못 받는 것은 우리 설계의 약점이 아니라 업계 공통 제약이다. 차이는 그 다음에 무엇을 하느냐에서 갈린다.

제3의 경로 — 위젯에서 우리 서버로 직접 업로드

Canva가 피해 가는 방식(사진 없이도 되는 상품)은 우리에게 통하지 않는다. 그래서 벽을 우회하는 다른 길을 찾아야 한다.

지금까지의 논의는 “호스트가 우리에게 이미지를 건네주는” 경로만 다뤘다. 그런데 한 가지가 더 있다. 위젯 안에서 사용자가 파일을 골라 우리 서버로 바로 올리는 것이다.

호스트 경유          사진 → [ChatGPT 서버] → download_url → 우리
                                ↑ 여기서 줄었는지 알 수 없다

위젯 직접 업로드     사진 → [사용자 브라우저] → 우리 서버
                                ↑ 호스트가 손댈 자리가 없다

규격에 있는 기능이다. 위젯의 connectDomains에 우리 업로드 도메인을 선언하면 그 주소로 fetch를 보낼 수 있다.

_meta.ui.csp = {
  connectDomains: ["https://upload.snaps.com"]   // CSP connect-src 로 매핑
}

이 경로는 원본 보장 문제를 없앤다

브라우저에서 우리 서버로 바로 가므로 호스트가 이미지를 건드릴 자리가 없다. 호스트의 20MB 상한도, HEIC 처리 방식도, 만료되는 URL도 상관이 없어진다. “보증 없는 경로”가 “우리가 규칙을 정하는 경로”로 바뀐다.

그리고 Claude에서도 동작한다. MCP Apps 표준이라 양쪽에 함께 나간다 — 파일을 못 넘겨주는 Claude의 제약을, 위젯이 파일을 직접 받아 우회하는 셈이다.

상품군위젯 업로드이유
이미지 1장 상품
스티커 · 아크릴 · 폰케이스 · 어패럴
✅ 잘 맞는다한 장이면 위젯으로 충분하고, 올리자마자 목업까지 그려 보여줄 수 있다
포토북 (21장 이상)❌ 부적합좁은 위젯에서 30장을 고르고 진행률을 보는 것은 고통스럽다. 편집기가 맞다

우리 상품 대다수가 1장짜리이므로 적용 범위가 넓다. 흐름은 이렇게 된다.

“이 그림으로 굿즈 만들래”
  → 위젯: [파일 선택] → 우리 서버로 원본 업로드
  → 목업 렌더 → “아크릴 키링에 이렇게 나와요”
  → 크기 선택
  → [편집기에서 마무리하기 ↗]
한계와 확인해야 할 것
  • 채팅에 이미 붙인 사진은 가져오지 못한다. 위젯에서 다시 골라야 한다 — 사용자 입장에서 한 번 더 고르는 마찰이 생긴다
  • 아직 검증되지 않았다. 위젯은 샌드박스 iframe인데, <input type="file"> 자체는 샌드박스 토큰을 요구하지 않으므로 동작할 것으로 판단하지만 실제로 돌려봐야 확실하다. 3단계에서 확인할 항목이다
  • _meta.ui.domain으로 고유 오리진을 받아야 하고(플러그인마다 하나), 우리 CORS 허용목록에 등록해야 한다
  • ChatGPT에는 window.openai.uploadFile()도 있지만 그건 ChatGPT 저장소로 올리는 것이라 원본 문제가 그대로 남는다. 우리가 쓸 것은 connectDomains 경유 직접 업로드다

비용 관점에서는 거의 공짜다. 목업 미리보기 때문에 위젯은 어차피 만들기로 했고, 여기에 업로드 UI를 얹는 것뿐이다.

앞선 버전의 “AI 업스케일” 계획은 철회한다

해상도 미달 이미지를 AI로 키워서 쓰자는 안을 넣었었는데 잘못된 판단이었다. 업스케일은 원본에 없던 디테일을 만들어내는 것이라, 화면에서는 그럴듯해도 인쇄하면 뭉개지거나 어색해진다. 원본 보존이 품질의 핵심인 사업에서 쓸 수 없는 수단이다. 파이프라인에서 제거했다.

02동작 방식

핵심은 순서 하나다. 링크를 먼저 주고 누르면 만드는 게 아니라, 먼저 만들어 두고 링크를 준다.

사용자가 상품·옵션을 고름
   ↓
[우리 서버] POST /v1/project            프로젝트 생성 → prjCode
[우리 서버] POST /v1/project/{prjCode}  디자인(save.json) 저장
   ↓
챗봇: "준비됐어요 — 편집기에서 이어서 만들기 ↗"
   ↓
m.snaps.com/ai/handoff?k=…  →  로그인 처리  →  편집기(이미 조립된 상태)

Canva·Figma·Adobe가 전부 이 방식을 쓴다. 조사한 사례 중 예외가 없었다. Mixbook은 이 원칙을 한 문장으로 정리해뒀다 — “빈 화면을 보여주지 않는다.”

서버가 디자인을 만들 수 있다 (실제로 해봤다)

편집기가 저장하는 디자인 파일과, 처음부터 들어 있는 디자인 틀이 같은 형식이었다. 그래서 서버가 만든 디자인을 저장해두면 편집기는 그것을 구별하지 않고 그냥 연다. STG에 직접 호출해서 확인했다.

확인한 것결과
서버가 만든 디자인 저장✅ 성공
저장 후 다시 불러오기✅ 내용 그대로
미리보기 이미지 없이 저장❌ 거부됨 (필수)
1×1 픽셀 흰 점을 넣고 저장성공

미리보기 이미지는 있어야 하지만 내용은 검사하지 않는다. 임시 이미지 한 장이면 통과하고, 진짜 미리보기는 사용자가 편집기에서 저장할 때 생긴다. 편집기를 서버에서 몰래 띄워 화면을 찍는 방식은 필요 없어졌다.

실측 상세 — API 순서, 함정, 원본 로그
확인 환경

stg1-kr-mobile-api.snaps.com · 채널 MWEB · 필름 책갈피(00803300010001 / 045021049239) · 2026-09-01

API 순서
POST /v1/project?appType=web60  {productCode}     → prjCode
POST /v1/project/{prjCode}/file  (사진)          → 업로드 응답이 곧 이미지 분석 결과
                                                    (얼굴 위치·화질·특징까지 함께 옴)
POST /v1/project/{prjCode}  multipart           saveFile + 약 40개 필드
디자인 파일 구조

{"scene": [...], "info": {...}}info는 진단용 메타데이터일 뿐이고 실제 내용은 scene에 있다. 템플릿 조회(GET /v1/template/{code}/json)와 프로젝트 조회(GET /v1/project/{prjCode}/json)가 같은 형식을 돌려주고, 편집기는 둘을 같은 함수에 넣는다.

이것 때문에 계속 실패했다
  • finishStatus는 참/거짓이 아니라 "N" / "Y"
  • projectSaveType"SAVE" 또는 "SAVE_TO_CART"
  • 스냅스 백엔드는 필드가 틀려도 500 A500000만 뱉고 무엇이 문제인지 알려주지 않는다. 대조군을 두고 하나씩 갈라야 원인이 나온다
추천 서버를 그대로 쓸 수 있다

기존 ai-rcmdmultiform.data이미 합성된 씬 데이터이고 multiform.order가 슬롯에 넣을 이미지 순서다. 변환 규칙은 “n번째 이미지 자리에 order[n]을 꽂는다” 한 줄이고, 그 변환기가 iOS에 약 50줄로 이미 구현돼 있다. Python 포팅은 작은 작업이다.

프로그래매틱 조립 시 주의

같은 사진을 여러 자리에 쓰면 1장으로 접힌다. 원인은 thumbnailBlob이 사진 단위 키를 쓰기 때문이다. 서버가 만들 때 이미지 키를 사진당이 아니라 자리당 발급하면 우회되고, 추천 서버의 중복 필터는 꺼야 한다.

03상품 지형

상품 59종을 전부 조사했다. 챗봇 관점에서 갈리는 기준은 “편집기 링크를 만들기까지 몇 번 물어봐야 하는가”다.

0회 묻지 않고 바로 링크 — 37종 스티커 · 아크릴 굿즈 · 필름책갈피 · 카드지갑 · 마우스패드 · 만주인형 어떤 디자인 틀을 쓸지가 코드에 상수로 박혀 있다. 서버가 그 표만 갖고 있으면 네트워크 호출 없이 링크가 완성된다. 여기서 시작하는 게 가장 빠르다.
1회 한 번 물어보면 됨 — 폰케이스 · 어패럴 · 나머지 아크릴 폰케이스 120여 기기 · 어패럴 35 품목 상품 목록 API를 한 번 부르면 “살 수 있는 조합” 한 줄이 오고, 그 안에 편집기에 필요한 값이 전부 들어 있다. 옵션이 많은 게 오히려 챗봇의 강점이다 — 120개 기종을 드롭다운에서 찾는 것보다 물어보는 쪽이 낫다.
특수 포토북 — 사진 21장 이상 필요 포토북 · 달력 · 졸업앨범 최소 장수가 코드에 박혀 있어 우회할 방법이 없다. 챗봇에서는 상품·테마까지만 정하고 사진은 편집기에서 한꺼번에 올린다. 업계 1위 Mixbook도 20장을 요구한다.
37종 전체 목록 — 무엇을 물어봐야 하고 이미지는 몇 장인지

전부 이미지 1장짜리다(우드블럭 달력만 예외). 차이는 “옵션을 몇 개 정해야 하는가”뿐이다.

옵션 없이 바로 — 10종
상품이미지물어볼 것
필름 책갈피1장없음
폰데코 스티커1장없음
DIY 낱장 스티커1장가로·세로 크기(mm)
아크릴 코롯토 (자유 크기)1장가로·세로 크기(10~150mm)
맥세이프 카드지갑 — 투명 / 가죽1장재질만 (2종)
오바록 패드 — 장패드 흰 / 검정 / 마우스패드 / 게이밍1장종류만 (4종)
만주 인형 키링1장없음
크기만 정하면 됨 — 12종
상품이미지크기 선택지
우표조각 스티커1장35×35 · 30×40
말랑 투명 스티커1장75×170 · 100×100 · A4/A5/A6
재사용 PVC 스티커1장미니 · 오리지널 · 포토카드
무료 키스컷 스티커1장75 · 90
아크릴 코롯토 (고정 정사각)1장소 · 대
크기 + 방향 — 11종
상품이미지조합
아크릴 스탠드 액자1장크기 2종 × 가로/세로 = 4가지
아크릴 마그넷1장86×54 · 70×55 · 40×30 각각 가로/세로, 50×50은 방향 없음 = 7가지
기타 — 4종
상품이미지물어볼 것
포토 티켓1장크기 · 용지 · 뒷면 처리
우드블럭 달력여러 장연도 · 시작월 · 수량 (한국어/일본어판 구분)

전체 매핑 원본(분기 조건과 소스 줄 번호까지)은 scratchpad-research/product-entry-matrix.md §4에 있다. 근거 파일은 전부 snaps-m/src/components/StoreNavigationActions/index.tsx다.

웹 편집기가 못 여는 상품 9종 — 앱 전용

신 웹 편집기가 지원하는 건 28개 묶음뿐이고, 목록에 없으면 오류로 끝난다. 아래 상품은 네이티브 앱 편집기에서만 열린다.

  • 졸업앨범 · 팬북
  • 액자 (일반 · 캔버스)
  • 카드 · 폴라로이드 팩
  • 씰스티커 A5 · 메모패드 · 홈데코

이 상품들은 앱 딥링크라는 별도 트랙이 필요하다. 미설치 사용자를 어떻게 처리할지도 함께 정해야 해서, 이번 일정에는 넣지 않았다.

또 포토북 웹 편집기에는 캔버스가 없다. 5단계 요청 폼(선택→요청→확인→업로드→완료)이고, “직접 만들기”는 프로젝트만 만든 뒤 네이티브로 넘긴다. 포토북 핸드오프의 목적지는 캔버스가 아니라 업로드 단계다.

대화 순서는 옵션이 먼저다

이미지보다 옵션을 먼저 물어야 한다. 우리 구조가 그렇게 되어 있다 — 크기·방향·용지가 정해져야 어떤 디자인 틀을 쓸지가 결정되기 때문이다. Casetify도 기기 모델을 먼저 고르고 사진을 올린다.

상품군챗에서 정할 것편집기가 할 일
스티커 · 아크릴 · 패드크기, 재질, 방향이미지 업로드, 위치 조정, 주문
폰케이스기기 모델, 케이스 종류이미지 업로드, 배치, 주문
어패럴품목, 색상, 인쇄면, 사이즈별 수량디자인 배치, 주문
포토북 · 달력상품, 테마, 방향, 용지21장 업로드 → 자동 배치 → 편집

04만들 것

챗봇에게 보여주는 기능은 5개로 제한한다. 많을수록 모델이 헷갈려서 엉뚱한 걸 고른다. Canva도 33개를 만들었다가 Claude에서는 2개만 남겼다.

기능성격하는 일
search_products읽기대화 맥락 → 상품 후보 몇 개. 59종을 전부 주지 않는다
get_product_options읽기기기·크기·색상 등 살 수 있는 조합을 돌려줘 대화로 좁히게 한다
create_project_draft생성조합 확정 → 프로젝트 생성 + 디자인 조립 + 링크 반환
get_project읽기편집기에서 뭘 했는지 조회
search_my_photos읽기이미 올려둔 사진 검색. 재구매 고객과 포토북에 유효

만들지 않는 것

  • 결제·주문 — 양쪽 챗봇 회사가 금지하고, 시장도 이미 답을 냈다(아래 참고)
  • AI 이미지 생성 — Anthropic이 지원하지 않는 용도로 분류해 반려한다
  • 구독 판매 — OpenAI 가이드라인 위반
  • 읽기·쓰기 섞인 만능 기능 — 심사 반려 1순위
왜 결제를 넣지 않나 — 시장이 낸 답

OpenAI가 챗 안에서 결제하는 기능(Instant Checkout)을 만들었다가 6개월 만인 2026-03-04에 폐기했다. 근거는 실측이다.

  • 월마트 기준, 챗 내부 결제가 walmart.com으로 보내는 것보다 전환율이 3분의 1
  • ChatGPT 앱을 낸 100개사 중 인앱 결제를 켠 곳은 Instacart 하나뿐

현재 OpenAI 문서는 자사 사이트 결제를 “권장되는 일반적 방식”이라고 명시한다. Shopify도 ChatGPT에서는 판매자 자체 스토어로 넘겨 결제한다. 정책과 시장이 같은 방향이고, 그게 우리가 하려던 방식이다.

목업 미리보기 — 하기로 했지만 만들 것이 하나 늘었다

“내 그림이 이 키링에 올라간 모습”을 채팅에 보여주는 것은 하기로 정했다. 이미지 1장짜리 상품은 그 그림이 구매 결정의 거의 전부이기 때문이다.

다만 두 가지가 확인됐다.

  • MCP가 이미지를 돌려줘도 Claude에서는 접힌 블록 안에 갇혀 안 보인다. 그래서 위젯(MCP Apps) 규격이 필수다
  • 그 위젯에 넣을 그림을 그려줄 도구가 회사에 없다. 상품 이미지를 만들어주는 서버가 있지만 액자 전용이라 굿즈에는 거절당했고(직접 호출해 확인), 굿즈에 그림을 얹는 기능은 편집기 안에만 있다

필요한 재료(상품별 위치·크기 정보)는 상품 API가 이미 주고 있어서 아주 어려운 일은 아니다. 편집기의 합성 기능을 서버로 옮기는 작업에 가깝고 3~4주로 잡았다.

저장용 미리보기와 혼동하지 말 것. 저장에 필요한 이미지는 임시 한 장으로 충분하다(실측). 목업은 전환율을 위한 추가 투자이고, 없어도 핸드오프 자체는 완성된다.

위젯은 목업만 담당하지 않는다. 같은 위젯에 파일 선택을 넣으면 사용자가 우리 서버로 직접 원본을 올릴 수 있다(1절 참조). 목업 때문에 어차피 만드는 물건이라, 업로드까지 얹는 추가 비용은 거의 없다. 이미지 1장 상품에서는 “올리고 → 목업 보고 → 편집기로”가 한 위젯 안에서 이어진다.

심사에서 즉시 떨어지는 항목 (제출 전 체크리스트)
항목결과대응
개인정보처리방침 없음·부실즉시 거절한국어 필수 + 심사용 영문판, 공개 URL
기능에 성격 표시 누락반려 2위5개 전부에 읽기/생성 표시
읽기·쓰기 섞인 만능 기능반려 1위설명으로 구분하는 건 불충분. 기능을 나눌 것
기능 설명에 홍보 문구자동 거절“상품을 추천한다” 같은 문구가 프롬프트 조작으로 분류된다. 기술 서술만
snaps.com 링크 도메인 미등록UX 파손미등록 시 링크 누를 때마다 “외부 링크 열기?” 확인창
테스트 계정에 2단계 인증거절사진·주문 이력이 있는 데모 계정을 2FA 없이
보안에서 놓치기 쉬운 것
  • SSRF — 사용자가 준 URL을 서버가 받아오므로 내부망 주소 차단이 실제로 필요하다. 특히 169.254.169.254가 뚫리면 서버 자격증명이 샌다
  • 프로젝트 코드는 인증이 아니다 — 추측 불가능하게 만들고 사용자와 묶어둘 것
  • 속도 제한 기준은 IP가 아니다 — 트래픽이 전부 같은 대역에서 온다. 사용자 단위로 걸어야 한다
  • 생성 기능에 성격 표시를 해두면 Claude가 항상 사용자 확인을 받는다 — 사고 방지가 공짜로 붙는다

05로드맵

앞 단계가 뒤 단계의 재료라 순서를 건너뛰기 어렵다.

0
링크 규칙 정리즉시
디자인 틀 37종 표를 서버 자산으로 옮기고, 저장 API 규칙을 문서로 굳힌다. 확인이 필요했던 두 건은 이미 끝났다 — 서버 조립 가능 여부와 회사 계정 조건 모두 통과.
1
서버 없이 흉내내보기며칠
문서 한 장에 상품 목록과 링크 규칙만 적어 Claude에 물려본다. 목적은 배포가 아니라 “챗봇이 언제 우리를 꺼내는가”를 알아내는 것. 여기서 얻은 문장이 그대로 다음 단계에 쓰인다.
2
서버 만들어 내부에서 써보기3~4주 (37종) / 9~10주 (전 상품)
심사 없이 오늘 당장 가능하다. Claude는 서버 주소만 붙여넣으면 바로 연결된다.
  • 37종 먼저 → 폰케이스·어패럴 순으로 확장
  • snaps-m에 핸드오프 진입점 추가 (일회용 열쇠 방식)
  • 로그인 없이 편집 시작을 전 상품으로 확대 (저장할 때 로그인은 유지)
3
로그인 연동 + 위젯1~2주 (+목업 3~4주)
챗봇에서 넘어온 사람이 자기 스냅스 계정으로 이어지게 만든다. 공식 등록의 필수 조건이다.
  • 위젯 파일 업로드를 여기서 검증한다 — 샌드박스 iframe에서 <input type="file"> + fetch가 실제로 되는지. 되면 원본을 우리가 직접 받는 길이 열린다
  • _meta.ui.domain 고유 오리진 확보 + CORS 등록
4
공식 목록 등록심사 별도
ChatGPT 먼저(심사 5~10영업일), Claude 다음(기간 미공개, 2주~수개월). 날짜를 약속하면 안 된다. 병행해서 고정 상품 라인은 ChatGPT 상품 피드로 별도 신청할 수 있다.
별도 트랙: 앱 딥링크미추정
액자·졸업앨범 등 웹 편집기가 못 여는 9종. 선행 조사가 필요해 이번 일정에 넣지 않았다.
ChatGPT를 먼저 내는 이유가 바뀌었다

앞선 버전에서는 “사진이 실제로 전달되는 유일한 곳”을 이유로 들었다. 그런데 인쇄용 이미지를 챗봇으로 나르지 않기로 하면서 그 이유는 약해졌다.

남은 이유는 두 가지다.

  • 심사 기간이 5~10영업일로 예측 가능하다. Claude는 공개된 기준이 없어 계획을 세울 수 없다
  • 실물 상품을 자사 사이트 결제로 넘기는 방식이 OpenAI 가이드라인에 명시적으로 권장돼 있어 반려 위험이 낮다

순서 자체는 유지하되, 근거가 “이미지” 아닌 “예측 가능성”으로 바뀐 것이다.

06비용

서버는 월 2만 8천 원이다. 호출이 10배로 늘어도 4만 원대다. 등록비도 수수료도 없다.

이렇게 싼 이유는 대화를 이해하고 판단하는 무거운 일을 Claude와 ChatGPT가 자기 비용으로 해주기 때문이다. 우리는 “그래서 어떤 상품이고 링크는 이것”이라고 답하는 배관만 댄다.

비용 상세 — 구간별 금액, 공수, 탈락시킨 선택지

서울 리전 실측 단가, 1 USD = 1,377원 기준. EC2 t3.small + 기존 ALB에 규칙 추가가 권장 구성이다.

항목월 1천 회1만 회10만 회
서버 + 로드밸런서$19.48$19.98$20.98
로그인 연동 (1M 사용자까지 무료)$0$0$0
저장소 · CDN~$0.2~$1~$9
합계₩27,600₩29,000₩42,700
신경 쓸 비용 축

우리 서버가 직접 AI를 불러 사진을 분석하기 시작하면 자릿수가 바뀐다. 월 10만 회 기준 저렴한 모델도 월 50만 원, 상위 모델은 240만 원으로 서버비의 10~50배다. 초기 버전에서 서버측 AI 호출을 넣지 않는 것은 비용 판단이기도 하다.

앞선 버전에 있던 업스케일 GPU 비용은 삭제했다 — 업스케일 자체를 철회했기 때문이다.

공수
범위공수
37종만 (최소 동작)3~4주
웹 편집기 전 상품9~10주
목업 미리보기 추가+3~4주
공식 등록까지 전체약 5개월 (심사 대기 제외)
앱 딥링크 트랙미추정
탈락시킨 선택지
  • AWS Cognito — 필요한 로그인 규격 두 가지를 다 지원하지 않고, 우회하려면 절반을 직접 짜야 한다. 게다가 사용자당 과금이라 더 비싸다
  • Bedrock AgentCore Gateway — 챗봇 연결에 필요한 인증 엔드포인트를 노출하지 않는다. AWS 자체 이슈로 “claude.ai 연동을 막는다”고 등록돼 있다
  • Fargate — 월 $63.71 고정. 이 트래픽에는 과하다

07정할 것

확인이 필요했던 것은 모두 끝났다

  • 서버가 디자인을 만들어 편집기에 넘길 수 있는가 → STG 실측 통과
  • 회사 단위 Claude 계정과 관리자 권한이 있는가 → WEBLING 팀 조직, 최고 관리자. 추가 구독 불필요

착수를 막는 것이 남아 있지 않다. 아래는 가부가 아니라 범위와 시점에 대한 선택이다.

  1. 37종만 먼저 내보낼 것인가, 전 상품을 갖추고 낼 것인가 37종은 3~4주, 전 상품은 9~10주다. 37종은 서버 호출이 없어 실패 지점이 적고 손대는 범위도 작아 기존 주문 흐름을 건드릴 위험이 낮다. 대신 챗봇에 보이는 상품이 스티커·아크릴 굿즈 위주로 치우친다. 먼저 내보내고 반응을 보며 넓히는 쪽을 권한다.
  2. 위젯(목업 + 업로드)을 첫 버전에 넣을 것인가 +3~4주가 든다. 없어도 핸드오프는 완성되므로 37종을 먼저 내보낸 뒤 붙이는 것도 가능하다. 다만 위젯 하나가 두 가지를 동시에 푼다 — 목업 미리보기(구매 결정의 대부분)와 원본 직접 업로드(호스트 경유의 화질 불확실성 제거). 이미지 1장 상품에서는 위젯 안에서 “올리고 → 보고 → 편집기로”가 이어져 체감 차이가 크다. 다만 샌드박스에서 파일 업로드가 되는지 아직 검증 전이라, 3단계 검증 결과를 보고 확정하는 편이 안전하다.
  3. 로그인 없이 편집 시작을 어디까지 열 것인가 지금은 AI 무료 포토북 하나만 열려 있다. 챗봇에서 막 넘어온 사람에게 로그인부터 요구하면 대부분 이탈하므로 확대가 필요한데, 편집기 시작 경로를 건드리는 수정이라 기존 주문에 회귀 위험이 있다. 37종만 먼저 여는 선택지가 있고, 범위가 작아 위험이 낮다.
  4. ChatGPT 스티커 진입점을 추격할 것인가 ChatGPT가 2026년 8월 스티커 만들기를 전 세계 무료로 냈는데 인쇄 파트너가 없다. 우리 스티커 9종은 전부 가장 쉬운 그룹이다. 다만 생성물이 인쇄 가능한 화질인지 먼저 봐야 하고, “우리는 생성하지 않고 인쇄만 한다”는 선을 분명히 해야 한다 — AI 생성 도구로 분류되면 Claude 심사에서 반려된다.