Skip to content

[FEATURE] Clerk 기반 구글 로그인 버튼 적용#33

Merged
kbh0218 merged 5 commits into
devfrom
feat/#28-clerk-google-login
May 16, 2026
Merged

[FEATURE] Clerk 기반 구글 로그인 버튼 적용#33
kbh0218 merged 5 commits into
devfrom
feat/#28-clerk-google-login

Conversation

@kbh0218
Copy link
Copy Markdown
Contributor

@kbh0218 kbh0218 commented May 11, 2026

Closes #28

개요

Clerk 기반 Google 로그인 기능을 Expo 앱에 연결했습니다.

기존 로그인 화면은 버튼 클릭 시 임시로 홈 화면으로 이동하는 상태였지만, 이번 작업에서는 @clerk/expo의 SSO 흐름을 사용해 실제 Google 로그인을 수행하도록 변경했습니다.

현재는 안드로이드 환경에서 우선 Google 로그인만 연동했으며, Apple 로그인은 아직 구현 범위에 포함하지 않았습니다. 따라서 기존 로그인 화면에 있던 Apple 로그인 버튼은 사용자가 동작하지 않는 기능을 선택하지 않도록 비활성화/제거했습니다. 추후 iOS 로그인 정책 및 Clerk Apple 로그인 설정이 준비되면 별도 작업으로 Apple 로그인을 연결할 예정입니다.

로그인 성공 후에는 Clerk 세션을 활성화하고, 백엔드 /api/v1/auth/me API를 호출해 앱 서버의 회원 정보와 동기화하도록 구성했습니다. 백엔드 동기화에 실패한 경우 Clerk 세션이 남아 앱이 로그인된 것처럼 동작하지 않도록 즉시 로그아웃 처리합니다.

또한 앱 진입점과 auth/tabs 레이아웃에 로그인 상태 기반 라우팅 가드를 추가해, 로그인 여부에 따라 로그인 화면 또는 홈 화면으로 이동하도록 정리했습니다. 저장된 세션이 있는 경우에도 백엔드 회원 동기화가 성공한 뒤에만 홈 화면을 표시하도록 처리했습니다.

주요 구현 내용

  • ClerkProvider 및 tokenCache 설정
  • Google SSO 로그인 연동
  • 안드로이드 우선 Google 로그인만 활성화
  • 미구현 상태인 Apple 로그인 버튼 비활성화/제거
  • 로그인 성공 후 Clerk 세션 활성화
  • 백엔드 /api/v1/auth/me 회원 동기화 API 호출
  • 백엔드 동기화 실패 시 Clerk 세션 제거
  • 앱 진입점에서 로그인 상태에 따라 홈/로그인 화면 분기
  • auth 레이아웃에서 로그인 사용자의 로그인 화면 접근 방지
  • tabs 레이아웃에서 비로그인 사용자 접근 방지
  • 저장된 세션에 대한 백엔드 회원 동기화 처리
  • 같은 세션에 대해 회원 동기화가 반복 호출되지 않도록 제어
  • 설정 화면 로그아웃 동작을 Clerk signOut과 연결
  • Clerk SSO callback route 추가
  • EAS 빌드 시 Clerk peer dependency 충돌 방지를 위한 .npmrc 추가

파일별 역할

  • app/_layout.tsx: ClerkProvider, tokenCache, SSO callback route 설정
  • app/index.tsx: 앱 최초 진입 시 로그인 상태에 따라 홈/로그인 화면으로 분기
  • app/(auth)/_layout.tsx: 로그인된 사용자의 auth 화면 접근 방지
  • app/(auth)/login.tsx: Google SSO 로그인 및 백엔드 회원 동기화 처리
  • app/(tabs)/_layout.tsx: 로그인/회원 동기화 완료 여부에 따른 tabs 접근 제어
  • app/(tabs)/(home)/settings.tsx: Clerk 로그아웃 처리 연결
  • app/sso-callback.tsx: Clerk SSO redirect callback route
  • services/auth-api.ts: Clerk 토큰으로 백엔드 /api/v1/auth/me 호출
  • app.json: Clerk Expo plugin 및 native bundle/package 설정
  • package.json, package-lock.json: Clerk/Expo auth 관련 의존성 추가
  • .npmrc: EAS npm ci에서 peer dependency 충돌 방지

