Uploader는 Creator가 아니다 — PhotoGram에서 C2PA와 저작권 주장을 분리한 이유
PhotoGram에 C2PA를 붙이려다 “업로드한 계정을 creator로 서명해도 되는가?”라는 제품 정책 문제를 만났다. publication integrity와 사용자 권리 주장을 분리하고, 기본 게시 UX까지 다시 정한 과정을 정리했다.
WRITING / SORUNE TECHNICAL JOURNAL
제품을 만들고, 오래된 시스템을 고치고, 직접 운영하면서 바뀐 생각과 근거를 남깁니다.
PhotoGram · PaaS / Server Ops / Security Guard · CharaWeave · AI-assisted engineering
LATEST
PhotoGram에 C2PA를 붙이려다 “업로드한 계정을 creator로 서명해도 되는가?”라는 제품 정책 문제를 만났다. publication integrity와 사용자 권리 주장을 분리하고, 기본 게시 UX까지 다시 정한 과정을 정리했다.
PROJECT JOURNALS
기능 목록보다 실제 구현과 운영에서 생긴 결정의 흐름을 묶어 봅니다.
PRODUCT / MODERNIZATION
검색, Place, 미디어 처리, 인증과 제품 정책을 실제 서비스 경계로 다시 다듬는 과정.
LATESTUploader는 Creator가 아니다 — PhotoGram에서 C2PA와 저작권 주장을 분리한 이유
RUNTIME / OPERATIONS / SECURITY
홈 서버의 배포, 관측, runtime authority와 보안 집행 경계를 기계적으로 연결하는 과정.
LATESTPRIMARY가 바뀌어도 도메인은 바뀌면 안 된다 — 홈 PaaS에서 Control Plane과 Data Plane을 나눈 이유
SDK / RUNTIME
캐릭터의 의미 모델과 실행 환경을 분리하고 여러 host에서 같은 contract를 유지하는 실험.
LATEST캐릭터를 움직이는 것과 살아 있게 만드는 것은 다르다 — CharaWeave Character Core 설계
RECENT WRITING
발행 시각 순서. 글의 형식보다 어떤 문제에서 출발했는지를 우선합니다.
PhotoGram에 이어 Ghost까지 실제 workload로 붙이자 단일 서버에서는 보이지 않던 routing과 authority 문제가 드러났다. public identity를 고정한 채 control-plane handover와 workload 이동을 분리한 과정을 정리했다.
서로 다른 작업을 수행하던 Claude와 Codex 세션이 같은 mutable checkout을 공유하면서 branch context가 바뀌고 한 세션의 변경이 잘못된 checkout에 들어갔다. AI 병렬 실행에서 workspace 자체가 shared mutable state라는 사실을 정리한다.
반복되는 AI 디자인 피드백 대신 실제 React 앱의 38개 UI 상태를 desktop/mobile 각각 standalone HTML로 추출했다. 새 mock을 만드는 대신 현재 제품을 editable projection으로 바꿔 human visual review 비용을 낮춘 과정을 정리한다.
Git worktree로 source checkout은 분리했지만 local MariaDB는 공유하고 있었다. feature branch의 ddl-auto update가 남긴 NOT NULL 컬럼이 main의 회원가입을 깨뜨린 사건과, compatibility code 대신 실제 drift를 제거한 판단을 정리한다.
30일 보존 규칙 하나로 계정과 모든 콘텐츠를 처리하려고 하면 복구, 재가입, 개인정보, 미디어 정리가 서로 충돌한다. PhotoGram에서 계정 탈퇴와 비활성화, Photo/Story 휴지통, raw GPS 보존을 서로 다른 lifecycle로 분리한 이유를 정리한다.
Place V1 구현 보고서는 PASS였지만 실제 source review에서는 exact GPS 로그 노출, N+1 조회, visibility count 누출, 누락된 Root search, provider 종속 검색이 P0로 드러났다. 기능 존재 여부보다 경계의 의미를 확인한 코드 리뷰를 정리한다.
PaaS, Server Ops, Security Guard를 두 번째 물리 노드에 실제로 연결하면서 handshake, observation, containment, disconnect/reconnect, crash-restart를 검증했다. 단위 테스트를 넘어서 실제 runtime transition을 확인해야 했던 이유를 정리한다.
사진의 EXIF GPS는 좋은 장소 추천 신호지만 그대로 저장하거나 공개 위치로 취급하면 위험하다. 정확한 촬영 좌표는 transient observation으로만 쓰고 사용자가 선택한 Place snapshot만 남기는 구조를 정리한다.
DB 침해에서 OS command execution과 resource hijacking까지 이어진 실제 사건은 기존 웹 abuse detection만으로는 보이지 않는 영역을 드러냈다. 예방, 관측, 판단, 집행을 어떻게 다시 나눴는지 정리한다.
프로젝트가 늘어나자 AI에게 같은 controller, DTO, cache adapter, UI 구조를 반복 생성시키는 비용이 보이기 시작했다. 모든 것을 generic framework로 만들지 않으면서 재사용 자산을 쌓는 기준을 정리한다.
여러 물리 노드를 하나의 PaaS로 묶더라도 process observation과 containment authority까지 중앙화할 필요는 없다. 각 노드가 자기 runtime의 사실과 집행을 소유하고 PaaS mesh는 요약된 상태만 조정하도록 한 이유를 정리한다.
ABOUT THIS JOURNAL
제품을 만들고, 기존 시스템을 고치고, 직접 운영하면서 생긴 실패한 가정과 검증 근거를 기록합니다. 완성된 정답처럼 정리하기보다 당시 무엇을 알았고 무엇을 몰랐는지 구분해서 남깁니다.