TELEPASI

검색하기 전에 통하다

Google 소셜 로그인 문제 해결 및 참고자료

강병우
2026.07.18 👁️ 115

Google 소셜 로그인 문제 해결 및 참고자료

관련 시리즈
Self-hosted Supabase Google 로그인 설정 (1/3) - 개념과 Google Cloud 설정
Self-hosted Supabase Google 로그인 설정 (2/3) - 서버 설정
Self-hosted Supabase Google 로그인 설정 (3/3) - Web 연동과 테스트

관련 문서
Self-hosted Supabase API 도메인 연결

Google 소셜 로그인 설정 중 문제가 발생했을 때 참고할 수 있는 계층별 진단 방법, 오류 메시지별 대처법, 확인 명령어를 정리한 문서입니다.


1. 계층별 문제 확인

오류가 발생하면 모든 설정을 한꺼번에 바꾸지 말고 어느 구간에서 멈췄는지 확인합니다.

1.1 Web 단계 오류

증상:

  • 로그인 버튼을 눌러도 이동하지 않음
  • 브라우저 콘솔에서 JavaScript 오류 발생
  • redirect_to is not allowed 오류

확인 사항:

  • signInWithOAuth() 호출 여부
  • Frontend .env의 Supabase public URL과 anon key
  • redirectTo 값이 올바른지
  • Backend .envADDITIONAL_REDIRECT_URLS에 Web 주소 포함 여부

확인 명령:

# 브라우저 개발자 도구 → 콘솔 탭에서 JavaScript 오류 확인
# 브라우저 개발자 도구 → 네트워크 탭에서 API 요청 확인

1.2 Supabase API 또는 Server 단계 오류

기본 확인: 먼저 브라우저에서 다음 주소를 엽니다.

https://sb.example.com

Supabase Dashboard 인증 창이나 Supabase 화면이 보이면 DNS, HTTPS, Nginx, Kong의 기본 연결은 정상입니다. 이 경우 Google provider 설정을 확인합니다.

접속되지 않는 경우 화면에 표시된 증상에 따라 확인:

증상 확인 항목
사이트를 찾을 수 없음 DNS A 레코드와 서버 IP 확인
인증서 경고 sb.example.com 인증서 발급·만료 상태 확인
502 Bad Gateway Kong 컨테이너와 Nginx proxy_pass 확인
연결 시간 초과 서버 방화벽의 443 포트와 Nginx 상태 확인
Supabase 화면은 열리지만 Google 로그인 비활성화 Auth 설정 확인

확인 명령:

# DNS 확인
dig +short sb.example.com

# Nginx 상태
systemctl status nginx

# Kong 및 Auth 컨테이너 상태
cd /root/supabase/docker
docker compose ps kong auth

# Auth 로그
docker compose logs --tail=200 auth

# 인증서 확인
certbot certificates

Google provider 관련 확인 항목:

  • .envGOOGLE_ENABLED=true
  • docker-compose.ymlGOTRUE_EXTERNAL_GOOGLE_* 매핑
  • 변경 후 Auth 컨테이너를 다시 생성했는지

1.3 Google 단계 오류

증상:

  • redirect_uri_mismatch
  • access_blocked
  • 테스트 사용자만 로그인 가능

