MotionStitch Lite는 사용자가 만든 영상을 자신의 YouTube 채널에 업로드하는 기능을 제공한다. 이를 위해 OAuth 2.0 권한 범위 https://www.googleapis.com/auth/youtube을 요청한다.
| 분류 | 예시 | 검증 요구 |
|---|---|---|
| 비민감 (Non-sensitive) | profile, email | 없음 |
| 민감 (Sensitive) | auth/youtube, gmail.modify | OAuth 검증 필요 (우리 케이스) |
| 제한 (Restricted) | gmail.readonly, drive.readonly | OAuth 검증 + CASA 보안 평가 (Tier에 따라 외부 평가 비용 발생 가능) |
검증 신청 직전까지 다음을 모두 갖춰야 한다.
agritool-dev.github.io)index.html) — 앱 소개privacy.html) — 수집·처리 정보, 권한 사용 내역, OAuth 스코프 사용 명시 필수terms.html) — 사용 조건, 책임 제한 등 권장OAuth 동의 화면에 등록할 도메인은 Google Search Console에서 사전 인증되어야 한다.
search.google.com/search-console → 좌측 상단 "속성 추가" → "URL 접두어" 선택
예: https://agritool-dev.github.io/MotionStitch_Lite/ (끝에 슬래시 포함)
가장 확실한 방법. Google이 제공하는 google[해시].html 파일을 다운로드.
다운로드한 파일을 docs/ 폴더 루트에 그대로 두고 git commit + push. GitHub Pages에 자동 배포됨 (1~2분 소요).
배포 완료 후 Search Console 인증 화면에서 "확인" 클릭. "소유권이 확인되었습니다" 메시지가 뜨면 성공.
Google Cloud Console → "Google 인증 플랫폼" → 좌측 메뉴 브랜딩.
| 필드 | 입력값 예시 | 비고 |
|---|---|---|
| 앱 이름 | 모션스티치 | 동의 화면 상단에 표시 |
| 사용자 지원 이메일 | agritool@gmail.com | 사용자가 문의할 이메일 |
| 앱 로고 | app_icon_512.png (정사각형) | 120x120 이상, 1MB 이하, JPG/PNG/BMP |
| 애플리케이션 홈페이지 | https://agritool-dev.github.io/MotionStitch_Lite/ | 홈페이지 URL |
| 애플리케이션 개인정보처리방침 링크 | https://agritool-dev.github.io/MotionStitch_Lite/privacy.html | 필수 |
| 애플리케이션 서비스 약관 링크 | https://agritool-dev.github.io/MotionStitch_Lite/terms.html | 권장 (없으면 동의 화면에 안내 문구 노출) |
| 승인된 도메인 | agritool-dev.github.io | Search Console 인증된 호스트명만 (스킴/경로 제외) |
| 개발자 연락처 이메일 | agritool@naver.com | Google이 검증 관련 메일 발송하는 주소 |
Google Cloud Console → 좌측 메뉴 데이터 액세스.
앱 코드가 실제로 요청하는 OAuth 스코프와 콘솔에 등록된 스코프가 완전히 일치해야 한다. 불일치 시 검증 단계에서 반려된다.
// lib/services/youtube_auth.dart static const List<String> scopes = [ 'https://www.googleapis.com/auth/youtube', ];
YouTube 관련 스코프 사용 시 다음 표를 참고해 꼭 필요한 최소 스코프만 등록한다.
| 스코프 | 가능 작업 | 불가능 작업 |
|---|---|---|
youtube.upload |
영상 업로드 (videos.insert) | 재생목록 생성/수정, 채널 정보 조회 |
youtube.readonly |
채널/재생목록/영상 메타 조회 | 모든 쓰기 작업 |
youtube (전체) |
업로드 + 재생목록 생성/추가 + 메타 조회 + 삭제 | — |
playlists.insert + playlistItems.insert가 필수. 이를 위해 youtube 전체 스코프가 최소 필요 스코프다.
auth/youtube) 체크박스 선택. 목록에 없으면 하단 "범위 수동 입력" 필드에 URL 형태로 입력youtube.upload, youtube.readonly) 체크 해제Google Cloud Console → 대상 메뉴.
Google 검증 심사관에게 앱이 OAuth 스코프를 어떻게 사용하는지 시각적으로 증명하는 영상.
| # | 요소 | 심사관 확인 포인트 |
|---|---|---|
| 1 | OAuth Client ID | 검증 신청한 앱과 영상이 동일한 앱인지 매칭 |
| 2 | 앱 실행 → 동의 화면 진입 | OAuth 흐름 시작 시점 |
| 3 | 동의 화면에서 요청 스코프 표시 | 요청 권한이 명확히 표시되는지 |
| 4 | 사용자가 권한 동의 + 진행 | UI 흐름이 정상 |
| 5 | 실제 API 호출이 동작하는 모습 | 요청한 스코프가 실제로 쓰이는지 — 핵심 |
| 6 | 결과물이 사용자 본인 계정에 반영된 모습 | 제3자 데이터 접근 아님을 증명 |
auth/youtube 권한 항목 표시(예: "YouTube 계정 보기, 수정, 삭제") + 체크박스 체크 + [계속]| 항목 | 입력값 |
|---|---|
| 제목 | App Name — OAuth Verification Demo |
| 공개 설정 | 미등록(Unlisted) — URL 가진 사람만 접근. 일반 검색 노출 안 됨 |
| 설명 | 아래 템플릿 참조 |
Demo video for Google OAuth API verification. App: [앱 이름] Package: [패키지명] OAuth Client ID: [전체 Client ID].apps.googleusercontent.com Scope requested: https://www.googleapis.com/auth/youtube Privacy Policy: [개인정보처리방침 URL] Terms of Service: [약관 URL] This video shows: - App generates output (no scope used) - User taps the OAuth-triggering action - OAuth consent screen displays the requested scope - App calls [API 1, API 2, ...] on user's own account - Result on YouTube: data appears in user's own account All operations are performed on the authenticated user's own YouTube account. No third-party data is accessed. No backend server. OAuth tokens are stored only in the device's OS secure keystore.
Google Cloud Console → 인증 센터 → Data access status 카드의 Prepare for verification 버튼.
| 필드 | 설명 |
|---|---|
| 범위가 어떤 방식으로 사용되나요? | 요청 스코프의 사용 사유 (justification). 1000자 제한, 영문 권장 (심사 속도) |
| YouTube 링크 (데모 동영상) | 위 Step 5에서 업로드한 영상 URL |
| 추가 정보 | Play Store 링크, 테스트 계정, 관련 프로젝트 ID 등 (1000자, 선택) |
mine=true 등)제출하여 확인받기 버튼 누르면 설문지 등장. 일반 소비자용 공개 앱 기준 답변:
| 질문 | 답 |
|---|---|
| 개인적인 용도로만 사용되나요? | 아니요 |
| 내부 전용인가요? | 아니요 |
| 개발/테스트/스테이징 용도인가요? | 아니요 |
| WordPress Gmail SMTP 플러그인인가요? | 아니요 |
체크박스 2개 (인증 요구사항 확인 + CASA 이해) 모두 체크 후 제출하여 확인받기 클릭.
인증 센터 → "인증 진행 상황 보기"에서 단계별 상태 확인 가능.
| 시점 | 일어나는 일 |
|---|---|
| 제출 즉시 | 자동 단계 1~2개 통과, 인증 진행 상황 표시 |
| 3~5일 | Google 신용안전팀의 첫 자동 응답 메일 |
| 1~6주 | 심사 완료 (승인 / 추가 정보 요청 / 반려) |
위 변경은 심사를 처음부터 다시 시작시킬 수 있다.
| 결과 | 대응 |
|---|---|
| 승인 (Approved) | "확인되지 않은 앱" 경고 사라짐. 작업 종료. |
| 추가 정보 요청 | 메일 내용 확인 후 보완 자료 답신. 영상 보완·정당화 보강 등. |
| 반려 (Rejected) | 사유 분석 후 문제 해결 → 재신청. 흔한 사유: 데모 영상 불충분, 정당화 텍스트 부실, 스코프 과다 요청. |
증상: 브랜딩 페이지 하단에 "누락된 도메인: xxx.com" 표시.
원인: 해당 도메인이 Search Console에서 인증되지 않음.
해결: Step 1 (Search Console 도메인 인증)을 먼저 완료.
증상: "Prepare for verification" 버튼이 회색이고 클릭 안 됨.
원인: 브랜딩이 아직 인증되지 않았거나 게시 상태가 "테스트 중".
해결: Step 2 (브랜딩) + Step 4 (프로덕션 전환) 먼저 완료.
증상: 폼에 붙여넣었는데 카운터가 빨갛게 1000자 초과.
해결: 영문은 한국어보다 짧게 쓸 수 있음. 각 API 호출 설명을 한 줄로 압축. 군더더기 어휘 제거.
해결:
해결: 데모 영상 촬영 전에 myaccount.google.com/permissions에서 앱의 액세스 권한 삭제. 그러면 다시 로그인 시 동의 화면이 새로 표시됨.
증상: 코드는 auth/youtube를 요청하는데 콘솔에는 youtube.upload+youtube.readonly만 등록.
해결: 둘을 일치시킨다. 일반적으로 콘솔을 코드에 맞춰 조정 (Step 3).
MotionStitch Lite가 2026-05-05에 제출한 검증 신청의 핵심 데이터. 향후 재신청 또는 다른 앱 신청 시 참고용.
| 앱 이름 | 모션스티치 |
| 패키지명 (Android) | com.agritool.motion_stitch_lite |
| 요청 스코프 | https://www.googleapis.com/auth/youtube |
| 스코프 분류 | 민감 (Sensitive). CASA 불필요 |
| Cloud Project ID | 916828115892 |
| OAuth 클라이언트 (검증 대상) | Android - Play Signing |
| OAuth Client ID (전체) | 916828115892-3kaju9rc1t47dj57af74b467sejt668l.apps.googleusercontent.com |
| 승인된 도메인 | agritool-dev.github.io |
| 지원 이메일 | agritool@gmail.com |
| 담당자 이메일 | agritool@naver.com |
| 제출한 데모 영상 | https://youtube.com/shorts/V25azszjEvw (YouTube Shorts, 공개) |
MotionStitch Lite is a free mobile app that generates highlight videos from a user's motion photos and uploads them to the user's own YouTube channel. auth/youtube is required for these calls on the user's own account: 1. videos.insert — upload the generated video to the user's channel 2. channels.list(mine=true) — confirm upload target is user's own channel 3. playlists.list(mine=true) — show user's existing playlists for selection 4. playlists.insert — create a new playlist on user's request 5. playlistItems.insert — add the uploaded video to the chosen playlist Narrower scopes are insufficient: youtube.upload cannot create playlists or add items, but our 'auto-add to playlist' feature requires playlists.insert and playlistItems.insert. The app accesses no other user data (comments, history, subscriptions). No backend server; OAuth tokens stored only in the device's OS keystore.
전체 심사 완료까지 최대 4~6주, 첫 자동 응답 메일은 3~5일 내 도착 예정.