# App Store 가이드라인 1.2 사용자 생성 콘텐츠 요구사항

> 가이드라인 1.2: 사용자가 콘텐츠를 게시한다면 필터, 신고, 차단, 연락처, 이용약관 동의가 필요해요. Expo와 Supabase 체크리스트로 정리했어요.

원본 페이지: [App Store 가이드라인 1.2 사용자 생성 콘텐츠 요구사항](https://devoria.fr/ko/blog/app-store-guideline-1-2-user-generated-content)
작성자: [Mehdi Azizi](https://devoria.fr/ko/mehdi-azizi)
게시일: 2026-11-04
최종 내용 수정: 2026-11-04


가이드라인 1.2는 사용자가 게시한 무언가를 다른 사용자가 볼 수 있는 순간부터 적용돼요. 메시지, 사진, 리뷰, 그리고 제 생각에는 순위표에 표시되는 닉네임 하나까지도요. 이 경우 Apple 가이드라인은 필터, 신고와 그에 대한 빠른 대응, 차단, 공개된 연락처를 요구해요. **리젝 메시지에는 다섯 번째 요구사항이 더 있어요. 불쾌한 콘텐츠와 악성 사용자를 용납하지 않는 이용약관에 사용자가 동의해야 한다는 거예요.**

이 글은 리젝 경험담이 아니에요. 제 트레이딩 연습 앱 TradaZen의 순위표에 플레이어가 고른 닉네임이 표시되기 시작했을 때, 제가 실제로 구현한 것들을 보여드려요. 리젝 사유 전체를 훑어보고 싶다면 [Apple이 앱을 리젝하는 이유](https://devoria.fr/ko/blog/app-store-rejection-reasons-real-cases)를 먼저 읽어 보세요.

## 가이드라인 1.2는 무엇을 말하나요?

1.2 "User-Generated Content"는 [App Review Guidelines](https://developer.apple.com/app-store/review/guidelines/#user-generated-content)의 섹션 1 "Safety"에 있어요. 사용자 콘텐츠나 소셜 네트워킹 서비스가 있는 앱이 대상이에요. 악용을 막기 위해 이런 앱은 네 가지 보호 장치를 "must include", 즉 반드시 갖춰야 해요.

- "A method for filtering objectionable material from being posted to the app": **불쾌한 콘텐츠가 게시되기 전에 걸러내는 필터**.
- "A mechanism to report offensive content and timely responses to concerns": 콘텐츠를 신고하는 방법과 신고에 대한 빠른 대응.
- "The ability to block abusive users from the service": 악성 사용자를 차단하는 기능.
- "Published contact information so users can easily reach you": 쉽게 찾을 수 있는 공개 연락처.

2026년 6월 8일에 업데이트된 현재 버전은 한 걸음 더 나아가요. 규칙이나 여러분의 이용약관, 커뮤니티 규칙을 위반하는 콘텐츠를 삭제하는 건 여러분의 책임이라고 명시해요. Apple이 그런 콘텐츠를 발견하면 삭제와 함께 개선 계획을 요구하고, 그동안 앱을 내릴 수도 있어요.

가이드라인은 App Store에 어울리지 않는 앱도 나열해요. 주로 포르노, Chatroulette 같은 무작위 또는 익명 채팅, 실제 사람의 외모 평가, 협박이나 괴롭힘에 쓰이는 앱이에요. **이런 용도라면 네 가지 보호 장치로도 부족해요.** 1.2.1은 크리에이터 앱에 대한 규칙을 추가하는데, 특히 앱 등급을 넘는 콘텐츠에 대한 연령 확인이 있어요.

## 내 앱도 해당될까요?

App Store Connect의 연령 등급 설문이 좋은 기준을 줘요. 사용자가 만든 콘텐츠(동영상, 사진, 텍스트, 오디오)가 앱 안에서 널리 공유되면 [사용자 생성 콘텐츠](https://developer.apple.com/help/app-store-connect/reference/app-information/age-ratings-values-and-definitions)로 봐요. 사용자 간 메시지는 별도 항목으로 다뤄요.

| 다른 사람이 보는 것     | 해당 여부     |
| ----------------------- | ------------- |
| 회원 간 메시지          | 예            |
| 공개 사진이나 리뷰      | 예            |
| 순위표의 닉네임         | 예, 제 생각엔 |
| 비공개 메모             | 아니요        |
| 개발자가 직접 쓴 콘텐츠 | 아니요        |

Apple은 닉네임을 언급하지 않아요. 그래도 저는 닉네임을 사용자 콘텐츠로 취급해요. 누구나 모욕적인 닉네임을 고를 수 있고, 다른 플레이어가 그걸 보니까요. TradaZen 순위표에서 제가 내린 선택이에요.

## Expo와 Supabase로 구현할 5가지 장치

2025년 말 한 개발자가 [Apple 포럼](https://developer.apple.com/forums/thread/807358)에 공개한 1.2 리젝 메시지에는 기대하는 조치가 나열돼 있어요. 첫 항목은 "Require that users agree to terms (EULA)"이고, 마지막은 기한 요구사항이에요. 신고에 대해 "within 24 hours" 안에 콘텐츠를 삭제하고 작성자를 퇴출하라는 거예요.

| 장치          | 구현 위치             |
| ------------- | --------------------- |
| 이용약관 동의 | 화면과 프로필         |
| 필터          | 서버, 표시 전         |
| 신고          | 버튼과 테이블         |
| 차단          | 테이블과 접근 규칙    |
| 공개 연락처   | 앱과 App Store 페이지 |

아래 SQL 예시는 여러분의 스키마에 맞게 수정해서 쓰세요. [Supabase의 행 단위 보안 규칙](https://supabase.com/docs/guides/database/postgres/row-level-security)을 기반으로 하는데, 누군가 앱을 우회하더라도 적용돼요.

### 1. 악용을 용납하지 않는 이용약관 동의

이용약관에 불쾌한 콘텐츠와 악성 사용자를 일절 용납하지 않는다고 분명히 적어야 해요. 조항 예시예요. 법률 자문이 아니니 꼭 검토를 받으세요. "모욕적, 혐오적, 성적이거나 괴롭히는 콘텐츠는 일절 허용되지 않습니다. 신고된 콘텐츠는 사전 통보 없이 삭제될 수 있으며 작성자는 퇴출될 수 있습니다."

**가입 버튼 아래의 수동적인 문구 한 줄은 동의의 증거가 되지 못해요. 명시적인 동작을 요구하세요.** 첫 게시 전에 이용약관 링크와 "동의합니다" 버튼이 있는 화면을 띄우세요. 동의한 날짜와 버전을 프로필에 저장하고, 그게 없으면 게시를 막으세요.

```sql
create policy "publier après les CGU" on public.posts
for insert to authenticated
with check (
  auth.uid() = author_id
  and exists (
    select 1 from public.profiles p
    where p.id = auth.uid() and p.cgu_acceptees_le is not null
  )
);
```

### 2. 다른 사람이 보기 전에 거르는 필터

앱 코드는 우회될 수 있으니 필터는 서버에 있어야 해요. 앱 안의 사본은 사용자에게 즉시 알려주는 용도일 뿐이에요.

TradaZen에서는 데이터베이스 함수가 모든 닉네임을 검사하고, 앱도 같은 목록으로 플레이어에게 미리 알려줘요. 저는 두 목록을 똑같이 유지해요. 서버에서는 모욕적인 닉네임을 저장 단계에서 거부하지 않아요. **표시할 때 중립적인 닉네임으로 바꿔서, 오탐 때문에 누군가를 막는 일을 피해요**.

오탐은 금방 생겨요. TradaZen의 첫 번째 필터는 Dominique, Monique, Véronique 같은 이름을 검열했어요. 비속어 일부가 들어 있었거든요. 해결책은 단어 일부가 아니라 단어 전체를 찾는 거였어요. 그리고 앱을 일본어와 중국어로도 판매하니까 필터도 이 언어들을 다뤄요.

### 3. 24시간 안에 처리하는 신고

게시된 모든 콘텐츠에 "신고" 버튼을 달아요. TradaZen에서는 리그 순위표에서 신고된 닉네임이 신고한 사람의 휴대폰에서 즉시 중립적인 이름으로 표시돼요. 그다음 신고가 서버로 전송되고, 휴대폰이 오프라인이면 나중에 다시 보내져요.

데이터베이스에는 신고 테이블을 두고, 사람과 콘텐츠당 신고는 한 번만 받아요.

```sql
create table public.reports (
  id uuid primary key default gen_random_uuid(),
  reporter_id uuid not null references auth.users (id) on delete cascade,
  target_id uuid not null,
  reason text,
  created_at timestamptz not null default now(),
  unique (reporter_id, target_id)
);
alter table public.reports enable row level security;
create policy "mes signalements" on public.reports
for insert to authenticated
with check (auth.uid() = reporter_id);
```

TradaZen에서는 **여러 플레이어가 신고한 닉네임이 중립적인 닉네임으로 바뀌고**, 신고 내역은 신고당한 사람에게 절대 보이지 않아요. 일반적인 주의사항이 하나 있어요. 신고에 쓰이는 식별자를 콘텐츠 작성자가 바꿀 수 있으면 안 돼요. 그러면 숨김 처리를 피해 갈 수 있거든요.

자동 숨김이 여러분의 판단을 대신하지는 않아요. 24시간을 지키려면 신고가 들어올 때마다 알림을 받으세요. [Supabase 데이터베이스 웹훅](https://supabase.com/docs/guides/database/webhooks)으로 서버 함수를 호출해 메시지를 보내게 할 수 있어요. 콘텐츠를 삭제할 수 있는 키는 서버에 두세요. [Expo 앱의 비밀 API 키](https://devoria.fr/ko/blog/expo-app-secret-api-key-security)에서 설명했어요.

### 4. 즉시 작동하는 차단

차단 테이블을 만들고, 차단한 사람의 피드에서 차단된 사람의 콘텐츠를 빼는 접근 규칙을 추가해요.

```sql
create policy "sans les bloqués" on public.posts
for select to authenticated
using (
  not exists (
    select 1 from public.blocks b
    where b.blocker_id = auth.uid() and b.blocked_id = posts.author_id
  )
);
```

TradaZen에서는 코드로 친구를 추가하고, 친구를 삭제하고 차단할 수 있어요. **차단된 친구는 다시 요청을 보내도 목록에서 사라진 상태로 남아요.**

### 5. 쉽게 찾을 수 있는 공개 연락처

앱 설정에 연락처 이메일을 넣고, App Store Connect에는 실제로 응답하는 지원 URL을 넣으세요. TradaZen에서는 지원 이메일이 개인정보 처리방침과 이용약관에 있어요. 이 페이지들에 들어가야 할 내용은 [앱 개인정보 처리방침](https://devoria.fr/ko/blog/ios-app-privacy-policy-guide)에 정리했어요.

마지막으로, 계정을 삭제한 사람의 콘텐츠를 어떻게 할지 정하세요. 위의 `on delete cascade`는 계정과 함께 그 사람의 신고 내역을 삭제해요. 전체 방법은 [iOS 계정 삭제](https://devoria.fr/ko/blog/ios-app-account-deletion-test-before-apple-review)에 있어요.

## TradaZen이 개인정보 처리방침에 적은 내용

이 장치들은 TradaZen 개인정보 처리방침에 공개적으로 설명돼 있어요. 리그와 친구 기능이 추가된 2026년 9월에 보완했어요. "닉네임은 자동 필터를 거칩니다. 순위표에서 부적절한 닉네임을 신고할 수 있고, 친구를 삭제하고 차단할 수 있습니다." 같은 방침에는 이메일과 일지가 다른 플레이어에게 절대 보이지 않는다는 내용도 있어요. 앱의 배경은 [TradaZen 사례 연구](https://devoria.fr/ko/blog/tradazen-case-study-launch-iphone-app)에서 볼 수 있어요.

## 1.2 리젝 후 Apple에 어떻게 답할까요?

답변과 리뷰 노트에 각 장치를 어디서 찾을 수 있는지 리뷰어에게 알려주세요. 이 기능들은 앱 안에 있어요. 리뷰어는 빌드에 포함된 코드를 테스트하니까 새 빌드를 준비하세요. [App Review에 답하는](https://developer.apple.com/help/app-store-connect/manage-submissions-to-app-review/reply-to-app-review-messages/) 절차는 다른 규칙과 같아요. 영어 템플릿을 드릴게요. 여러분 앱에서 사실인 내용만 남기고 수정해서 쓰세요.

```text
Hello,

Thank you for your review. Build X includes the precautions
listed in Guideline 1.2:

- Terms: users accept our terms, with zero tolerance for
  objectionable content and abusive users, before posting.
- Filter: posts and usernames are checked on our server
  before other users can see them.
- Report: tap "..." on any post, then "Report".
- Block: tap "..." on any post, then "Block user". Their
  content disappears immediately.
- Reports notify us instantly; we act on them within 24 hours.
- Contact: Settings > Contact us, and our support URL.

Best regards,
```

빌드에 장치가 하나라도 빠져 있으면 답변만으로는 부족해요. [가이드라인 2.1](https://devoria.fr/ko/blog/guideline-2-1-app-store-rejection-fix)과 마찬가지로 Apple은 손에 쥔 빌드로 판단해요.

## 제출 전 1.2 체크리스트

- 사용자가 게시하고 다른 사람이 보는 모든 것을 닉네임까지 포함해 목록으로 정리했어요.
- 이용약관이 불쾌한 콘텐츠와 악용을 금지하고, 앱이 명시적인 "동의합니다"를 요구해요.
- 필터가 서버에서 돌아가고, 단어 전체를 찾고, 스토어 페이지의 언어를 모두 다뤄요.
- 모든 콘텐츠에 "신고" 버튼이 있고, 신고가 들어오면 즉시 알림을 받아요.
- 24시간 안에 콘텐츠를 삭제하고 작성자를 퇴출할 수 있어요.
- 사용자를 차단하면 그 사람의 콘텐츠가 즉시 사라져요.
- 앱 안에 연락처 이메일이 보이고, 지원 URL이 응답해요.
- 연령 등급 설문에 사용자 콘텐츠를, 그리고 앱에 메시지 기능이 있다면 그것도 신고했어요.
- 리뷰 노트에 각 장치의 위치와 데모 계정을 적었어요.

## 앱을 다시 제출하기 전에 리젝 해결하기

앱이 방금 1.2로 리젝됐다면, [Review Kit](https://devoria.fr/ko/kits/app-review)에 제가 매번 제출 전에 확인하는 내용을 모아 뒀어요. Claude Code에서 프로젝트를 검토하고 Apple이 리젝하면 답변을 준비해 주는 스킬 두 개도 들어 있어요. 사람의 시선이 필요하다면 [저와 1시간 상담을 예약하세요](https://devoria.fr/ko/coaching). 메시지를 함께 읽고 모더레이션 흐름을 살펴봐요. 리젝 후 전체 대응 방법은 [Apple에 리젝된 앱](https://devoria.fr/ko/expertise/app-rejected-by-apple) 페이지에 있어요.

첫 출시를 준비 중이라면 [무료 진단을 받아 보세요](https://devoria.fr/ko/diagnostic). 어떤 단계부터 시작해야 할지 알려주고, 제 Apple 리젝 방지 체크리스트도 보내 드려요.

Apple이 앱을 승인할 거라고 아무도 보장할 수 없어요. 그래도 이 다섯 가지 장치를 잘 보이게 갖추면 적어도 이 리젝 사유는 목록에서 지울 수 있어요.

## 자주 묻는 질문

### "Guideline 1.2 - Safety - User-Generated Content"는 무슨 뜻인가요?

Apple 메시지에 적힌 리젝 사유의 제목이에요. 앱이 사용자가 만든 콘텐츠를 보여주면서 기대되는 보호 장치(필터, 빠르게 처리되는 신고, 차단, 공개 연락처, 이용약관 동의)를 모두 갖추지 않았다는 뜻이에요.

### 순위표의 닉네임도 사용자 콘텐츠로 보나요?

Apple 가이드라인에는 나와 있지 않아요. 저는 사용자 콘텐츠로 취급해요. 닉네임은 자유롭게 고를 수 있고 다른 플레이어가 보니까요. TradaZen에서는 순위표 닉네임이 필터를 거치고, 신고할 수 있으며, 문제가 있으면 중립적인 닉네임으로 바뀌어요.

### 신고를 정말 24시간 안에 처리해야 하나요?

Apple 리젝 메시지가 요구하는 내용이에요. 규칙 본문은 빠른 대응이라고 표현해요. 그러니 자동 필터만으로는 부족하고, 콘텐츠를 삭제하고 작성자를 퇴출하는 사람이 있어야 해요. 여러 번 신고된 콘텐츠를 자동으로 숨기면 그사이 버티는 데 도움이 돼요.

### 이용약관 동의를 앱 안에서 받아야 하나요?

가장 안전한 방법이에요. 리젝 메시지는 불쾌한 콘텐츠와 악성 사용자를 용납하지 않는 약관에 사용자가 동의하도록 요구해요. 페이지 하단의 링크는 동의의 증거가 되지 못해요. 첫 게시 전에 "동의합니다" 버튼이 있는 화면을 띄우면 의심의 여지가 없어요.

### 익명 채팅 앱이 가이드라인 1.2를 통과할 수 있나요?

현재 가이드라인은 무작위 또는 익명 채팅을 App Store에 어울리지 않는 용도로 꼽아요. 주로 그런 용도로 쓰이는 앱은 필터, 신고, 차단을 갖췄더라도 사전 통보 없이 내려질 수 있어요.


## 내 프로젝트

[Review Kit](https://devoria.fr/ko/kits/app-review): 제 App Store 심사 체크리스트, 수정해서 통과한 Apple 리젝 사례, Google Play 체크리스트, Claude Code 스킬 3개를 담았어요. ₩73,000.

[iOS & Android Kit](https://devoria.fr/ko/kits/ios): Claude Code로 iPhone·Android 앱을 만들어 보세요. 제 앱들의 시작 코드, 스토어 출시까지의 과정, 모든 키트를 담았어요. ₩148,000.

[진단: 내 아이폰 앱까지 남은 거리](https://devoria.fr/ko/diagnostic): 7개 질문, 60초. 아이폰 앱 출시를 진짜 가로막는 게 뭔지, 4단계 로드맵, 나에게 맞는 키트까지 알려드려요.
