一键导入
toss-mock-auth-ops
Toss Mock 인증 스킬 — stable userKey 설정, survey 루프 근본 원인 진단, adb 기반 진단 순서를 표준화한 스킬.
用 Codex 或 Claude 帮你安装 复制这段 Prompt,粘贴到 Codex、Claude 或其他助手里,让它检查 Skill 页面并帮你完成安装。
菜单
Toss Mock 인증 스킬 — stable userKey 설정, survey 루프 근본 원인 진단, adb 기반 진단 순서를 표준화한 스킬.
用 Codex 或 Claude 帮你安装 复制这段 Prompt,粘贴到 Codex、Claude 或其他助手里,让它检查 Skill 页面并帮你完成安装。
基于 SOC 职业分类
Toss IAP 검증 스킬 — Edge Function 404 우회, Service Role 감지, mTLS mock 설정, 토큰 헬퍼 분리, subscriptions 활성화 E2E.
Toss 수익화 운영 스킬 — Ads/IAP/TossPay 콘솔 설정, 샌드박스 시나리오, QA 증적 수집을 표준화.
AIT .ait 번들 빌드 → 콘솔 업로드 → 테스트 진입 성공 패턴. env var 인라인 실패(supabase url is required), babel/esbuild 충돌, __dirname 경로 문제 해결책 포함.
FastAPI + SQLAlchemy + Supabase 모델 작성 규칙 — DB 타입 불일치 방지, async cascade 패턴, Pydantic enum 검증. 2026-05-19 E2E 테스트(Wave 1~9)에서 발견한 BUG-01~05 재발 방지 지침.
TaillogToss 로컬 개발 서버(Metro + FastAPI) 시작/재시작 절차. "서버 켜줘", "서버 재시작", "앱 안됨", "번들 안됨" 등 서버 기동 관련 모든 상황에 사용한다.
TaillogToss Phase 13 게이트 운영 — AUTH/IAP/MSG/AD E2E 기준 점검, 증적 수집, 문서 상태 동기화.
| name | toss-mock-auth-ops |
| description | Toss Mock 인증 스킬 — stable userKey 설정, survey 루프 근본 원인 진단, adb 기반 진단 순서를 표준화한 스킬. |
Toss 미니앱 개발 단계에서 mock 모드 인증이 survey 루프에 빠질 때 안정적인 userKey 고정, 근본 원인 진단, adb 기반 트러블슈팅을 표준화한 스킬.
https://developers-apps-in-toss.toss.im/login/intro.htmlhttps://developers-apps-in-toss.toss.im/bedrock/reference/framework/https://supabase.com/docs/guides/authhttps://developer.android.com/tools/adbMockMTLSClient.fetchLoginProfile이 새로운 authorization code 생성dogs 테이블이 비어있는 상태로 onboarding 반복 진입근본 원인: Mock 클라이언트가 매번 다른 userKey를 반환하므로 Toss 로그인 → Supabase Auth 연동 시 매번 새로운 사용자로 인식
File: supabase/functions/_shared/mTLSClient.ts
Line: 350-358
// 수정 전 (문제 있는 코드)
class MockMTLSClient {
async fetchLoginProfile(authorizationCode: string) {
// ❌ 문제: authorizationCode를 userKey로 사용 → 매번 다른 값
return {
userKey: authorizationCode, // 이게 문제!
userName: 'Mock User',
profileImageUrl: 'https://...',
};
}
}
// 수정 후 (안정적인 코드)
class MockMTLSClient {
async fetchLoginProfile(authorizationCode: string) {
console.log('[Mock Auth] Stable userKey 반환');
// ✅ 해결: 고정값 반환 (authCode 무시)
return {
userKey: 'mock_stable_user_001', // 고정값!
userName: 'Mock User',
profileImageUrl: 'https://example.com/mock-profile.png',
email: 'mockuser@example.com',
};
}
// 추가: 현재 mock 상태 확인
isMockMode(): boolean {
return true;
}
}
File: supabase/functions/login-with-toss/main.ts
// mTLS 클라이언트 선택
const mtlsClient = new MockMTLSClient(); // mock 개발 환경
// 로그인 플로우
async function handleTossLogin(authorizationCode: string) {
const profile = await mtlsClient.fetchLoginProfile(authorizationCode);
console.log('[Login] userKey:', profile.userKey); // "mock_stable_user_001" 확인
// Supabase 사용자 생성/업데이트
const { data, error } = await supabase.auth.signUpWithPassword({
email: profile.email,
password: 'mock_password', // mock 환경에서만 사용
});
return data.user;
}
# Edge Function 재배포
supabase functions deploy login-with-toss
# 또는 로컬에서 즉시 확인
supabase start
# 로그 확인
supabase functions logs login-with-toss
supabase/functions/_shared/mTLSClient.ts 수정userKey = 'mock_stable_user_001' 고정값 반환 확인survey 루프가 반복되는 원인은 3가지로 좁혀집니다:
Survey 루프 발생
↓
1. User ID 변경 감지? → Mock userKey 불안정 (패턴 1 해결)
↓
2. Dogs 테이블 비어있음? → Onboarding 미완료 (아래 진단)
↓
3. AuthContext 상태 오류? → 프론트엔드 로직 버그 (아래 진단)
목표: 현재 로그인한 사용자의 dogs 데이터 확인
# 1. Supabase 대시보드 → SQL Editor 열기
# 또는 CLI에서:
supabase postgres connect
# 2. Service Role로 dogs 조회
select * from dogs where user_id = 'mock_stable_user_001';
# 3. 결과 해석:
# ✅ 빈 결과 없음 → dogs 테이블에 데이터 있음 (프론트엔드 버그)
# ❌ 빈 결과 → onboarding 미완료 (백엔드 진단 필요)
# ❌ 조회 실패 → RLS 정책 오류
File: src/features/auth/AuthContext.tsx
Function: getHasCompletedOnboarding
Line: ~52
// 현재 구현 (확인 필요)
export async function getHasCompletedOnboarding(userId: string): Promise<boolean> {
const { data, error } = await supabase
.from('dogs')
.select('id')
.eq('user_id', userId)
.limit(1);
if (error) {
console.error('[Auth] Dogs query error:', error);
return false; // 안전한 기본값
}
// data가 비어있으면 onboarding 미완료
const hasCompletedOnboarding = (data?.length ?? 0) > 0;
console.log('[Auth] hasCompletedOnboarding:', hasCompletedOnboarding);
console.log('[Auth] userId:', userId);
console.log('[Auth] dogs count:', data?.length);
return hasCompletedOnboarding;
}
// 추가 진단: 호출 시점과 user_id 확인
useEffect(() => {
const checkOnboarding = async () => {
const session = await supabase.auth.getSession();
const userId = session?.user?.id;
console.log('[Auth] Session userId:', userId);
console.log('[Auth] Checking onboarding...');
if (userId) {
const completed = await getHasCompletedOnboarding(userId);
console.log('[Auth] Onboarding completed:', completed);
}
};
checkOnboarding();
}, []);
| 증상 | 확인 사항 | 원인 | 해결책 |
|---|---|---|---|
| 매번 새 user 생성 | Supabase Users 테이블에 user 2개+ | Mock userKey 불안정 | 패턴 1: userKey 고정값 |
| survey만 반복 | Supabase dogs 테이블 비어있음 | Onboarding 미저장 | 백엔드 onboarding router 검증 |
| survey → dashboard 진입 후 다시 survey | dogs 테이블에 데이터 있음 | AuthContext 상태 오류 | 프론트엔드 useEffect 의존성 검증 |
| 모든 화면이 로딩 상태 | FastAPI 또는 Edge Function 응답 없음 | 서버 다운 | /api/health 엔드포인트 확인 |
/private/tmp/fastapi8765.log)supabase functions logs)# adb 설치 확인
adb version
# 디바이스 연결 확인
adb devices
# 예상 출력:
# List of attached devices
# emulator-5554 device
# React Native 로그 확인
adb logcat -d | grep -i "ReactNativeJS\|error\|exception"
# 더 자세한 로그 (실시간)
adb logcat -s ReactNativeJS
# 특정 문자열 필터링
adb logcat -d | grep "onboarding\|survey\|login"
# 로그 파일로 저장
adb logcat -d > device_logs.txt
확인 사항:
# FastAPI 서버 로그 파일
tail -f /private/tmp/fastapi8765.log
# 구독 API 호출 확인
grep "verify\|subscription" /private/tmp/fastapi8765.log
# 에러만 필터링
grep "error\|Error\|ERROR" /private/tmp/fastapi8765.log
# 마지막 50줄
tail -n 50 /private/tmp/fastapi8765.log
확인 사항:
/api/v1/subscription/iap/verify 호출 기록# Supabase CLI로 PostgreSQL 접속
supabase postgres connect
# 현재 users 목록 (service role)
select id, email, created_at from auth.users;
# 현재 dogs 목록
select id, user_id, name, breed from public.dogs order by created_at desc;
# Specific user의 dogs 조회
select * from public.dogs where user_id = 'mock_stable_user_001';
# Onboarding 상태 확인 (survey_completed 컬럼이 있다면)
select user_id, survey_completed, updated_at from public.onboarding_state;
# 로컬 Supabase 서버에서 Edge Function 호출 테스트
curl -X POST http://localhost:54321/functions/v1/login-with-toss \
-H "Authorization: Bearer <LOCAL_SUPABASE_JWT>" \
-H "Content-Type: application/json" \
-d '{
"authorizationCode": "test_code_123",
"clientId": "mock_client"
}'
# Verify IAP 함수 테스트
curl -X POST http://localhost:54321/functions/v1/verify-iap-order \
-H "Authorization: Bearer <LOCAL_SUPABASE_JWT>" \
-H "Content-Type: application/json" \
-d '{
"receipt": "test_receipt",
"userId": "mock_stable_user_001"
}'
확인 사항:
# 모든 네트워크 요청 추적 (tcpdump)
# macOS에서 Android 에뮬레이터 트래픽 캡처:
tcpdump -n -i bridge0 | grep -E "53|443|8765"
# 또는 adb 네트워크 모니터링
adb shell dumpsys connectivity
adb logcat에서 [Auth] Session userId: <id> 확인supabase postgres connect → select * from dogs; 1개 이상의 행 확인adb logcat에서 [Auth] hasCompletedOnboarding: false 확인 가능/api/v1/onboarding 호출 기록adb logcat에서 [Auth] hasCompletedOnboarding: true 확인/api/v1/subscription/iap/verify 호출{"success": true} 또는 오류 코드subscriptions 테이블 업데이트 확인emulator -avd <name> 실행adb logcat -s ReactNativeJS:V *:Sps aux | grep uvicornsupabase projects listsupabase start 재실행Mock userKey 안정화 (패턴 1)
mTLSClient.ts 고정값 적용근본 원인 진단 (패턴 2)
adb 기반 트러블슈팅 (패턴 3)
개선 항목 기록
docs/PROJECT-STATUS.md 업데이트docs/status/PROJECT-STATUS.md → "진단 완료" 기록docs/status/MISSING-AND-UNIMPLEMENTED.md → "완료" 표시docs/ref/AIT-SDK-2X-MIGRATION.md → mock 모드 섹션 갱신