콘텐츠로 건너뛰기
supastack
문서 둘러보기
웹Next.js

For AI agents: fetch the complete documentation index at /llms.txt, the full documentation corpus at /llms-full.txt, the agent skill at /skill.md, or this page as Markdown at /ko/docs/web/apple-sign-in.md (or send Accept: text/markdown).

Apple 로그인 추가

Apple Developer 포털에서 App ID, Services ID, Sign in with Apple 키를 등록하고 클라이언트 쌍을 앱에 연결합니다.

이 가이드에 대해 질문하기
다음에서 열기

초보자 연습

전제 조건: 로컬에서 실행 중인 웹 앱(5분 만에 출시), 실제 계정용 마이그레이션된 데이터베이스(데이터베이스 설정), 그리고 Apple Developer Program 멤버십—모바일 계정 가이드가 등록하는 것과 동일한 연간 $99 계정이므로, 아직 완료하지 않았다면 여기를 계속하기 전에 그 단계를 완료하세요. 아래 개발자 포털의 모든 작업은 추가 비용이 없습니다.

중요한 이유: iOS 앱이 Google이나 GitHub 같은 타사 소셜 로그인을 제공할 때마다 App Store 심사는 Sign in with Apple을 요구하며, 웹에서도 마찰이 적은 훌륭한 버튼입니다—Apple 사용자는 기기에 이미 있는 계정으로 로그인합니다.

용어 정리: App ID는 앱의 등록 식별자(com.yourcompany.yourapp)입니다. Services ID는 Apple이 웹 및 서버 로그인을 위해 발급하는 두 번째 식별자로, 이것이 클라이언트 ID가 됩니다. 리턴 URL은 Apple이 로그인한 사용자를 다시 보낼 수 있는 정확한 주소—킷의 Better Auth 콜백입니다. 시크릿 키는 Apple이 한 번만 제공하는 .p8 파일로, 이를 직접 클라이언트 시크릿으로 변환합니다.

1. Sign in with Apple 기능이 있는 App ID를 등록합니다. 2. 그것을 가리키고 도메인과 리턴 URL을 보유하는 Services ID를 등록합니다. 3. Sign in with Apple 키를 만들고 .p8 파일을 다운로드합니다. 4. 키를 클라이언트 시크릿 JWT로 변환하고 세 가지 env 값을 설정합니다.

솔직한 제한: Apple의 리턴 URL은 등록된 도메인의 절대 https:// 주소여야 합니다—localhost와 일반 http는 거부되므로 베어 로컬 서버에서는 버튼을 완전히 시험할 수 없습니다. 배포된 URL에서 확인하거나, https 터널(예: cloudflared tunnel 또는 ngrok)을 통해 로컬 서버를 노출하고 테스트하는 동안 터널 도메인과 그 콜백을 등록하세요.

App ID 등록

1. developer.apple.com/account를 열고 Developer Program 멤버십을 보유한 계정으로 로그인합니다.

2. Certificates, Identifiers & Profiles → Identifiers를 열고 파란색 + 버튼을 클릭합니다.

3. App IDs → Continue를 선택하고 유형은 App 그대로 → Continue.

4. Description: 제품 이름. Bundle ID: Explicit을 선택하고 역도메인 형식 com.yourcompany.yourapp을 입력합니다—iOS 앱을 출시하는 경우 apps/mobile/app.json의 ios.bundleIdentifier와 정확히 일치시켜 두 플랫폼이 하나의 App ID를 공유하도록 합니다.

5. 기능 목록에서 Sign in with Apple을 체크 → Continue → Register.

예상 결과: 식별자가 Identifiers 목록에 Sign in with Apple 기능이 활성화된 상태로 나타납니다. 이 하나의 App ID를 재사용하세요—Services ID와 키 모두 기본 앱으로 여기에 연결됩니다.

Services ID 및 리턴 URL 등록

1. Identifiers로 돌아가 다시 +를 클릭하고 Services IDs → Continue를 선택합니다.

2. Description: yourapp web sign-in 같은 것. Identifier: 또 다른 역도메인 이름—com.yourcompany.yourapp.web이 관례입니다—App ID와 의도적으로 다르게 합니다. 이 Services ID가 서버가 웹 로그인에 사용하는 클라이언트 ID입니다. 정확히 복사한 후 Continue → Register.

3. 목록에서 새 Services ID를 선택하고 Sign in with Apple을 체크한 뒤 Configure를 클릭합니다.

