بنقرة واحدة
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 모드 섹션 갱신