0613 애플로그인 트러블슈팅

김동연·2025년 6월 13일

개발기록일지(Flutter)

목록 보기
19/32

1. 문제 요약

현상

  • Sign in with Apple 버튼 클릭 시 Apple 로그인 창은 뜨고 응답도 도착함
  • 그러나 다음과 같은 에러 발생:
[firebase_auth/invalid-credential] Invalid OAuth response from apple.com
  • 시뮬레이터뿐 아니라 TestFlight에서 배포된 앱에서도 동일 증상 발생
  • Firebase 로그인을 위한 OAuthCredential 생성은 정상적으로 진행되었음
  • Apple에서 받은 identityTokenauthorizationCode도 유효해 보임

2. 일반적인 예상 원인 (그러나 모두 실패함)

시도예상 원인조치결과
1시뮬레이터의 Apple 로그인 지원 문제실기기에서 테스트실패
2Apple 개발자 설정 누락Capability, Key, Redirect URI 확인정상
3.env에 설정된 clientId, redirectUri 오류재확인 및 로그 출력정상
4Firebase CocoaPods 버전 불일치pod update Firebase/Storage 실행무관
5rawNonce를 잘못 사용했거나 해시가 틀림nonce, hashedNonce 출력 확인정상

위 모든 조건을 충족했음에도 동일 에러 계속 발생
"external 환경 문제"나 "시뮬레이터 미지원"만으로는 설명 불가


3. 핵심 원인: Firebase OAuthCredential 생성 방식

문제의 중심은 여기

기존 코드:

final credential = await SignInWithApple.getAppleIDCredential(
  scopes: [...],
  nonce: hashedNonce,
);

final oauthCredential = OAuthProvider("apple.com").credential(
  idToken: credential.identityToken,
  rawNonce: rawNonce,
);

이 방식은 Apple 로그인 시 OpenID Connect (OIDC) 흐름을 강제함.
Firebase는 이 OIDC 흐름을 검증할 때, Apple에서 받은 identityTokennonce 값과 rawNonce를 비교하여 위조되지 않았는지 확인한다.

문제 발생 이유

  • 일부 Apple 계정은 로그인 응답에 nonce 필드를 포함하지 않음
  • 따라서 Firebase는 검증할 수 없고, invalid-credential 오류 발생

4. 해결 방법: accessToken 사용 + rawNonce 제거

수정 후 코드:

final credential = await SignInWithApple.getAppleIDCredential(
  scopes: [...],
  // nonce: hashedNonce, // 제거
);

final oauthCredential = OAuthProvider("apple.com").credential(
  idToken: credential.identityToken,
  accessToken: credential.authorizationCode, // 추가
  // rawNonce: rawNonce, // 제거
);

왜 이게 통했는가?

  • accessToken은 OAuth 2.0 Authorization Code Flow에 가까운 방식
  • 이 흐름은 Firebase에서 nonce를 검증하지 않음
  • 결과적으로 Apple 계정이 nonce를 리턴하지 않더라도 로그인 가능

5. 시뮬레이터, 실기기 모두 정상 작동

  • 위 방식은 시뮬레이터, TestFlight 실기기 모두에서 작동
  • 실질적으로 Apple 로그인의 최소한의 인증 흐름을 충족시키는 방식

6. 정리: 어떤 방식이 정답인가?

구분방식장점단점사용 권장 시점
OIDC 방식 (nonce 포함)rawNonce + idToken보안성 뛰어남일부 계정, 디바이스에서 실패배포용 앱, 최신 계정
OAuth 방식 (accessToken 사용)idToken + authorizationCode호환성 넓음, 오류 적음일부 보안 검증 생략됨테스트, 시뮬레이터, 호환성 우선 앱

7. 트러블슈팅 요약 과정 (타임라인 스타일)

단계조치결과
1시뮬레이터에서 Apple 로그인 시도 → 실패invalid-credential 발생
2실기기 TestFlight로 배포 후 테스트 → 실패동일 오류 발생
3Firebase, Apple 설정 확인 (.env 포함)문제 없음
4rawNonce, hashedNonce 값 로그로 출력정상 생성 확인
5Firebase credential 생성 로직 수정 (accessToken 추가, nonce 제거)로그인 성공

8. 최종 결론

이 문제의 본질은 "Apple 로그인에서 받은 identityTokennonce가 포함되지 않으면 Firebase가 인증을 거부하는 구조"였습니다.

accessToken 방식은 nonce 검증을 생략하기 때문에 일부 Apple 계정이나 시뮬레이터에서도 넓은 호환성을 보장합니다.
하지만 보안상 OIDC 흐름이 더 안전하므로, 배포 전에는 실제 환경에서 rawNonce 방식이 작동하는지 꼭 확인해야 합니다.

0개의 댓글