Expo, Clerk 및 iOS를 사용한 Google OAuth 로그인 — 드디어 해명됨

발행: (2026년 1월 4일 오전 11:53 GMT+9)
6 min read
원문: Dev.to

Source: Dev.to

Client ID + Client Secret: 소개용 명함 (및 신원 증명)

Google과 Clerk를 두 개의 회사라고 생각해 보세요.

  • Client ID – 앱의 “명함”(공개 신원).
  • Client Secret – 앱의 “봉인된 편지 / 개인 스탬프”(비공개 증명).

Google에서 가져온 이 값을 Clerk에 붙여넣으면, 기본적으로 다음과 같이 말하는 것입니다:

“Clerk, 내 앱이 ‘당신이 기대하는 Google 앱입니다’라고 말할 때, 여기 공식 신분증과 비공개 증명이 있습니다. 이를 통해 내가 진짜임을 신뢰할 수 있습니다.”

Why it matters: 이 공식적인 소개가 없으면 Clerk는 내 앱으로서 Google과 자신 있게 통신할 수 없으며, Google은 어떤 OAuth 앱 설정 규칙을 적용해야 할지 알 수 없습니다.

Redirect URL must match: 릴레이 경주 배턴 전달

OAuth는 릴레이 경주와 같습니다:

  1. 앱이 러너를 Google(로그인 화면)으로 보냅니다.
  2. Google이 자신의 구간을 마칩니다(사용자 인증).
  3. Google은 배턴을 올바른 다음 러너에게 전달해야 합니다.

그 “전달 지점”이 바로 Redirect URL입니다.

Rule: Google이 배턴을 전달하도록 허용된 Redirect URL은 앱/Clerk가 기대하는 것과 일치해야 합니다.

그래서 두 대시보드를 확인합니다:

  • Google Cloud Console: “허용된 전달 주소입니다.”
  • Clerk: “내가 기대하는 전달 주소입니다.”

일치하지 않으면 Google은 배턴 전달을 거부합니다(보안 위험이 될 수 있기 때문입니다).

iOS must understand the redirect URL: Google → iOS → Your App

모바일에서는 배턴이 자동으로 바로 앱으로 돌아가지 않습니다. 실제 흐름은 다음과 같습니다:

Google → iOS (system) → Your App

따라서 iOS는 다음을 알아야 합니다:

“이와 같은 URL을 보면, 어떤 설치된 앱이 받아야 할까요?”

이것이 아래 항목들의 역할입니다:

  • app.json scheme – 앱이 소유한 “특수 주소 형식”을 등록합니다(우편함을 차지하는 것과 유사).
  • Expo Linking – 앱이 들어오는 Redirect를 수신하고 파싱하도록 도와 로그인 흐름을 재개할 수 있게 합니다.

쉽게 말해: app.json은 iOS에 어떤 앱이 해당 URL을 소유하고 있는지 알려주고, Linking은 앱이 편지를 열어 Google이 보낸 내용을 읽을 수 있게 합니다.

Secure Store: 경기 후 배턴을 보관하는 곳

OAuth가 성공하면, 전화기에 민감한 데이터(세션 토큰 / 리프레시 토큰 등)가 저장됩니다.

Key idea: 모바일 앱은 평문 저장소에 비밀을 보관하기에 안전한 장소가 아닙니다. 토큰은 “로그인 증명”과 같습니다. 도난당하면 복사된 키카드처럼 재사용될 수 있습니다.

Solution: 전화기에 내장된 금고인 Secure Store를 사용합니다:

  • 내부적으로 iOS Keychain / Android Keystore 사용.
  • OS가 암호화하고 보호합니다.

Why it usually needs a rebuild: Secure Store는 네이티브 기능입니다. 프로젝트에 이미 네이티브 빌드에 포함되어 있지 않거나 네이티브 설정을 변경하면, 제대로 사용하기 위해 새로운 네이티브 빌드가 필요합니다.

스토리로 표현하면: 앱이 배턴(토큰)을 받으면 테이블에 두지 않고 호텔 금고(Secure Store)에 넣어, 당신이 보지 않을 때 누군가 복사하지 못하게 합니다.

One‑line summary

  • Client ID/Secret = 당신이 누구인지(공식 소개)
  • Redirect URL = 배턴이 가는 위치(전달 지점)
  • Scheme/Linking = iOS가 라우팅하는 방법(Google → iOS → 앱)
  • Secure Store = 결과를 보관하는 장소(금고에 토큰 보관)

Code to follow…

다음에 React Native 코드를 여기 붙여넣을 예정입니다… 기대해 주세요!

Back to Blog

관련 글

더 보기 »