4. 대화 상자에서 Primary App ID를 이전 섹션의 App ID로 설정합니다. Website URLs에 도메인(예: yourdomain.com)을 추가하고 Return URLs에 https://yourdomain.com/api/auth/callback/apple을 추가합니다—해당 경로는 킷의 Better Auth 콜백 {APP_URL}/api/auth/callback/apple입니다. Save → Continue → Save.

각 리턴 URL은 등록된 도메인의 절대 https:// 주소여야 합니다: localhost, 베어 IP 주소, http는 거부됩니다. 로컬 개발에서는 앱을 https 터널 뒤에서 실행하고, 터널 도메인을 Services ID에 추가하고, https://<tunnel-domain>/api/auth/callback/apple을 등록하고, 테스트하는 동안 APP_URL을 터널 URL로 설정합니다.

예상 결과: Services ID가 Sign in with Apple → Enabled로 표시됩니다. 포털이 도메인을 거부하면 먼저 계정 페이지에서 도메인 소유권 확인을 완료하세요.

Sign in with Apple 키 만들기

1. 왼쪽 사이드바에서 Keys → +를 엽니다. 키 이름을 지정하고(예: yourapp sign-in key) Sign in with Apple을 체크하고 Configure를 클릭하고 App ID를 Primary App ID로 선택 → Save → Continue → Register.

2. 확인 화면에서 Key ID를 기록한 다음 Download를 클릭합니다—.p8 파일은 정확히 한 번만 제공됩니다. 잃어버리면 키를 취소하고 다른 키를 만드세요. Apple은 사본을 보관하지 않습니다.

3. Team ID도 기록하세요—개발자 계정 페이지 오른쪽 상단, 계정 이름 옆에 인쇄되어 있습니다.

예상 결과: 이제 .p8 파일, Key ID, Team ID 세 가지 값을 보유했습니다. .p8 파일을 Git에 넣지 마세요. 이 파일은 개발자 계정으로 서명합니다.

앱에 값 추가

킷은 아래 세 줄만 기대합니다—모든 소셜 공급자가 사용하는 것과 동일한 clientId/clientSecret 쌍입니다. APPLE_CLIENT_ID는 App ID가 아니라 Services ID(com.yourcompany.yourapp.web)입니다.

Apple은 정적 클라이언트 시크릿을 발급하지 않으므로 APPLE_CLIENT_SECRET은 Team ID, Key ID, .p8 개인 키로 직접 서명하는 JWT입니다—Better Auth 문서에 그 짧은 생성 스크립트가 포함되어 있습니다. 서명된 시크릿은 최대 6개월 동안만 유효합니다. 다시 생성하여 env 값을 업데이트하도록 미리 알림을 설정하세요. 만료되는 순간 로그인이 실패합니다. .p8 파일의 내용이나 원시 Key ID를 env에 붙여넣지 마세요—거기에는 생성된 JWT만 들어갑니다.

클라이언트 시크릿과 .p8 파일은 서버 전용입니다: NEXT_PUBLIC_/EXPO_PUBLIC_ 변수에 절대 넣지 말고 커밋도 하지 마세요—프로덕션에서는 호스트의 시크릿 저장소를 통해 설정합니다. 편집 후 개발 서버를 재시작하세요. env 변경은 시작 시 읽힙니다.

# apps/web/.env.local
AUTH_APPLE_ENABLED=true
APPLE_CLIENT_ID=com.yourcompany.yourapp.web   # the Services ID, not the App ID
APPLE_CLIENT_SECRET=<JWT signed with Team ID + Key ID + .p8>

확인 및 문제 해결

APP_URL—배포된 URL 또는 https 터널—의 /auth를 열고 Apple 버튼을 클릭하고 임의의 Apple ID(개발자 계정일 필요는 없습니다)로 로그인한 후 로그인된 상태로 돌아오는지 확인합니다.

대부분의 실패는 세 가지 혼동 중 하나입니다: Services ID 대 App ID—클라이언트 ID는 웹 로그인용 Services ID여야 합니다. 리턴 URL 불일치—콜백은 프로토콜, 도메인, 경로를 포함하여 등록된 Return URL과 정확히 일치해야 합니다. 또는 만료/유효하지 않은 클라이언트 시크릿—JWT를 다시 생성하세요. 이것은 .p8 내용이 아니라 서명된 토큰일 뿐입니다.

AUTH_APPLE_ENABLED=true를 설정할 때까지 /auth의 Apple 옵션은 비활성화된 상태입니다—env 이름을 확인하고 재시작하세요. APPLE_CLIENT_ID와 APPLE_CLIENT_SECRET 없이 플래그를 활성화하면 시작이 실패하고 누락된 변수를 지목합니다.

