64 lines
4.3 KiB
Markdown
64 lines
4.3 KiB
Markdown
# 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** — 커뮤니티/짠테크 수다방/재테크 팁 샘플 콘텐츠 채우기, 데모 계정 로그인 검증
|