콘텐츠로 이동

MSG-278 미션 스탬프 판정의 촬영 시각 위조 방어

티켓: MSG-278 · 작성일: 2026-08-03 · 작성: prd-writer 상태: 검토됨 (2026-08-03 성민 승인 — 미해결 질문 2건 확정 반영)

1. 문제 상황

미션(축제·팝업) 스탬프 판정은 영상의 촬영 시각(recorded_at)을 미션 기간과 비교한다 (MissionRepository.findCompletedv.recorded_at >= m.start_at AND <= m.end_at). 그런데 이 값은 클라이언트가 업로드 요청 body에 적어 보내는 값이고, 서버 검증은 @NotNull뿐이다(실측: VideoUploadRequestDto.recordedAt). 요청을 조작해 "축제 기간 안 시각"을 적으면 축제가 끝난 뒤에도 스탬프를 딸 수 있다. 교체(PUT) 경로도 recordedAt을 그대로 반영한다(MSG-242).

방금 실적재(MSG-290)로 dev에 기간형 미션 416건(축제 238·팝업 178)이 실제로 깔려, 이 구멍이 라이브 판정에 그대로 노출된 상태다. (Codex 커밋 리뷰 2026-07-31 파생, MSG-223 판정 코드 대상)

2. 목적 · 목표

  • 목적: 트리비얼한 촬영 시각 위조(미래 시각·기간 밖→안 조작)로 스탬프를 따는 것을 막는다.
  • 목표:
  • 업로드 시점보다 미래인 recordedAt이 서버에서 거부된다 (업로드·교체 양쪽)
  • 정상 사용자(갤러리 과거 영상, 시계 오차 수준)는 거부되지 않는다
  • 비목표(스코프 제외):
  • 완전한 위조 차단 — 갤러리 업로드의 메타데이터 진위를 서버가 검증할 수단이 없다. 과거 시각을 기간 안으로 적는 위조는 이 티켓으로 막을 수 없음을 명시적으로 수용
  • GPS·촬영 플로우 토큰 등 신뢰 신호 신설 — 요구가 생기면 별도 티켓(PRD부터)
  • 스탬프 소급 회수 — 이미 발급된 스탬프는 비회수 원칙(MSG-223) 유지

3. 기능 요구사항

ID 요구사항 우선순위
FR-1 업로드 확정 요청의 recordedAt이 서버 현재 시각보다 미래면 400으로 거부된다 Must
FR-2 교체(PUT) 요청의 recordedAt도 동일하게 검증된다 — 교체로 우회 불가 Must
FR-3 정상 사용자의 단말 시계 오차 수준(수 분)은 거부되지 않는다 — 허용 오차를 둔다 Must
FR-4 거부는 video 도메인 에러 코드(3xxx)로 구분 가능하다 — FE가 "촬영 시각 오류" 안내 가능 Must
FR-5 과거 시각은 기존대로 통과한다 — 갤러리 업로드(과거 촬영 정상)의 도감 수집은 불변 Must

엣지: recordedAt은 시간대 표기가 없는 LocalDateTime이다 — 서버 비교 기준(UTC/KST)의 해석을 스펙이 실측으로 확정하고, 잘못된 기준으로 정상 업로드가 9시간 스큐 오거부되지 않아야 한다 (MSG-222 KST 스큐 전례).

4. 비기능 요구사항

분류 요구사항
보안 목적은 트리비얼 위조 차단이다 — 서명·메타데이터 검증 없는 값이므로 "기간 안 과거 시각" 위조는 잔존 위험으로 수용하고 문서화한다
데이터 정합 기존 저장 행 소급 없음. 판정 쿼리(findCompleted)·스탬프 발급 로직 무수정 — 방어는 입력 경계에서
운영 마이그레이션 없음. 기존 클라이언트가 정상 시각을 보내는 한 동작 변화 없음

5. 시퀀스 다이어그램

시퀀스 다이어그램
시퀀스 다이어그램

6. 클래스 다이어그램

신규 타입 없음 — 기존 업로드·교체 경로에 검증 1종과 에러 코드 상수 추가 수준.

7. 변경 파일 목록

파일 변경 Owner
src/main/java/com/msg/fillmap/video/service/VideoServiceImpl.java 수정 — 업로드·교체 경로 미래 시각 검증 (정확한 지점은 스펙 확정) B
src/main/java/com/msg/fillmap/video/exception/VideoErrorCode.java 수정 — 촬영 시각 오류 상수 추가 B
src/test/java/com/msg/fillmap/video/** 수정 — 거부·통과·오차 경계 테스트 B

8. 확정 사항 (2026-08-03 성민 결정)

  • 이벤트 미션 인정 범위 = 갤러리 포함 인정 (현행 유지): 트리비얼 위조(미래 시각)만 차단한다. 근거 — 서버가 입력 소스(갤러리/카메라)를 구분할 수단이 현재 요청 계약에 없고(실측), "현장 촬영만 인정"은 클라 신고 필드를 받아도 같은 방식으로 위조된다. 도감·스트릭이 갤러리 업로드를 인정하는 기존 결정과도 일관. 현장 촬영 한정이 필요해지면 GPS 검증 등 신뢰 신호 신설을 별도 티켓(PRD부터)으로 진행한다.
  • 허용 오차 = 5분: 서버 현재 시각 + 5분까지의 recordedAt은 통과 — 일반적인 단말 시계 스큐 커버, 위조 실익 없음.

미해결 질문 없음.