학습 목표와 사전 지식
목표: OAuth 도메인 오류와 redirect·continue URL 오류를 구분하고 설정 한 곳만 바꾸어 재확인합니다.
사전 지식: Firebase 웹 앱 초기화, 개발용 Google 로그인, 브라우저 Network 탭
auth/unauthorized-domain은 현재 앱의 호스트가 인증 작업에 승인되어 있는지 먼저 확인할 오류입니다. 같은 이름의 프로젝트를 착각하지 않도록 앱 설정의 projectId와 Console 프로젝트를 먼저 대조하세요.
최소 재현: 변경할 변수는 호스트 하나
개발용 프로젝트의 Google provider를 활성화하고 이미 동작하는 로그인 화면을 사용합니다. 승인되지 않은 별도 테스트 호스트에서 같은 로그인 버튼을 누릅니다. 실제 실패 코드가 auth/unauthorized-domain인지 기록합니다. 운영 도메인을 삭제해서 재현하지 마세요. 팝업 차단(auth/popup-blocked)이나 사용자가 닫은 팝업은 별도 문제입니다.
src/auth/google.js · 전체 모듈; 초기화된 auth를 호출부에서 전달
import { GoogleAuthProvider, signInWithPopup } from 'firebase/auth';
export async function googleLogin(auth) {
try {
await signInWithPopup(auth, new GoogleAuthProvider());
return { ok: true };
} catch (error) {
return { ok: false, code: error.code ?? 'unknown' };
}
}

수정 전·수정 방법·수정 후
수정 전에는 테스트 호스트가 Authorized domains에 없습니다. Firebase Console → Authentication → Settings → Authorized domains에서 소유·관리하는 해당 호스트를 추가합니다. 로그인 코드는 그대로 두고 같은 브라우저·계정·호스트에서 다시 클릭합니다. 성공하면 onAuthStateChanged로 사용자가 관찰되는지 확인하고, 다른 실패 코드로 바뀌었다면 그 코드부터 새로 진단합니다.
| 접속 URL | 등록할 호스트 |
|---|---|
| http://localhost:3000/login | localhost |
| https://example.com/login | example.com |
| https://www.example.com/login | www.example.com |
localhost와 배포 환경을 혼동하지 않기
공식 문서에 따르면 2025년 4월 28일 이후 생성한 프로젝트에서는 localhost가 기본 승인 도메인에 포함되지 않습니다. 필요한 개발용 프로젝트에 명시적으로 추가하세요. 주소의 경로·프로토콜·포트를 입력하지 않습니다. Preview URL이 매번 달라지면 고정 테스트 도메인과 개발 프로젝트를 사용하는 편이 관리하기 쉽습니다. Next.js의 NEXT_PUBLIC_ 설정은 빌드에 포함되므로 배포 환경값 변경 뒤 재빌드가 필요합니다.

같이 보이지만 별도인 오류
이메일 actionCodeSettings.url은 링크 처리 후 돌아갈 continue URL입니다. 승인 호스트와 auth/unauthorized-continue-uri를 따로 봅니다. signInWithRedirect가 특정 브라우저에서만 복귀하지 않으면 공식 redirect best practices에 따라 authDomain과 저장소 제약을 확인합니다. OAuth 제공자 redirect URI의 /__/auth/handler와 앱의 승인 호스트는 같은 설정 항목이 아닙니다. 토큰·이메일·설정 전체를 로그에 출력할 필요는 없습니다.
직접 확인할 결과
승인 전 동일 클릭의 정확한 에러 코드 기록
승인 후 같은 계정에서 사용자 관찰 및 로그아웃 확인
기본 도메인·www·개발 호스트를 각각 확인
검증 범위와 기준일
공식 문서 확인일: 2026-09-13. 웹 SDK 예제는 모듈형 API 기준입니다. 이 글의 코드·구조 정적 검토와 실제 클라우드 인증·저장·배포 검증을 구분합니다. 본인 개발 Firebase 프로젝트의 실제 인증·권한·배포 요청은 이 편집 환경에서 실행하지 않았습니다.
이어서 학습하기
- Firebase Firestore 인덱스 삭제 질문 해결: 배포 중 안전하게 판단하기
- Firebase permission-denied 오류 해결: Firestore Rules 체크리스트
공식 문서
이 글이 도움이 되었나요?
Firebase 학습 순서
필수 13개 · 전체 19개
읽음 기록 관리
전체 과정 목차 (19개)
- 필수 길잡이 · Firebase 실무 로드맵: Auth, Firestore, Storage, Functions
- 필수 학습 · Firebase 초기화 구조: Next.js firebase.ts 설계 기준
- 필수 학습 · Firebase Authentication 사용 기준: 로그인 유지와 비밀번호 재설정
- 필수 학습 · Firebase 보안 규칙 설계: Firestore와 Storage 권한 관리하기
- 필수 학습 · Firestore CRUD 사용법: 컬렉션 구조와 읽기 쓰기 흐름
- 필수 학습 · Firebase Auth Context 설계: 로그인 권한과 라우팅 관리하기
- 필수 학습 · Firebase Storage 이미지 업로드 사용법: 상품 이미지 관리 흐름 만들기
- 필수 학습 · Firebase Custom Claims 사용법: 관리자 권한 구분하기
- 필수 학습 · Firebase Functions v2 사용법: 트리거 배포 Secret 처리
- 필수 학습 · Firestore seed data 설계: 리뷰 더미 데이터 구조 잡기
- 선택 참고 · Firebase 배포 제외 파일 설정: firebase.json의 ignore 사용법
- 선택 참고 · Firebase Firestore 인덱스 삭제 질문 해결: 배포 중 안전하게 판단하기
- 선택 참고 · Firebase Auth unauthorized-domain 오류 해결: 로그인 도메인 설정 확인 현재 글
- 선택 참고 · Firebase permission-denied 오류 해결: Firestore Rules 체크리스트
- 선택 참고 · Firebase Storage 이미지 오류 해결: 403·404·token·Rules 확인법
- 선택 참고 · Firebase CORS 오류 해결: Storage 이미지 업로드가 막힐 때 확인할 설정
- 필수 선수 · Firebase 실무 오류 해결 모음: Storage, Firestore, Auth 체크리스트
- 필수 학습 · Firestore undefined 오류 해결: 선택 필드가 저장을 막을 때
- 필수 학습 · Firestore arrayUnion 중첩 배열 오류: 배열을 그대로 넘기면 실패하는 이유
새 글 받아보기
RSS 리더에서 BlogFlow의 새 글을 확인할 수 있습니다.