확인 사항:

  • OAuth Client 유형이 웹 애플리케이션인지
  • 승인된 리디렉션 URI가 정확한지 (https://sb.example.com/auth/v1/callback)
  • 앱 대상이 외부인지
  • 테스트 상태라면 사용자를 등록했는지
  • 앱 게시 상태와 필요한 검증을 완료했는지

2. 오류 메시지별 대처법

2.1 redirect_uri_mismatch

의미: Google Cloud의 승인된 리디렉션 URI가 실제 Supabase 콜백과 다릅니다.

정확한 값:

https://sb.example.com/auth/v1/callback

자주 발생하는 실수:

다음 차이도 모두 불일치로 처리됩니다.

  • httphttps
  • example.comwww.example.com
  • 포트 번호 (:443, :8000 등)
  • 경로 (/auth/v1/callback vs /callback)
  • 마지막 슬래시 (/callback vs /callback/)

해결:

  1. Google Cloud Console → OAuth 클라이언트 → 승인된 리디렉션 URI 확인
  2. Backend .envAPI_EXTERNAL_URL 확인
  3. 두 값이 정확히 일치하는지 확인

2.2 Unsupported provider: provider is not enabled

의미: Auth 컨테이너에서 Google provider가 활성화되지 않았습니다.

해결:

  1. Backend .env 확인:
GOOGLE_ENABLED=true
  1. docker-compose.yml의 Auth 서비스에 매핑 확인:
GOTRUE_EXTERNAL_GOOGLE_ENABLED: ${GOOGLE_ENABLED}
  1. Auth 컨테이너 재생성:
cd /root/supabase/docker
docker compose up -d --force-recreate --no-deps auth

2.3 redirect_to is not allowed

의미: Web 코드의 redirectTo가 Supabase 허용 목록에 없습니다.

해결:

Backend .env에서 ADDITIONAL_REDIRECT_URLS 확인:

ADDITIONAL_REDIRECT_URLS=https://example.com/*,https://www.example.com/*

수정 후 Auth 컨테이너 재생성:

docker compose up -d --force-recreate --no-deps auth

2.4 Google access_blocked

의미: Google 앱 설정이 완료되지 않았거나 테스트 사용자가 아닙니다.

원인:

  • Google 앱이 테스트 상태인데 로그인 계정이 테스트 사용자로 등록되지 않음
  • 앱 브랜딩·대상·범위 설정이 완료되지 않음

해결:

  1. Google Cloud Console → OAuth 동의 화면 확인
  2. 앱 대상이 "외부"인지 확인
  3. 테스트 상태라면 테스트 사용자에 계정 추가
  4. 브랜딩 정보 입력 완료 여부 확인

2.5 로그인 후 잘못된 사이트로 이동

의미: 복귀 주소 설정이 잘못되었습니다.

확인할 세 값:

1. Backend SITE_URL
2. Backend ADDITIONAL_REDIRECT_URLS
3. Frontend 코드의 redirectTo

해결:

  1. Backend .env:
SITE_URL=https://example.com
ADDITIONAL_REDIRECT_URLS=https://example.com/*,https://www.example.com/*
  1. Frontend 코드:
redirectTo: `${window.location.origin}/auth/callback`
  1. 모든 주소가 동일한 도메인으로 설정되었는지 확인

2.6 로그인 후 세션이 없음

원인:

  • Web 콜백에 code가 없음
  • PKCE 환경에서 exchangeCodeForSession() 미호출
  • 동일한 code를 두 번 교환함
  • 세션이 브라우저 저장소에 저장되지 않음
  • Nginx의 X-Forwarded-Protohttps가 아님

해결:

  1. 브라우저 개발자 도구 → 네트워크 탭에서 /auth/callback URL 확인
  2. URL에 code 파라미터가 있는지 확인
https://example.com/auth/callback?code=XXXXX
  1. Frontend 코드에서 exchangeCodeForSession() 호출 확인:
const url = new URL(window.location.href)
const code = url.searchParams.get('code')

if (code) {
  await supabase.auth.exchangeCodeForSession(url.href)
}
  1. 브라우저 저장소 확인:

    • 개발자 도구 → 애플리케이션 → 로컬 스토리지
    • supabase-auth-token 키가 있는지 확인
  2. Nginx 설정 확인:

proxy_set_header X-Forwarded-Proto $scheme;

2.7 Auth 컨테이너가 시작되지 않음

확인:

cd /root/supabase/docker
docker compose logs --tail=200 auth

주요 원인:

  • Client ID 또는 Secret 누락
  • 잘못된 URL 형식
  • docker-compose.yml YAML 들여쓰기 오류
  • .env 변수가 Compose에 전달되지 않음

해결:

  1. .env 파일 검증:
cat .env | grep GOOGLE
  1. Compose 파일 검증:
docker compose config | grep -A 5 GOTRUE_EXTERNAL_GOOGLE
  1. 환경 변수가 Auth 컨테이너에 전달되었는지 확인:
docker exec supabase-auth env | grep GOTRUE_EXTERNAL_GOOGLE

3. 유용한 확인 명령어 모음

3.1 Google Provider 활성화 확인

Supabase 공개 anon key를 사용해 Auth 설정 API를 조회합니다.

cd /root/supabase/docker
set -a
. ./.env
set +a

curl -s \
  -H "apikey: $ANON_KEY" \
  https://sb.example.com/auth/v1/settings | jq '.external'

정상 응답:

{
  "google": true
}

3.2 Auth 컨테이너 환경 변수 확인

Secret 값을 직접 출력하지 않고 설정 여부만 확인합니다.

docker exec supabase-auth sh -c '
  echo "enabled=$GOTRUE_EXTERNAL_GOOGLE_ENABLED"
  echo "redirect=$GOTRUE_EXTERNAL_GOOGLE_REDIRECT_URI"
  test -n "$GOTRUE_EXTERNAL_GOOGLE_CLIENT_ID" && echo "client_id=set"
  test -n "$GOTRUE_EXTERNAL_GOOGLE_SECRET" && echo "secret=set"
'

정상 출력:

enabled=true
redirect=https://sb.example.com/auth/v1/callback
client_id=set
secret=set

3.3 외부 콜백 경로 확인

curl -I https://sb.example.com/auth/v1/callback

콜백을 직접 호출하면 정상 OAuth 요청이 아니므로 4xx 오류가 나올 수 있습니다. 중요한 것은 DNS, HTTPS, Nginx 오류가 아니라 Supabase Auth의 HTTP 응답을 받는지 여부입니다.

3.4 데이터베이스에서 사용자 확인

docker exec supabase-db psql -U postgres -d postgres -c \
  "SELECT id, email, created_at, raw_user_meta_data->>'full_name' as name 
   FROM auth.users 
   ORDER BY created_at DESC 
   LIMIT 5;"

3.5 Kong 라우팅 설정 확인

cat /root/supabase/docker/volumes/api/kong.yml | grep -A 10 auth-v1-open-callback

3.6 포트 리스닝 상태 확인

# Nginx 443 포트
ss -lntp | grep :443

# Kong 8000 포트
ss -lntp | grep :8000

# 전체 Supabase 관련 포트
ss -lntp | grep -E ':(443|8000|8443|9999)\b'

4. 최종 설정 요약

4.1 Google Cloud

애플리케이션 유형:
웹 애플리케이션

승인된 JavaScript 원본:
https://example.com
https://www.example.com

승인된 리디렉션 URI:
https://sb.example.com/auth/v1/callback

4.2 Backend 서버 .env

# API 주소
SUPABASE_PUBLIC_URL=https://sb.example.com
API_EXTERNAL_URL=https://sb.example.com

# Web 복귀 주소
SITE_URL=https://example.com
ADDITIONAL_REDIRECT_URLS=https://example.com/*,https://www.example.com/*

# Google Provider
GOOGLE_ENABLED=true
GOOGLE_CLIENT_ID=YOUR_CLIENT_ID.apps.googleusercontent.com
GOOGLE_SECRET=YOUR_GOOGLE_CLIENT_SECRET

4.3 Docker Compose 매핑

services:
  auth:
    environment:
      API_EXTERNAL_URL: ${API_EXTERNAL_URL}
      GOTRUE_SITE_URL: ${SITE_URL}
      GOTRUE_URI_ALLOW_LIST: ${ADDITIONAL_REDIRECT_URLS}
      
      GOTRUE_EXTERNAL_GOOGLE_ENABLED: ${GOOGLE_ENABLED}
      GOTRUE_EXTERNAL_GOOGLE_CLIENT_ID: ${GOOGLE_CLIENT_ID}
      GOTRUE_EXTERNAL_GOOGLE_SECRET: ${GOOGLE_SECRET}
      GOTRUE_EXTERNAL_GOOGLE_REDIRECT_URI: ${API_EXTERNAL_URL}/auth/v1/callback

4.4 Frontend .env

PUBLIC_SUPABASE_URL=https://sb.example.com
PUBLIC_SUPABASE_ANON_KEY=YOUR_SUPABASE_ANON_OR_PUBLISHABLE_KEY

4.5 Frontend 코드

// 로그인 시작
await supabase.auth.signInWithOAuth({
  provider: 'google',
  options: {
    redirectTo: `${window.location.origin}/auth/callback`,
  },
})

// 세션 교환 (/auth/callback 페이지)
const url = new URL(window.location.href)
const code = url.searchParams.get('code')

if (code) {
  await supabase.auth.exchangeCodeForSession(url.href)
}

4.6 가장 중요한 두 주소

Google이 돌아오는 Supabase API:
https://sb.example.com/auth/v1/callback

Supabase가 사용자를 보내는 Web:
https://example.com/auth/callback

5. 보안 관련 참고

5.1 Secret 교체 절차

Google Client Secret이 유출되었다면:

  1. Google Cloud에서 새 Client Secret을 발급합니다.
  2. Backend 서버 .envGOOGLE_SECRET을 교체합니다.
  3. Auth 컨테이너를 다시 생성합니다.
cd /root/supabase/docker
docker compose up -d --force-recreate --no-deps auth
  1. Google 로그인을 테스트합니다.
  2. 기존 Secret을 Google Cloud에서 삭제합니다.

5.2 보안 체크리스트

  • Google Client Secret은 Backend 서버 .env에만 저장
  • Backend .env가 Git 추적 대상이 아닌지 확인
  • Google 승인 리디렉션 URI는 필요한 주소만 등록
  • ADDITIONAL_REDIRECT_URLS를 불필요하게 넓히지 않음
  • Frontend에는 anon/publishable key만 사용
  • SERVICE_ROLE_KEY는 브라우저와 공개 문서에 노출 금지
  • Web과 API 모두 HTTPS 사용
  • 운영 환경에서 불필요한 localhost 복귀 주소 제거

6. 공식 참고 링크

6.1 Supabase 공식 문서

6.2 Google 공식 문서

6.3 기타 참고


작성일: 2026-07-18
적용 환경: Docker 기반 Self-hosted Supabase + SvelteKit

주파수 소통방 (0)

로딩 중...