Vue 3와 Firebase 소셜 로그인: OAuth 위임과 연동 원리

한눈에 보기

소셜 로그인의 바탕인 OAuth 2.0 권한 위임 원리와 Firebase가 소셜 제공자를 중개하는 인증 흐름을 다룬다. 팝업과 리다이렉트 방식 비교, Vue 3 구현, 계정 충돌 처리까지 정리한다.

최종 업데이트 2026.09.17

소셜 로그인은 사용자가 새 비밀번호를 만들지 않고 Facebook(페이스북)이나 Google(구글) 같은 외부 계정으로 서비스에 로그인하는 방식이며, 그 바탕에는 OAuth(오어스) 2.0의 권한 위임 원리가 있다. Firebase Authentication(파이어베이스 인증)은 각 소셜 제공자와의 복잡한 토큰 교환을 대신 처리하고, 어떤 제공자로 로그인하든 동일한 형태의 사용자 객체와 ID 토큰(ID token)을 돌려주는 중개자 역할을 한다. Vue 3(뷰 3) 애플리케이션은 이 흐름을 몇 개의 함수 호출로 통합할 수 있다.

소셜 로그인의 원리: OAuth 2.0 위임

OAuth 2.0의 핵심은 사용자가 외부 서비스의 비밀번호를 우리 서비스에 알려 주지 않는다는 점이다. 사용자는 제공자의 동의 화면에서 직접 로그인하고 정보 제공에 동의하며, 제공자는 그 증거로 액세스 토큰(access token)이라는 자격 증명을 발급한다. 우리 서비스는 비밀번호 대신 이 토큰으로 사용자의 신원과 허용된 정보에 접근한다. 로그인 용도로는 여기에 신원 계층을 더한 OpenID Connect(오픈아이디 커넥트)가 함께 쓰이며, 이름과 이메일 같은 프로필 정보가 표준화된 형태로 전달된다.

Firebase가 중개하는 인증 흐름

  1. 애플리케이션이 FacebookAuthProvider 같은 제공자 객체를 만들어 로그인을 요청한다.
  2. 사용자가 제공자의 동의 화면에서 로그인하고 승인하면 제공자가 액세스 토큰을 발급한다.
  3. Firebase가 이 토큰을 검증한 뒤 자체 사용자 계정에 연결하고, 처음이라면 계정을 새로 만든다.
  4. 애플리케이션은 제공자와 무관하게 통일된 user 객체와 Firebase ID 토큰을 받는다.

이 구조가 성립하려면 사전에 제공자 개발자 콘솔에 앱을 등록하고, 발급받은 앱 식별자와 시크릿(secret)을 Firebase 콘솔에 설정하며, 인증 후 돌아올 리다이렉트 URI를 허용 목록에 올려 두어야 한다. 중요한 점은 시크릿이 Firebase 서버 쪽에 저장되어 토큰 교환에 사용되므로 브라우저 코드에 절대 노출되지 않는다는 것이다.

팝업 방식과 리다이렉트 방식 비교

구분signInWithPopupsignInWithRedirect
동작동의 화면을 새 팝업 창에 띄운다현재 탭 전체가 제공자 페이지로 이동한다
결과 수신호출한 자리에서 Promise로 즉시 받는다돌아온 뒤 getRedirectResult로 따로 조회한다
사용자 경험현재 페이지 상태가 유지된다페이지가 완전히 다시 로드된다
취약점팝업 차단기에 막힐 수 있다브라우저의 서드파티 저장소 제한에 영향을 받을 수 있다
권장 상황데스크톱 브라우저팝업 사용이 어려운 일부 모바일 환경

Vue 3에서 구현하기

// useSocialLogin.js
import { getAuth, signInWithPopup, FacebookAuthProvider } from 'firebase/auth';

export function useSocialLogin() {
  const loginWithFacebook = async () => {
    const provider = new FacebookAuthProvider();
    provider.addScope('email');
    try {
      const result = await signInWithPopup(getAuth(), provider);
      return result.user;
    } catch (error) {
      if (error.code === 'auth/account-exists-with-different-credential') {
        // 같은 이메일이 다른 제공자로 이미 가입된 경우를 안내한다
      }
      throw error;
    }
  };

  return { loginWithFacebook };
}

addScope는 기본 프로필 외에 추가로 요청할 정보 범위를 지정한다. 로그인 성공 이후의 상태 관리는 이메일 인증과 마찬가지로 onAuthStateChanged 하나로 일원화하는 것이 좋다. 제공자별 분기가 로그인 시점 이후까지 퍼지지 않기 때문이다.

계정 충돌과 예외 처리

  • auth/account-exists-with-different-credential 오류는 같은 이메일이 이미 다른 제공자로 가입된 경우 발생한다. 기존 방식으로 먼저 로그인시킨 뒤 linkWithCredential로 두 자격 증명을 한 계정에 연결하는 것이 정석이다.
  • 팝업은 사용자 클릭 같은 상호작용 이벤트 핸들러 안에서 직접 열어야 팝업 차단기에 걸리지 않는다.
  • 최근 브라우저의 서드파티 쿠키와 저장소 차단 정책 때문에 리다이렉트 방식이 실패하는 사례가 있어, 서비스 도메인과 인증 도메인을 일치시키는 구성이나 팝업 우선 전략이 권장된다.
  • 제공자가 이메일을 주지 않는 경우도 있다. 예를 들어 전화번호로 가입한 Facebook 계정은 email이 null일 수 있으므로 이메일 존재를 가정한 코드는 위험하다.

면접에서 이렇게 물어본다

  • OAuth 2.0에서 비밀번호를 공유하지 않고도 로그인이 가능한 원리를 설명해 보라.
  • 팝업 방식과 리다이렉트 방식의 차이와 각각을 선택하는 기준은 무엇인가.
  • 같은 이메일로 서로 다른 소셜 제공자에 가입된 계정 충돌을 어떻게 처리하는가.
  • Firebase가 제공자 시크릿을 클라이언트에 노출하지 않고 인증을 완료하는 구조를 설명해 보라.
  • 소셜 로그인 이후 백엔드 API는 이 사용자를 어떻게 신뢰할 수 있는가.
React / Vue 문서 전체 보기

이 개념, 내 코드에서는 어떻게 물어볼까요

데브핏(DevFit)에 채용공고 URL을 붙여 넣고 레포지토리를 연결하면, 내가 쓴 커밋에서 예상 질문과 어필 포인트를 만듭니다. 하루 10회까지 무료입니다. 합불 판정이나 지원자 랭킹은 만들지 않고, 최종 판단은 사람이 합니다.

공고 넣고 시작하기