Guideline 4.8 애플 로그인 필수인가요
글: Mehdi Azizi
게시, 9분
구글·페이스북 로그인이 있다면 이메일을 숨길 수 있는 로그인도 함께 넣어야 해요. 가장 확실한 건 Apple 로그인이에요.
가이드라인 4.8은 앱에서 Google, Facebook 같은 서드파티 로그인으로 메인 계정을 만들 때 적용돼요. 이 경우 동등한 로그인 옵션을 하나 더 제공해야 해요. 이 옵션은 수집 데이터를 이름과 이메일로 제한하고, 이메일을 숨길 수 있게 해 주고, 사용자 동의 없이 광고 목적으로 추적하지 않아야 해요. 2024년 1월부터 이 옵션이 꼭 "Sign in with Apple"일 필요는 없어졌지만, Apple이 거절 메시지에서 직접 언급하는 건 여전히 Apple 로그인이에요.
제 앱 중 Solys와 Nolera는 Apple, Google, 이메일 로그인을 제공해요. 이 가이드는 Apple의 현재 가이드라인 문구에서 출발해서, Supabase와 연결된 Expo 앱에 Apple 로그인을 어떻게 추가하는지, 그리고 계정 삭제에 어떤 영향이 있는지 보여 드려요. 거절 사유 전체를 훑어보고 싶다면 Apple이 앱을 거절하는 이유를 먼저 읽어 보세요.
가이드라인 4.8 Login Services는 무슨 내용인가요?
4.8은 App Review Guidelines의 4장 "Design"에 있어요. 메인 계정을 만들거나 인증할 때 "a third-party or social login service"를 쓰는 앱이 대상이에요. Facebook Login, Google Sign-In, Log in with X, LinkedIn, Amazon, WeChat 같은 것들이죠. 이런 앱은 "as an equivalent option"으로 다음 세 가지 조건을 만족하는 다른 로그인 서비스도 제공해야 해요.
| Apple의 조건 | 쉽게 말하면 |
|---|---|
| 데이터 제한 | 이름과 이메일, 그 이상은 없음 |
| 비공개 이메일 가능 | 사용자가 이메일을 숨길 수 있음 |
| 동의 없는 광고 금지 | 동의 없이 광고 추적 안 함 |
가이드라인은 메인 계정도 정의해요. 사용자가 앱에서 자신을 식별하고, 로그인하고, 기능에 접근하려고 만드는 계정이에요. 이 정의에 따르면 파일을 가져오기만 하는 Google 버튼은 메인 계정을 만들지 않아요. 4.8이 겨냥하는 건 앱에 들어가는 화면이에요.
2024년 1월에 바뀐 점
2024년 전에는 서드파티 로그인으로 메인 계정을 만드는 앱에 "Sign in with Apple"이 의무였어요. 2024년 1월 25일, Apple이 이 부분을 완화했어요. 이제 Apple 로그인이나, 개인정보를 보호하는 동등한 서비스 중 하나를 제공하면 돼요. 그런데 아직도 반대로 말하는 페이지가 많아요. Expo 문서도 여전히 서드파티 로그인이 있는 앱은 Apple 로그인을 제공해야 한다고 적혀 있어요.
실제로 Apple 개발자 포럼에 공개된 4.8 거절 메시지는 이렇게 끝나요: "Note that Sign in with Apple meets the requirements specified in guideline 4.8". Apple은 조건을 충족하는 다른 서비스를 하나도 언급하지 않아요. 리뷰어와 추측 게임을 하지 않으려고, 저는 Apple 로그인을 추가해요.
가이드라인에 명시된 다섯 가지 예외
Apple은 다른 로그인 옵션이 필요 없는 경우 다섯 가지를 나열해요.
- 앱이 자체 계정 시스템만 쓰는 경우. 예를 들어 이메일과 비밀번호, 또는 이메일로 보내는 인증 코드요.
- 앱이 대체 앱 마켓이거나 그런 마켓을 통해 배포되고, 그 마켓 전용 로그인을 쓰는 경우.
- 교육용, 기업용, 업무용 앱이고 기존 학교 계정이나 회사 계정이 필요한 경우.
- 정부나 업계가 지원하는 전자 신원 확인 시스템을 쓰는 경우.
- 특정 서드파티 서비스의 클라이언트 앱이어서, 사용자가 자기 콘텐츠에 접근하려고 메일이나 소셜 네트워크에 로그인하는 경우.
이 예외들을 보기 전에 먼저 스스로 물어보세요. 내 앱에 정말 계정이 필요할까요? 필요 없다면 가이드라인 5.1.1(v)는 로그인 없이도 앱을 쓸 수 있게 하라고 요구해요. 자세한 내용은 가이드라인 5.1.1 가이드에 정리해 뒀어요.
| 내 로그인 화면 | 4.8 적용 여부 |
|---|---|
| 계정 없음 | 아니요 |
| 이메일 또는 코드만 | 아니요 |
| Google만 | 예 |
| Google과 이메일 | 예, 아마도 |
| Google과 Apple | 예, 그리고 준수함 |
| 기존 학교 계정 | 아니요 |
| 가져오기용 Google | 아니요, 계정 아님 |
Expo 앱에 "Sign in with Apple" 추가하기
1. 모듈 설치와 capability 선언
npx expo install expo-apple-authentication
그다음 Expo 문서대로 앱 설정에서 capability를 활성화해요.
{
"expo": {
"ios": {
"usesAppleSignIn": true,
"infoPlist": { "CFBundleAllowMixedLocalizations": true }
}
}
}
두 번째 줄은 버튼을 iPhone 언어로 표시해 줘요. EAS Build를 쓰면 빌드할 때 앱 식별자에 capability가 활성화돼요. 이건 네이티브 설정이라서 새 빌드로만 반영되고, 원격 업데이트로는 절대 반영되지 않아요.
제 키트의 스타터 코드를 다시 읽다가 발견한 함정이 하나 있어요. 이 capability는 시뮬레이터에서 앱을 실행할 때도 서명을 요구해요. "Apple Development" 인증서가 없는 Mac에서는 로컬 컴파일이 "No code signing certificates are available to use" 오류로 실패했어요. 해결책은 인증 서버가 설정된 경우에만 Apple 로그인을 활성화하는 거예요.
2. Google만큼 눈에 띄는 공식 버튼 표시하기
Apple 디자인 규칙은 분명해요. Apple 버튼은 다른 로그인 버튼보다 작으면 안 되고, 화면을 스크롤해야 보이면 안 돼요. Expo 컴포넌트는 Apple이 허용한 제목으로 공식 버튼을 그려 줘요.
import * as AppleAuthentication from "expo-apple-authentication";
import { useEffect, useState } from "react";
export function BoutonApple({ onPress }: { onPress: () => void }) {
const [disponible, setDisponible] = useState(false);
useEffect(() => {
AppleAuthentication.isAvailableAsync().then(setDisponible);
}, []);
// Android와 웹: Apple 로그인이 없으니 버튼도 없어요.
if (!disponible) return null;
return (
<AppleAuthentication.AppleAuthenticationButton
buttonType={AppleAuthentication.AppleAuthenticationButtonType.CONTINUE}
buttonStyle={AppleAuthentication.AppleAuthenticationButtonStyle.BLACK}
cornerRadius={12}
style={{ width: "100%", height: 50 }}
onPress={onPress}
/>
);
}
Expo 문서에 따르면 너비와 높이가 없으면 버튼이 나타나지 않아요. 색과 모서리 둥글기는 style이 아니라 buttonStyle과 cornerRadius로 지정해요.
3. Supabase에서 세션 열기
import * as AppleAuthentication from "expo-apple-authentication";
import { supabase } from "./supabase";
export async function connexionApple(): Promise<"ok" | "annule"> {
try {
const credential = await AppleAuthentication.signInAsync({
requestedScopes: [
AppleAuthentication.AppleAuthenticationScope.FULL_NAME,
AppleAuthentication.AppleAuthenticationScope.EMAIL,
],
});
if (!credential.identityToken) throw new Error("Apple 토큰 없음");
const { error } = await supabase.auth.signInWithIdToken({
provider: "apple",
token: credential.identityToken,
});
if (error) throw error;
// 이름은 첫 승인 때만 오니까 바로 저장해요.
const prenom = credential.fullName?.givenName;
if (prenom) await supabase.auth.updateUser({ data: { prenom } });
return "ok";
} catch (e) {
if ((e as { code?: string }).code === "ERR_REQUEST_CANCELED")
return "annule";
throw e;
}
}
Supabase 문서, Expo 문서, Apple 디자인 규칙에서 뽑은 중요한 포인트 네 가지예요.
- Supabase에서 Apple 제공자의 Client IDs에 번들 식별자를 등록하세요. 네이티브 전용 앱은 로그인에 시크릿 키가 필요 없어요. Expo Go에서 테스트한다면
host.exp.Exponent도 추가하세요. - 이름과 이메일은 딱 한 번만 와요. 이후 로그인에서는 Apple이 다시 보내 주지 않으니, 첫 응답에서 바로 저장하세요.
- 이메일이 릴레이 주소일 수 있어요. Apple은 나중에 개인 이메일을 다시 요구하지 말라고 권장해요.
- 취소는 오류가 아니에요. Nolera에서는 Apple 시트를 닫아도 빨간 오류 메시지가 뜨지 않아요. 사용자가 일부러 한 동작이니까요.
2026년 8월 Solys에서 실제로 겪은 일이에요. 앱에 Apple 버튼과 Google 버튼이 있었는데, Supabase에서 두 제공자 모두 활성화되어 있지 않았어요. 코드는 문제가 없었고, 새 빌드 없이 서버 쪽에서 고쳤어요. 리뷰어 앞에서 Apple 버튼이 실패하면 4.8 거절 대신 2.1 거절을 받아요. 자세한 내용은 가이드라인 2.1 가이드에 있어요.
4. 실제 iPhone에서 테스트하기
Expo는 시뮬레이터에서는 제한적인 테스트만 가능하고, Expo Go에서 받는 식별자는 배포된 앱의 식별자와 다르다고 경고해요. 실제 iPhone에서 TestFlight 빌드로 로그인, 로그아웃, 재로그인을 테스트하세요.
Apple 로그인과 계정 삭제
가이드라인 5.1.1(v)는 앱에서 만든 계정을 앱에서 삭제할 수 있어야 한다고 요구해요. Apple 로그인을 쓰면 계정 삭제에 관한 Apple 페이지가 단계를 하나 더 추가해요. Sign in with Apple REST API로 사용자의 토큰을 폐기해야 해요.
토큰 폐기에는 두 가지가 필요해요. 인가 코드를 검증해서 얻는 사용자 토큰, 그리고 Sign in with Apple 비공개 키로 서명한 시크릿이에요. 네이티브 로그인에는 시크릿 키가 필요 없어도, 토큰 폐기에는 필요하고, 그 키는 서버에만 둬야 해요. 이유는 Expo 앱의 시크릿 API 키에서 설명했어요.
Nolera에서는 계정을 삭제할 때 앱이 새 인가 코드를 받으려고 Apple 로그인을 다시 요청해요. 그 코드를 서버 함수로 보내면, 서버가 Apple과 교환한 다음 토큰을 폐기해요. 사용자가 취소하면 분명한 메시지로 알려 주고 아무것도 삭제하지 않아요. 데이터, 구독, 테스트를 포함한 나머지 과정은 iOS 계정 삭제에 있어요.
4.8 거절 후 Apple에 어떻게 답할까요
Apple 메시지는 두 가지 해결책을 제시해요. 동등한 옵션을 추가하거나, 이미 그런 옵션이 있다면 App Store Connect에서 답장하면서 어떤 옵션이고 왜 세 가지 조건을 충족하는지 설명하는 거예요. Apple은 로그인 화면이 보이는 스크린샷도 업데이트하라고 권해요. App Review에 답장하는 절차는 다른 가이드라인과 똑같아요.
상황에 맞게 고쳐 쓸 영어 템플릿이에요(빌드 번호를 바꾸세요).
Hello,
Thank you for your review.
Build X adds Sign in with Apple as an equivalent login option.
It appears on the same screen as Google Sign-In, with the same
size, and is visible without scrolling.
How to verify: launch the app, open the sign-in screen and
tap "Continue with Apple".
We also updated the screenshots that show the sign-in screen.
Best regards,
제출 전 4.8 체크리스트
- 앱에 계정이 필요한지 알고 있어요. 필요 없다면 로그인 없이 쓸 수 있어요.
- Google, Facebook, X로 계정을 만든다면 같은 화면에 Apple 로그인이 있어요.
- Apple 버튼은 공식 버튼이고, 다른 버튼만큼 크고, 스크롤 없이 보여요.
- 서버 쪽에서 Apple 제공자가 번들 식별자와 함께 활성화되어 있어요.
- 취소하면 오류 메시지 없이 로그인 화면으로 돌아가요.
- 이름과 이메일은 첫 로그인 때 저장돼요.
- 계정 삭제 시 서버에서 Apple 토큰을 폐기해요.
- 앱에 한 번도 로그인한 적 없는 Apple 계정으로, 실제 iPhone에서 모두 테스트했어요.
- 스크린샷이 제출한 빌드의 로그인 화면을 그대로 보여 줘요.
다시 제출하기 전에 거절 사유 고치기
방금 4.8로 거절당했다면, Apple Review Kit에 제가 매번 제출 전에 확인하는 내용을 모아 뒀어요. Claude Code에서 프로젝트를 검토하고, Apple이 거절하면 답장을 준비해 주는 스킬 두 개도 들어 있어요. 사람의 눈으로 봐 주길 원한다면 저와 한 시간 예약하세요. 메시지를 함께 읽고 로그인 화면을 같이 살펴봐요. 거절 후 전체 대응 방법은 Apple에 거절된 앱 페이지에 있어요.
첫 출시를 준비 중이라면 무료 진단을 받아 보세요. 어떤 단계부터 시작할지 알려 주고, 제 Apple 거절 방지 체크리스트도 보내 드려요.
Apple이 앱을 승인할 거라고 누구도 보장할 수는 없어요. 그래도 Apple 로그인을 제자리에 넣으면 적어도 이 거절 사유는 목록에서 지울 수 있어요.
자주 묻는 질문
iOS에서 Apple 로그인은 필수인가요?
아니요, 항상 그렇진 않아요. Google이나 Facebook 같은 서드파티 로그인으로 메인 계정을 만들 때만 필요해요. 2024년 1월부터는 동등한 다른 서비스로 대체할 수도 있지만, Apple이 준수 사례로 언급하는 건 Apple 로그인뿐이에요.
"Guideline 4.8 - Design - Login Services"는 무슨 뜻인가요?
Apple 거절 메시지에 나오는 거절 제목이에요. 앱이 서드파티 로그인을 제공하면서, 데이터를 이름과 이메일로 제한하고 이메일을 숨길 수 있게 하며 동의 없이 광고에 쓰지 않는 동등한 옵션은 제공하지 않는다는 뜻이에요.
Google 옆에 이메일 가입만 있어도 충분한가요?
보장할 수 없어요. 가이드라인은 이메일을 비공개로 유지할 수 있는 서비스를 요구하는데, 일반적인 가입 폼은 이메일을 요구하잖아요. Apple은 이 경우에 대한 입장을 공개하지 않았고, 거절 메시지에서도 Apple 로그인만 언급해요. 저라면 이 위험을 감수하지 않을 거예요.
Android에서도 Apple 로그인을 제공해야 하나요?
아니요. 4.8은 App Store 규칙이고, Expo 모듈은 iOS에서만 작동해요. Android에서는 isAvailableAsync()가 false를 반환하니까 Apple 버튼이 표시되지 않고, Google만 있어도 괜찮아요.
4.8 거절 후에 새 빌드가 필요한가요?
네, 대부분 그래요. Apple 로그인은 빌드할 때 활성화되는 네이티브 capability가 필요해요. 원격 업데이트로는 추가할 수 없어요. 유일한 예외는 앱에 이미 조건을 충족하는 옵션이 있어서 답장으로 Apple에 설명하기만 하면 되는 경우예요.