Files
sb-backend/docs/UGC-guideline-1.2.md
T

4.3 KiB

App Store 심사 대응 — 커뮤니티 UGC 안전장치 (Guideline 1.2)

작성일: 2026-07-15 관련 커밋: sb-backend 0b027b3, sb-front 9b89d0b

배경 — 애플 심사 거부 내역

첫 제출(1.0) 심사에서 아래 사유로 거부됨.

  1. Guideline 2.3.6 (Accurate Metadata) — 연령 등급의 "In-App Controls"(Parental Controls / Age Assurance)를 선택했으나 앱에 해당 기능 없음 → App Store Connect 연령 등급에서 두 항목 None 으로 변경 (코드 아님, 콘솔 작업)
  2. Guideline 2.1(a) (Information Needed) — 데모 계정 + 커뮤니티/짠테크 수다방/재테크 팁에 콘텐츠 필요 → 데모 계정 등록 + 샘플 콘텐츠 채우기 (콘솔/데이터 작업)
  3. Guideline 1.2 (User-Generated Content) — UGC 안전장치 미비 ← 이번 코드 작업 대상

Guideline 1.2 요구사항 대비 구현 현황

요구사항 상태 구현
EULA 동의(가입/로그인 전) 기존+보강 가입 모달 동의 + 로그인 모달 동의 게이트 신설
EULA 내 "무관용" 문구 신규 이용약관 제6조의2 추가
부적절 콘텐츠 필터 신규 ContentFilter (작성/수정/댓글 차단)
콘텐츠 신고(flag) 기존 reportPost/reportComment (5건 누적 블라인드)
악성 사용자 차단(block) 신규 user_block — 차단 즉시 숨김 + 운영자 통지
24h 내 삭제/퇴출 기존 관리자 신고관리 + 회원 상태(이용정지/퇴출)

변경 파일

백엔드 (sb-backend / 로컬 sb_bt)

  • db/board.sql — user_block 테이블 추가 (CREATE TABLE IF NOT EXISTS, 멱등)
  • board/service/ContentFilter.java (신규) — 욕설·비방 등 금지어 필터, 정규화 후 부분일치
  • board/dto/BlockedUser.java, board/dto/UserBlockNotice.java (신규)
  • board/mapper/UserBlockMapper.java + mapper/UserBlockMapper.xml (신규) — 차단 CRUD/조회
  • board/service/BoardService.java — 차단 메서드, 목록/상세/댓글에 viewer 기준 차단 필터, ContentFilter 연동
  • board/controller/BoardController.java — 차단 API (/board/users/{id}/block|unblock, /board/blocks, /board/user-blocks)
  • board/mapper/PostMapper.*, CommentMapper.* — 목록/댓글 쿼리에 NOT EXISTS user_block 필터 (viewerId)

프론트 (sb-front)

  • constants/terms.js — 무관용 정책 조항(제6조의2), 시행일 2026-07-15
  • components/LoginModal.vue — 로그인 전 약관 동의 체크박스(아이디·구글·애플 공통 게이트)
  • api/boardApi.js — 차단 API 4종
  • views/board/BoardDetailView.vue — 글·댓글 🚫차단 버튼 + 로직
  • views/settings/BlockedUsersView.vue (신규) + router/index.js — 차단 사용자 관리 화면 /settings/blocked
  • views/settings/SettingsView.vue — "차단한 사용자" 메뉴 링크
  • views/admin/ReportAdminView.vue — 사용자 차단 통지 섹션

배포 메모

  • 백엔드 프로덕션은 SQL_INIT_MODE=always → 재기동 시 board.sql의 user_block 자동 생성(멱등).
  • main 푸시 시 Gitea Actions 자동 배포.

⏳ 미해결 / 남은 작업 (다음 세션)

  1. 배포 SSH 인증 실패 — Deploy 워크플로가 Permission denied (publickey,password)로 실패 중.
    • root + 공개키 서버 등록됨, 로컬 ssh -i ~/deploy_key root@115.68.231.167 접속은 성공.
    • 새 ed25519 키 발급 → 서버 authorized_keys 등록 → Gitea DEPLOY_SSH_KEY 시크릿 교체했으나 재실행 여전히 동일 실패.
    • 추정: 러너가 받는 시크릿 값이 실제 키와 다름(저장 안 됨 / org-level 시크릿 shadowing 등).
    • 다음: 러너가 쥔 개인키 지문(fingerprint) 확인으로 확정 → 로컬 ssh-keygen -lf ~/deploy_key 와 비교. org/repo 시크릿 위치 점검.
  2. iOS 재제출
    • cd sb-front && npm run cap:sync → Xcode 빌드 번호 1.0(3) 올려 업로드
    • 실기기 화면 녹화: ①로그인 전 약관 동의 ②신고 ③차단
    • App Review Information Notes 에 영상 + 데모 계정(콘텐츠 포함) 첨부
    • 연령 등급 In-App Controls → None 확인
  3. App Store Connect — 커뮤니티/짠테크 수다방/재테크 팁 샘플 콘텐츠 채우기, 데모 계정 로그인 검증