docs: UGC 안전장치(가이드라인 1.2) 작업 요약 및 남은 작업 정리

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
isodev
2026-07-15 22:42:03 +09:00
co-authored by Claude Opus 4.8
parent 0b027b3704
commit d201297463
+63
View File
@@ -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** — 커뮤니티/짠테크 수다방/재테크 팁 샘플 콘텐츠 채우기, 데모 계정 로그인 검증