본문으로 건너뛰기

소셜 로그인 한 줄로 붙이기

소셜 로그인 한 줄로 붙이기Google · Naver · GitHub 등 소셜 로그인을 SDK 한 줄로 적용합니다.

입문인증16초읽기 약 3분업데이트 2026-04-14

Google · Naver · GitHub 등 소셜 로그인을 SDK 한 줄로 적용합니다.

이 튜토리얼에서 배울 내용
콘솔에서 프로바이더 활성화
SDK 한 줄로 소셜 로그인
세션 관리 및 로그아웃
로그인 UI 구현

소셜 로그인 한 줄로 붙이기

Google, Naver 같은 소셜 로그인을 직접 구현하려면 OAuth 프로토콜, 콜백 처리, 토큰 관리 등 복잡한 과정이 필요합니다. ConnectBase를 사용하면 SDK 한 줄로 소셜 로그인을 즉시 적용할 수 있습니다.

완성된 기능

  • Google / Naver 소셜 로그인
  • 자동 세션 관리 (로그인 상태 유지)
  • 사용자 프로필 조회

사전 준비

시작하기 전에 두 가지를 먼저 설정해야 합니다:

1) ConnectBase 콘솔에서 프로바이더 활성화

  1. ConnectBase 콘솔에 로그인합니다
  2. 왼쪽 메뉴에서 인증 설정을 클릭합니다
  3. 소셜 로그인 섹션에서 사용할 프로바이더(Google, Naver 등)의 토글을 ON으로 켭니다
  4. 각 프로바이더의 Client IDClient Secret을 입력합니다

2) 프로바이더별 Client ID 발급

프로바이더개발자 콘솔발급 방법
Googleconsole.cloud.google.comOAuth 2.0 클라이언트 ID 생성
Naverdevelopers.naver.com애플리케이션 등록 → Client ID 확인

📌 콜백 URL은 ConnectBase가 자동으로 처리하므로 별도 설정이 필요 없습니다.

1. 프로젝트 설정

터미널을 열고 아래 명령어를 순서대로 실행합니다. Vite로 React + TypeScript 프로젝트를 만들고, ConnectBase SDK를 설치합니다.

bash
npm create vite@latest login-app -- --template react-ts
cd login-app
npm install connectbase-client

설치가 끝나면 .env 파일을 프로젝트 루트에 만들고 Public Key를 입력합니다:

VITE_CONNECT_BASE_PUBLIC_KEY=cb_pk_여기에_퍼블릭키_입력

💡 Public Key는 ConnectBase 콘솔 → 앱 설정 → Public Keys에서 확인할 수 있습니다. cb_pk_로 시작하는 Public Key를 사용하세요.

2. SDK 설정

프로젝트 어디서든 SDK를 사용할 수 있도록 초기화 파일을 만듭니다.

src/lib/connectbase.ts:

typescript
import ConnectBase from 'connectbase-client'

// ConnectBase SDK 인스턴스를 하나만 만들어 전체 앱에서 공유합니다
export const cb = new ConnectBase({
  publicKey: import.meta.env.VITE_CONNECT_BASE_PUBLIC_KEY
})

3. 로그인 훅 만들기

React에서 로그인 상태를 쉽게 관리하기 위해 커스텀 훅을 만듭니다. 이 훅은 다음을 처리합니다:

  • 페이지 로드 시 토큰이 저장돼 있다면 cb.auth.getMe()로 본인 정보 복원
  • 로그인 함수 호출 시 cb.oauth.signInWithPopup() 팝업 → 토큰 자동 저장 → 본인 정보 조회
  • 로그아웃 함수 호출 시 cb.auth.signOut() (refresh token 폐기 + 로컬 토큰 제거)

src/hooks/useAuth.ts:

typescript
import { useState, useEffect } from 'react'
import type { MemberInfoResponse } from 'connectbase-client'
import { cb } from '../lib/connectbase'

export function useAuth() {
  const [user, setUser] = useState<MemberInfoResponse | null>(null)
  const [loading, setLoading] = useState(true)

  // 앱이 처음 로드될 때 저장된 토큰으로 본인 정보를 복원합니다
  // 토큰이 없거나 만료된 경우 getMe()가 에러를 던지므로 try/catch로 처리
  useEffect(() => {
    cb.auth
      .getMe()
      .then((me) => setUser(me))
      .catch(() => setUser(null))
      .finally(() => setLoading(false))
  }, [])

  // Google 로그인 — 호출하면 OAuth 팝업이 뜨고 완료 시 토큰이 자동 저장됩니다
  const signInWithGoogle = async () => {
    await cb.oauth.signInWithPopup('google')
    setUser(await cb.auth.getMe())
  }

  // Naver 로그인
  const signInWithNaver = async () => {
    await cb.oauth.signInWithPopup('naver')
    setUser(await cb.auth.getMe())
  }

  // 로그아웃
  const signOut = async () => {
    await cb.auth.signOut()
    setUser(null)
  }

  return { user, loading, signInWithGoogle, signInWithNaver, signOut }
}

💡 signInWithPopup은 콜백 URL을 별도로 등록하지 않아도 ConnectBase의 중앙 콜백 페이지를 사용합니다. 리다이렉트 방식을 쓰려면 cb.oauth.signIn(provider, callbackUrl)을 호출하고 callbackUrl 페이지에서 cb.oauth.exchangeCodeFromCallback() 또는 cb.oauth.getCallbackResult()로 결과를 받아오세요.

4. 로그인 페이지 만들기

위에서 만든 useAuth 훅을 사용해 로그인 UI를 만듭니다. 로그인 전에는 소셜 로그인 버튼을, 로그인 후에는 사용자 정보를 보여줍니다.

src/pages/LoginPage.tsx:

tsx
import { useAuth } from '../hooks/useAuth'

export function LoginPage() {
  const { user, loading, signInWithGoogle, signInWithNaver, signOut } = useAuth()

  // 세션 확인 중일 때 로딩 표시
  if (loading) return <p>로딩 중...</p>

  // 이미 로그인된 상태
  // MemberInfoResponse 의 email 은 소셜 로그인 시에만 자동 채워집니다 (없으면 빈 문자열)
  if (user) {
    return (
      <div>
        <p>{user.email || user.nickname}님, 환영합니다!</p>
        <button onClick={signOut}>로그아웃</button>
      </div>
    )
  }

  // 로그인 전 — 소셜 로그인 버튼 표시
  return (
    <div>
      <h1>로그인</h1>
      <button onClick={signInWithGoogle}>Google로 계속하기</button>
      <button onClick={signInWithNaver}>Naver로 계속하기</button>
    </div>
  )
}

5. 실행하기

bash
npm run dev

브라우저에서 http://localhost:5173 을 열면 로그인 페이지가 보입니다.

다음 단계

  • GitHub, Kakao, Apple, Discord 로그인 추가 — 콘솔에서 프로바이더 토글만 켜면 됩니다 (지원: google, naver, github, kakao, apple, discord)
  • 로그인 후 리다이렉트 — 로그인 성공 시 특정 페이지로 자동 이동
  • 사용자 메타데이터 저장cb.auth.updateCustomData({ custom_data: { theme: 'dark' } })로 임의 키-값 저장 (닉네임/이메일은 ConnectBase가 자동 관리)
  • 접근 권한 제어 — 로그인한 사용자만 특정 페이지에 접근하도록 라우트 가드 설정

이 튜토리얼이 도움이 됐나요?