운영 저널

임시 파일 전송을 개인정보 관점에서 설계한 기록

‘임시’는 파일이 서버를 전혀 거치지 않는다는 뜻이 아닙니다. Vibe Share v1은 server relay와 객체 저장소를 사용하므로, 어떤 데이터가 어느 단계에서 생기고 수락이 무엇을 통제하는지 정확히 설명해야 합니다.

근거 범위 서버 데이터 모델, storage adapter, 세션·전송 상태 코드, cleanup 명령과 개인정보·보안 문서

Vibe Share v1은 WebRTC의 기기 간 직접 전송이 아니라 서버 relay 구조입니다. 파일 바이트는 전송 방식에 따라 API의 임시 파일 경로나 S3 호환 객체 저장소를 거칠 수 있습니다. 세션과 전송 상태는 PostgreSQL 또는 개발용 JSON 저장소에, 짧은 pairing과 room 상태는 Redis 또는 메모리에 기록됩니다.

이 구조에서 개인정보를 설명할 때 가장 중요한 점은 수락 시점입니다. 보내는 쪽이 업로드를 마치면 받는 쪽에 offer가 전달되고, 받는 쪽이 수락해야 다운로드 단계로 넘어갑니다. 즉 수락은 ‘수신자가 파일을 내려받을지’를 통제하지만, ‘파일 바이트가 임시 저장소에 한 번도 도달하지 않았는지’를 통제하는 장치는 아닙니다.

실제 수명 주기와 데이터

작은 화면에서는 표를 좌우로 움직여 나머지 열을 확인할 수 있습니다.

단계처리되는 정보역할기본 만료 또는 종료
세션 생성세션 ID, 6자리 코드, 역할, 만료 시각, device trust hashPC와 mobile이 같은 전송방인지 확인코드 기본값은 30분 세션 TTL
업로드 준비파일명, MIME type, 바이트 크기, 저장 key, upload part 정보전송 표시와 resumable 업로드 상태 관리전송 기본값은 1시간 TTL
파일 임시 저장파일 바이트 또는 multipart object받는 쪽이 수락한 뒤 다운로드할 원본local relay cleanup 또는 별도로 설정해야 하는 객체 저장소 lifecycle의 대상
수락 또는 거절transfer 상태와 역할다운로드 가능 여부와 사용자 의사 기록거절·완료·실패 상태로 전환
운영 로그요청 시각, 상태, 오류, 제한된 audit metadata장애·오남용 조사배포 환경의 로그·보존 정책 영향

30분, 1시간, 60초 cleanup 간격은 저장소의 기본 설정값이지 모든 배포에서 변하지 않는 삭제 약속이 아닙니다. 이 TTL은 세션과 전송의 유효성을 끝내지만, PostgreSQL metadata와 audit row를 자동으로 지우지는 않습니다. 현재 S3/R2 adapter에는 완료 object를 삭제하는 경로가 없고 외부 lifecycle 설정도 저장소로 검증되지 않았습니다.

What we observed — 우리가 관찰한 것

‘수락 전에는 서버에 아무것도 저장되지 않는다’고 쓰면 현재 구현과 맞지 않습니다. relay와 resumable 경로 모두 offer를 만들기 전에 업로드 상태가 생기며, 파일 바이트가 임시 저장소에 존재할 수 있습니다. 그래서 수락/거절을 중요한 안전 장치로 설명하되, end-to-end encryption이나 zero-knowledge storage처럼 표현하지 않습니다.

메타데이터도 파일명 하나로 끝나지 않습니다. 전송 방향, 크기, MIME type, 상태, 저장 driver와 key, 만료 시각이 전송 처리에 필요합니다. resumable 경로는 part 번호, ETag, checksum과 바이트 크기를 추가로 기록합니다.

What we changed — 우리가 바꾼 것

세션과 전송에 만료 시각을 두고, runtime cleanup은 만료된 in-memory 상태와 local relay 파일을 정리하며 standalone cleanup은 중단된 multipart upload를 abort하고 metadata 상태를 expired 또는 cancelled로 바꿉니다. API에서 upload initiate·part URL·download URL을 발급하는 보호된 경로는 session, 역할, device trust를 확인합니다. S3/R2로 직접 전송하는 경우에는 제한된 signed URL 경계도 사용합니다.

device trust 검증에는 hash가 사용되지만 모든 연결 식별자가 hash만으로 저장되는 것은 아닙니다. anonymous session에는 6자리 code가 저장되고 운영 로그나 audit metadata에도 session 관련 값이 남을 수 있습니다. 이 beta에는 검증된 audit-log 보존 기간이나 외부 개인정보·보안 감사 결과가 없습니다.

resumable upload를 시작할 때 transfer와 upload-session metadata를 먼저 일관되게 저장한 뒤 in-memory 상태에 노출하도록 순서를 수정했습니다. PostgreSQL에서는 두 기록을 transaction으로 묶고, metadata 저장이 실패하면 이미 시작한 provider multipart upload를 abort합니다.

What remains limited — 아직 제한되는 것

Vibe Share는 영구 백업, 법적 보존, 파일 내용의 무해성, 수신 후 기기에서의 삭제를 약속하지 않습니다. HTTPS로 전송 구간을 보호하지만 현재 공개 설명은 종단간 암호화를 주장하지 않습니다. malware scan hook이 코드에 있어도 실제 모든 파일이 검사된다고 게시하지 않습니다.

민감한 신분증, 의료·금융 원본, 장기 보관이 필요한 유일본은 이 beta 서비스에만 의존하기에 적합하지 않습니다. 사용자는 받는 기기와 파일명을 확인하고, 별도 백업과 조직 정책을 적용해야 합니다. 운영자가 실제 보존 설정을 바꾸면 개인정보처리방침과 이 글의 수정일도 함께 갱신해야 합니다.