From d20129746351f8e0c030b1dd44e95cc611c75fcd Mon Sep 17 00:00:00 2001 From: isodev Date: Wed, 15 Jul 2026 22:42:03 +0900 Subject: [PATCH] =?UTF-8?q?docs:=20UGC=20=EC=95=88=EC=A0=84=EC=9E=A5?= =?UTF-8?q?=EC=B9=98(=EA=B0=80=EC=9D=B4=EB=93=9C=EB=9D=BC=EC=9D=B8=201.2)?= =?UTF-8?q?=20=EC=9E=91=EC=97=85=20=EC=9A=94=EC=95=BD=20=EB=B0=8F=20?= =?UTF-8?q?=EB=82=A8=EC=9D=80=20=EC=9E=91=EC=97=85=20=EC=A0=95=EB=A6=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-Authored-By: Claude Opus 4.8 --- docs/UGC-guideline-1.2.md | 63 +++++++++++++++++++++++++++++++++++++++ 1 file changed, 63 insertions(+) create mode 100644 docs/UGC-guideline-1.2.md diff --git a/docs/UGC-guideline-1.2.md b/docs/UGC-guideline-1.2.md new file mode 100644 index 0000000..d219b52 --- /dev/null +++ b/docs/UGC-guideline-1.2.md @@ -0,0 +1,63 @@ +# 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** — 커뮤니티/짠테크 수다방/재테크 팁 샘플 콘텐츠 채우기, 데모 계정 로그인 검증