해결한 이슈 목록

  • Google 로그인 버튼을 실제 Clerk SSO 로그인 흐름에 연결
  • 로그인 성공 후 Clerk 세션 활성화
  • 로그인 성공 후 백엔드 회원 정보 동기화
  • 백엔드 동기화 실패 시 세션이 남아 홈 화면으로 진입하는 문제 방지
  • 앱 시작 시 로그인 상태에 따른 초기 라우팅 처리
  • 비로그인 사용자의 tabs 접근 방지
  • 로그인 사용자의 로그인 화면 접근 방지
  • 로그아웃 시 Clerk 세션 제거
  • 저장된 세션이 있을 때 회원 동기화 후 홈 화면 표시
  • 동일 세션에서 회원 동기화 API가 반복 호출되는 문제 방지
  • EAS 빌드에서 @clerk/react peer dependency 충돌 해결

체크 사항

  • 커밋/코딩 컨벤션에 맞게 작성
  • npx tsc --noEmit 통과
  • 수정한 파일 대상 npx eslint "app/(tabs)/_layout.tsx" services/auth-api.ts 통과
  • 전체 npm run lint 확인 필요

참고

전체 npm run lint는 기존 파일에서 발생하던 expo-linear-gradient import resolver 오류와 일부 warning으로 실패합니다. 이번 작업에서 수정한 인증 관련 파일의 타입 체크와 개별 lint는 통과했습니다.

백엔드에서 모바일 Clerk 토큰 검증을 보완하는 companion PR이 필요합니다.

Screenshots or Video

ios에선 아래 이미지처럼 두개 모두 뜨게 할 예정입니다.
스크린샷 2026-05-11 144223

안드로이드는 아래 이미지처럼 구글 로그인만 뜨게 할 예정입니다.
image

@kbh0218 kbh0218 requested review from minsoo0506 and sunm2n May 11, 2026 16:47
@kbh0218 kbh0218 self-assigned this May 11, 2026
@kbh0218 kbh0218 added the feature 기능개발 label May 11, 2026
Comment thread app/(auth)/login.tsx
let sessionActivated = false;

try {
const { createdSessionId, setActive } = await startSSOFlow({
Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

startSSOFlow에 native redirectUrl이 없는 것 같습니다.

Clerk 공식 문서는 native에서 AuthSession.makeRedirectUri({ scheme, path }) 형태를 넘기라고 안내하고 있는데 Google 인증은 끝나도 createdSessionId가 안 돌아와 로그인 플로우가 성립하지 않을 수 있기 때문에 확인 부탁드립니다!

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

확인 감사합니다. 말씀 주신 대로 native OAuth 복귀 URL을 명시하도록 수정했습니다.

app/(auth)/login.tsx에서 expo-auth-sessionAuthSession.makeRedirectUri({ scheme: 'linclean', path: 'sso-callback' })로 redirect URL을 생성하고, startSSOFlow 호출 시 redirectUrl로 전달하도록 반영했습니다.

앱 scheme은 app.jsonscheme: 'linclean' 값을 사용했고, callback route는 기존 app/sso-callback.tsx를 사용합니다. 따라서 Google 인증 완료 후 linclean://sso-callback으로 앱에 복귀하고, Clerk SDK가 해당 callback을 통해 createdSessionId를 받을 수 있는 흐름입니다.

참고로 해당 redirect URL이 실제로 동작하려면 Clerk Dashboard의 Redirect URLs에 linclean://sso-callback이 등록되어 있어야 합니다.

Copy link
Copy Markdown

@minsoo0506 minsoo0506 left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

넵 확인했습니다!

…login

# Conflicts:
#	app/(auth)/login.tsx
#	components/ui/kakao-icon.tsx
#	package-lock.json
@kbh0218 kbh0218 merged commit 96791ca into dev May 16, 2026
@kbh0218 kbh0218 deleted the feat/#28-clerk-google-login branch May 16, 2026 05:13
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

feature 기능개발

Projects

None yet

Development

Successfully merging this pull request may close these issues.

[FEATURE] Clerk 기반 구글 로그인 버튼 적용

2 participants