iOS 앱도 같은 이 백엔드에 도달합니다—App Store 심사가 다른 소셜 버튼을 받아들이도록 그 안에도 Sign in with Apple을 포함하세요. 심사가 무엇을 찾는지는 모바일 계정 가이드가 설명합니다.

설정을 계속하려면 Stripe 결제 추가 가이드를 읽어보세요.

자주 묻는 질문

질문 14개

supastack이란 무엇인가요?

supastack은 AI SaaS 제품을 구축하기 위한 모듈식 기반입니다. 공통 인프라를 모아두어 제품 고유의 기능에 집중할 수 있습니다.

웹과 모바일을 지원하나요?

네. supastack에는 웹과 모바일 경험의 출발점으로 Next.js 앱과 Expo 앱이 포함되어 있습니다.

어떤 인증이 포함되어 있나요?

Better Auth가 이메일/비밀번호, OTP, 소셜 로그인을 커버합니다. 개인 워크스페이스는 계정과 함께 프로비저닝되어 첫날부터 레코드가 경계 안에 유지됩니다.

AI는 어떻게 지원되나요?

supastack에는 구성 가능한 멀티 프로바이더 AI, 사용량 추적, 예산, 암호화된 자체 키(BYOK) 지원이 포함되어 있습니다.

구독은 어떻게 관리되나요?

이 키트 위에 구축된 제품에서는 Stripe 결제, 구독, 권한이 유료 액세스의 기반을 형성합니다. 프로바이더 시크릿은 서버 측에 유지됩니다.

제품 고유 코드는 어디에 두나요?

제품 고유 기능은 별도의 코드베이스에 두고, 제품이 supastack 기본 모듈을 구성하고 통합합니다.

supastack 가격은 어떻게 되나요?

키트는 평생 업데이트가 포함된 일회성 구매입니다: 단일 프레임워크 $249(기간 한정 출시 가격 — 정가 $349에서 $100 할인) 또는 모든 프레임워크(Next.js, iOS, Android) $499(기간 한정 출시 가격 — 정가 $599에서 $100 할인), 추가 개발자 시트당 $75. 키트 구독은 없습니다. 이 사이트의 체크아웃은 라이선스 키를 이메일로 전달하고 GitHub 초대로 리포지토리 액세스를 제공합니다.

워크스페이스는 내 데이터를 어떻게 경계 짓나요?

사용자 레코드는 workspaceId로 범위가 지정됩니다. 신원, 권한, AI 사용량, 결제 이벤트, 감사 항목은 개인 워크스페이스 경계 안에 유지됩니다.

백그라운드 작업은 어떻게 작동하나요?

Trigger.dev가 명시적인 작업 런타임입니다. JobRunner 계약은 enqueue, status, cancel만 약속하며 — 워크플로 의미는 Trigger.dev 고유이고 명시적입니다.

이메일과 아웃리치는 어떻게 다른가요?

트랜잭션 이메일은 작업 완료 알림 같은 제품 워크플로를 커버합니다. 콜드 아웃리치와 캠페인은 제품 자체에 속하며 이 키트의 이메일 모듈 밖입니다.

모바일 구매는 어떻게 작동하나요?

모바일은 RevenueCat 네이티브 구매와 복원을 지원하며 서버에서 접근 권한을 검증합니다. 출시 전에 스토어 계정을 설정하고 기기 테스트를 완료하세요. 웹 결제는 별도로 관리합니다.

AI 프로바이더 키는 어디에 있나요?

BYOK 자격 증명은 암호화되어 서버 측에 유지됩니다. 키는 로그에서 삭제되며, 사용량과 예산은 워크스페이스 수준에서 확인할 수 있습니다.

체크아웃에서 어떤 결제 수단을 지원하나요?

Stripe 호스팅 체크아웃은 카드를 받으며, Stripe 계정에서 지갑을 활성화하면 Alipay와 WeChat Pay도 제공할 수 있습니다 — 중국 구매자에게 유용합니다. 지갑 승인은 비동기로 확정되므로 결제가 완료되는 즉시 라이선스 페이지가 갱신됩니다.

환불을 받을 수 있나요?

저장소 접근 권한을 얻은 후에는 supastack이 영구적으로 귀하의 소유가 되므로 환불이 불가능합니다. 하지만 안심하세요. 평생 업데이트가 포함된 전체 소스 코드를 받아 자신이나 고객을 위한 제품을 무제한으로 구축하고 출시할 수 있습니다. 단, 코드를 재판매하거나 저장소를 스타터 키트 또는 템플릿으로 재배포할 수는 없습니다.

KO
테마