Currently viewing the human version
Switch to AI version

GoTrue가 뭔데 이렇게 난리야?

아니 진짜, 또 다른 인증 서비스 얘기냐고? 듣기만 해도 머리 아픈데... 근데 잠깐, GoTrue는 좀 다르다.

내가 Auth0 때문에 한 달에 거의 500달러씩 나가는 거 보고 혈압 올라서 찾아본 건데, 이거 진짜 혁명이다.

왜 GoTrue인가?

일단 Supabase가 Firebase 대신 쓰려고 만든 백엔드 스택의 핵심이 바로 이 GoTrue다. 그냥 또 다른 Auth 서비스가 아니라 진짜 개발자를 위한 인증 솔루션이라고 보면 된다.

Supabase Architecture

뭔가 특별한가?

GoTrue는 원래 Netlify에서 만든 것Supabase가 포크해서 개발하고 있다. 릴리즈 노트 보면 버그픽스가 꽤 활발하고, 매월 보안 패치나 기능 업데이트가 나오고 있다.

아 그리고 이거 설치할 때 좀 골치 아팠는데, PostgreSQL 버전 문제가 있더라. 나처럼 우분투 18.04에서 PostgreSQL 12 쓰고 있었는데... 진짜 멍청하게 pg_dump 없이 바로 업그레이드 시도했다가 DB 날릴 뻔했다. 새벽 3시에 식은땀 흘리면서 백업 복구하던 그날 밤은 잊을 수 없다.

핵심은 이거다:

  • JWT 토큰 발급: 표준 JWT로 사용자 인증 (이게 뭔지 모르면 구글링부터)
  • PostgreSQL RLS 통합: Row Level Security와 바로 연동됨
  • PostgREST 연계: API 서버와 완벽한 호환
  • 오픈소스: MIT 라이센스로 자유롭게 사용 가능

솔직히 말하면 Auth0보다 나은 점이 많다

Auth0 쓰다가 요금 폭탄 맞아본 사람들은 안다. MAU 10만 넘어가면 진짜 눈물난다. 내가 직접 써보니까 Auth0 Professional 플랜이 월 240달러부터 시작한다. GoTrue는?

  • 거의 무료: Supabase Pro 플랜 월 25달러에 10만 MAU 포함
  • 데이터 소유권: 내 PostgreSQL DB에 사용자 데이터 저장
  • Lock-in 없음: pg_dump로 언제든 마이그레이션 가능
  • 한국 서버 배포 가능: AWS Seoul 리전에 직접 배포하면 지연시간 Zero

하지만 솔직히 말하면 단점도 있다. Auth0 엔터프라이즈 기능만큼 기업 기능이 완벽하지 않고, 한국어 커뮤니티도 별로 없다. 문제 생기면 GitHub 이슈나 Discord에서 영어로 싸워야 함. 그래도 개발자가 직접 제어할 수 있다는 게 가장 큰 장점.

누가 실제로 쓰고 있나?

Supabase 자체가 지금 80만 프로젝트 넘게 돌아가고 있다고 하는데... GitHub 스타는 지금 보니까 8만 넘게 있더라. 작년에 7만대였는데 꽤 올랐네. 아무튼 확실히 개발자들이 많이 쓰고 있다.

국내에서도 스타트업들이 Firebase 대신 Supabase + GoTrue 조합으로 갈아타고 있는데, 특히 B2B SaaS나 핀테크처럼 데이터 주권이 중요한 서비스들이 많이 쓴다.

개발자 경험도 나쁘지 않다

JWT Token Structure

// 회원가입이 이렇게 간단하다
const { data, error } = await supabase.auth.signUp({
  email: 'user@example.com',
  password: 'securepassword'
})

REST API도 깔끔하고, 대부분의 프레임워크에서 SDK 지원한다. React, Vue, Next.js, Flutter 다 된다.

한국 개발자들이 알아야 할 것

카카오, Google, GitHub주요 OAuth 제공업체도 당연히 지원하고, 국내 SMS 인증도 Twilio나 다른 provider 연동하면 바로 된다.

무엇보다 GDPR이나 개인정보보호법 대응할 때 데이터가 내 DB에 있다는 게 엄청난 장점이다. Auth0 쓰면 사용자 데이터가 미국에 있어서 골치 아픈데, GoTrue는 내가 원하는 곳에 배포하면 끝.

GoTrue vs 다른 인증 솔루션 비교

기능

GoTrue (Supabase)

Auth0

Firebase Auth

AWS Cognito

가격 (1K MAU 기준)

$0 (10만까지 무료)

$240/월**

$150-300/월***

$275/월****

데이터 소유권

✅ 내 DB

❌ Auth0 서버

❌ Google 서버

❌ AWS 서버

오픈소스

✅ MIT

❌ 상용

❌ 상용

❌ 상용

Self-hosting

✅ 가능 (단, 삽질 필요)

❌ 불가능

❌ 불가능

❌ 불가능

PostgreSQL 통합

✅ Native RLS

❌ 별도 연동

❌ 별도 연동

❌ 별도 연동

JWT 토큰

✅ 표준 JWT

✅ 표준 JWT

✅ 표준 JWT

✅ 표준 JWT

소셜 OAuth

✅ 20+ providers

✅ 30+ providers

✅ 15+ providers

✅ 10+ providers

MFA 지원

✅ TOTP, SMS

✅ 거의 모든 방식

✅ SMS, 앱

✅ SMS, 하드웨어

한국어 문서

❌ 거의 없음

⚠️ 일부 번역

✅ 많음

✅ AWS 한글 문서

개발자 경험

✅ 괜찮음

✅ 우수 (비쌈)

✅ 매우 우수

❌ 복잡함

벤더 Lock-in

✅ 낮음

❌ 높음

❌ 높음

❌ 높음

국내 서버 배포

✅ 어디든

❌ 제한적

❌ 불가능

✅ Seoul 리전

GoTrue 핵심 기능과 실제 구현

진짜 개발할 때 알아야 할 GoTrue의 핵심 기능들을 파헤쳐보자. 마케팅 헛소리 말고 실제로 코딩할 때 필요한 것들만.

아키텍처: 어떻게 돌아가는가?

GoTrue는 Kong API Gateway 뒤에서 돌아가면서 다음 컴포넌트들과 연동된다:

GoTrue Architecture

GoTrue 아키텍처 구조:

Client (브라우저/앱) → [Kong API Gateway](https://docs.konghq.com/) → [GoTrue Auth Service](https://github.com/supabase/auth) → [PostgreSQL DB](https://www.postgresql.org/)
                                      ↓
                                PostgREST (자동 API)
                                      ↓
                                Realtime (WebSocket)
  • PostgreSQL: 사용자 데이터 저장소
  • PostgREST: 자동 API 생성 + RLS 적용
  • Realtime: WebSocket 연결 관리
  • Storage: 파일 업로드 인증

핵심은 모든 인증이 PostgreSQL의 Row Level Security(RLS)와 연결된다는 점이다. 이게 다른 인증 서비스와의 가장 큰 차이점.

JWT 토큰과 RLS 연동: 이게 진짜 킬러 기능

-- 이렇게 하면 됨
CREATE POLICY "사용자는 자신의 데이터만 조회" ON profiles
  FOR SELECT USING (auth.uid() = id);

-- JWT 토큰의 user_id가 자동으로 auth.uid()에 들어감
-- 별도 인증 로직 필요 없음!

진짜 개꿀이다. Express에서 매번 req.user.id로 체크하던 그 귀찮은 일들이 데이터베이스 레벨에서 자동으로 처리된다.

지원하는 인증 방식들

1. 이메일/비밀번호

const { data, error } = await supabase.auth.signUp({
  email: 'dev@example.com',
  password: 'secure123!'
})

2. 매직링크 (비밀번호 없는 로그인)

const { data, error } = await supabase.auth.signInWithOtp({
  email: 'dev@example.com',
  options: {
    emailRedirectTo: 'https://myapp.com/auth/callback'
  }
})

JWT Authentication Flow

3. 소셜 OAuth (카카오, 네이버, 구글 등)

const { data, error } = await supabase.auth.signInWithOAuth({
  provider: 'google',
  options: {
    redirectTo: 'https://myapp.com/auth/callback'
  }
})

4. 전화번호 + SMS OTP

const { data, error } = await supabase.auth.signInWithOtp({
  phone: '+821012345678',
})

5. 익명 로그인 (게스트 사용자)

const { data, error } = await supabase.auth.signInAnonymously()

실제 배포할 때 알아야 할 것들

환경변수 설정 (중요!)

## 기본 설정
GOTRUE_SITE_URL=https://myapp.com
GOTRUE_JWT_SECRET=your-super-secret-jwt-secret
GOTRUE_JWT_EXP=3600

## 데이터베이스
DATABASE_URL=postgresql://user:pass@localhost:5432/mydb

## 이메일 발송 (SMTP)
GOTRUE_SMTP_HOST=smtp.gmail.com
GOTRUE_SMTP_PORT=587
GOTRUE_SMTP_USER=myapp@gmail.com
GOTRUE_SMTP_PASS=app-password

## 소셜 OAuth (구글 예시)
GOTRUE_EXTERNAL_GOOGLE_ENABLED=true
GOTRUE_EXTERNAL_GOOGLE_CLIENT_ID=your-google-client-id
GOTRUE_EXTERNAL_GOOGLE_SECRET=your-google-secret
GOTRUE_EXTERNAL_GOOGLE_REDIRECT_URI=https://myapp.com/auth/callback

Docker로 배포하기

Docker Architecture

FROM supabase/gotrue:latest

COPY .env .env

EXPOSE 9999

CMD ["gotrue"]

근데 이 Docker 이미지가 ARM64 Mac에서 가끔 안 되는 경우가 있다. 그럴 때는 --platform linux/amd64 옵션 붙여서 실행하면 된다:

docker run --platform linux/amd64 -p 9999:9999 --env-file .env supabase/gotrue:latest

또는 Supabase CLI로 로컬에서 테스트:

npx supabase start
## 자동으로 GoTrue가 localhost:54321에서 실행됨
## 안 되면 Docker Desktop 실행되어 있는지 확인

첫 번째 실행할 때 Docker 이미지 다운받느라 한참 걸린다. 내가 측정해보니까 대충 20분은 걸렸나? 아니 내 인터넷이 느린 건가... 어쨌든 시간 오래 걸리니까 인내심 가져라. 그리고 RAM 8GB는 있어야 제대로 돈다. 내가 옛날 노트북에서 돌리다가 Docker Desktop 뻗고 블루스크린까지 떴다. 진짜 개빡쳤음.

한국 개발자들이 자주 하는 실수들

1. JWT Secret 관리

Security Warning

절대로 .env 파일을 git에 커밋하지 마라. JWT_SECRET이 노출되면 누구나 가짜 토큰 만들 수 있다.

내가 한 번 .env 파일을 실수로 commit했더니 GitHub에서 20분 만에 "Secret detected in your repository"라는 제목으로 이메일이 왔다. 진짜 등골이 오싹했음. 바로 secret 갈아치우고 모든 토큰 무효화시켰는데, 사용자들이 다 로그아웃되면서 슬랙에 문의 메시지 폭탄 맞았다.

2. CORS 설정

## 이렇게 하면 안 됨 - localhost는 프로덕션에서 안 됨
GOTRUE_API_EXTERNAL_URL=localhost:9999

## 이렇게 해야 함
GOTRUE_API_EXTERNAL_URL=https://auth.myapp.com

이거 때문에 브라우저에서 Access to fetch at 'localhost:9999' from origin 'https://myapp.com' has been blocked by CORS policy 에러 뜨면서... 새벽 2시에 배포하다가 이 빨간 에러 보고 진짜 모니터 뒤질뻔했음. 온갖 Stack Overflow 글 다 뒤지고 Docker 재시작하고 .env 파일 100번 바꿔봤는데 결국 URL 설정이 문제였다.

3. RLS 정책 누락

PostgreSQL에서 RLS 활성화 안 하면 모든 데이터가 공개된다:

-- 필수! 모든 테이블에 설정해야 함
ALTER TABLE profiles ENABLE ROW LEVEL SECURITY;

-- 정책도 꼭 만들어야 함 (이거 안 하면 아무것도 안 보임)
CREATE POLICY "Users can view own profile" ON profiles
  FOR SELECT USING (auth.uid() = id);

이거 빼먹고 배포했다가 사용자 A가 사용자 B, C, D... 모든 사람의 개인정보를 다 볼 수 있는 개념탈선급 참사가 일어났다. 다행히 베타 유저 20명 정도였는데도 진짜 식은땀 범벅이었음. 1분도 안 되서 hotfix 배포했는데 그 1분이 1년 같았다.

4. Rate Limiting 설정 안함

Performance Dashboard

무료 이메일 발송 할당량 금방 소진됨:

GOTRUE_RATE_LIMIT_EMAIL_SENT=60  # 시간당 이메일 60개로 제한 (현실적인 숫자)

내가 천재같이 무제한으로 설정했나? 그랬더니 어떤 악질이 스크립트 돌려서 몇 시간만에 SendGrid 무료 플랜 한도 다 털렸다. SendGrid에서 "Suspicious activity detected" 이메일 와서 계정 정지먹었고, 회원가입 이메일 인증이 안 되니까 서비스가 개박살났다. 토요일 저녁에 Resend로 갈아타느라 밤샜다.

성능과 확장성

성능은 어느 정도일까 (현실적으로)

  • 동시 요청: 실제 프로덕션에서는 DB 병목이 먼저 와서 정확한 수치는 환경마다 다름
  • JWT 검증: 빠르긴 한데 네트워크 지연이 더 큰 문제
  • 데이터베이스 연결: Connection Pooling 덕분에 괜찮은 편. 근데 PostgreSQL 튜닝 안 하면 소용없음

프로덕션 배포 팁

## docker-compose.yml
version: '3.8'
services:
  gotrue:
    image: supabase/gotrue:latest
    environment:
      - GOTRUE_DB_MAX_POOL_SIZE=100  # DB 연결 풀 크기
      - GOTRUE_RATE_LIMIT_HEADER=X-Forwarded-For  # 로드밸런서 뒤에서 실행시
    deploy:
      replicas: 3  # 고가용성을 위한 멀티 인스턴스

모니터링 설정

Monitoring Setup

## OpenTelemetry 메트릭 활성화
GOTRUE_METRICS_ENABLED=true
GOTRUE_METRICS_EXPORTER=prometheus
OTEL_EXPORTER_PROMETHEUS_PORT=9100

Grafana 대시보드와 Prometheus 연동하면 실시간 모니터링 가능하다.

마이그레이션: 기존 서비스에서 갈아타기

Auth0에서 GoTrue로

Migration Process

// 기존 Auth0 사용자 데이터 마이그레이션
const migrateUser = async (auth0User) => {
  const { data, error } = await supabase.auth.admin.createUser({
    email: auth0User.email,
    email_confirm: true,
    user_metadata: auth0User.user_metadata
  })
}

[Firebase Auth](https://firebase.google.com/docs/auth)에서 GoTrue로

Firebase의 uid를 GoTrue의 id로 매핑하는 스크립트 필요. 공식 마이그레이션 가이드를 참고하자.

결론적으로, GoTrue는 개발자가 직접 제어할 수 있는 인증 시스템이 필요한 프로젝트에 최적이다. Auth0처럼 편하면서도 Firebase처럼 종속되지 않는 그 중간 지점을 제대로 찾은 솔루션이라고 보면 된다.

GoTrue 자주 묻는 질문들

Q

GoTrue는 완전 무료인가요?

A

코드 자체는 오픈소스라 무료다. 하지만 Supabase 호스팅 쓰면 돈 든다:

  • Free: MAU 50K까지 무료 (1주일 안 쓰면 정지됨)
  • Pro: $25/월 (MAU 100K 포함, 그 이후 추가 요금)
  • Team: $599/월 (기업용 - 개인 개발자한테는 사치)

Self-hosting하면 서버비만 내면 되는데, 설정하고 관리하는 게 생각보다 귀찮다. 시간 vs 돈의 트레이드오프.

Q

Auth0에서 GoTrue로 마이그레이션이 어렵나요?

A

"간단하다"고 말하고 싶지만 솔직히 좀 짜증난다. 특히 Auth0 사용자 데이터가 많으면:

  1. 사용자 데이터 export: Auth0 Management API로 긁어와야 함 (Rate limit 있어서 시간 오래 걸림)
  2. 비밀번호는 못 가져옴: 사용자들한테 비밀번호 재설정 강제해야 함
  3. Metadata 구조 다름: Auth0의 app_metadata, user_metadata 구조가 좀 다름
// 이런 식으로 하긴 하는데 실제로는 더 복잡함
const migrateUsers = async () => {
  const auth0Users = await getAuth0Users() // 이것부터 삽질

  for (const user of auth0Users) {
    try {
      await supabase.auth.admin.createUser({
        email: user.email,
        email_confirm: true,
        user_metadata: user.user_metadata,
        app_metadata: user.app_metadata
      })
    } catch (error) {
      console.log(`Failed to migrate ${user.email}:`, error)
      // 실패한 사용자들 따로 처리해야 함
    }
  }
}

공식 가이드는 있는데 실제 production 환경에서는 더 복잡한 경우가 많다.

Q

카카오, 네이버 OAuth 연동이 되나요?

A

일단 "된다"고는 하는데... 카카오 개발자 센터에서 앱 등록하고 설정하는 게 은근 복잡하다.

GOTRUE_EXTERNAL_KAKAO_ENABLED=true
GOTRUE_EXTERNAL_KAKAO_CLIENT_ID=your-kakao-app-id
GOTRUE_EXTERNAL_KAKAO_SECRET=your-kakao-secret
GOTRUE_EXTERNAL_KAKAO_REDIRECT_URI=https://your-app.com/auth/callback

근데 카카오 OAuth는 GoTrue에서 기본 지원 안 하고 커스터마이징 필요할 수도 있다. 네이버도 마찬가지. 구글, GitHub 같은 건 바로 되는데 한국 서비스들은 좀 손 봐야 함.

Q

SMS 인증은 어떻게 설정하나요?

A

SMS 인증은 Twilio나 다른 provider 써야 한다:

SMS_PROVIDER=twilio
SMS_TWILIO_ACCOUNT_SID=your-twilio-sid
SMS_TWILIO_AUTH_TOKEN=your-twilio-token
SMS_TWILIO_MESSAGE_SERVICE_SID=your-twilio-number

근데 한국에서 SMS 발송하려면 국내 업체 써야 할 수도 있다. Twilio는 한국 번호 지원이 애매한 경우가 있음. 알리고(Aligo)나 NHN 같은 곳 쓰는 게 나을 수도. 내가 Twilio로 010-1234-5678 인증 테스트하다가 SMS가 안 와서... 4시간 동안 Twilio 문서 뒤지고 Stack Overflow 다 뒤졌는데 결국 국가 코드를 +82로 바꿔야 한다는 걸 뒤늦게 알았다. 멍청했다.

Q

PostgreSQL RLS가 정확히 뭔가요?

A

Row Level Security. 데이터베이스 레벨에서 사용자별 데이터 접근 제어:

-- 이 정책으로 사용자는 자신의 데이터만 볼 수 있음
CREATE POLICY "own_data_only" ON user_profiles
  FOR ALL USING (auth.uid() = user_id);

GoTrue JWT 토큰의 sub 필드가 auth.uid()로 자동 매핑된다.

Q

JWT 토큰 만료시간은 어떻게 설정하나요?

A
GOTRUE_JWT_EXP=3600  # 1시간 (초 단위)

Refresh token도 자동으로 처리되니까 클라이언트에서는 신경 안 써도 된다.

Q

사용자 메타데이터는 어떻게 저장하나요?

A

user_metadataapp_metadata 두 종류:

// user_metadata: 사용자가 수정 가능
await supabase.auth.updateUser({
  data: {
    nickname: '개발왕',
    profile_image: 'https://...'
  }
})

// app_metadata: 관리자만 수정 가능 (역할, 권한 등)
await supabase.auth.admin.updateUserById(userId, {
  app_metadata: { role: 'admin', plan: 'premium' }
})
Q

Docker로 배포할 때 주의사항이 있나요?

A

환경변수 관리가 핵심:

FROM supabase/gotrue:latest

## 환경변수는 런타임에 주입
ENV GOTRUE_SITE_URL=https://myapp.com
ENV DATABASE_URL=${DATABASE_URL}

EXPOSE 9999
CMD ["gotrue"]

절대로 JWT_SECRET을 이미지에 하드코딩하지 마라. 한 번 내가 멍청하게 COPY .env ./ 이걸 Dockerfile에 넣어서 DockerHub에 올렸는데... 공개 저장소라서 전세계에 내 JWT secret이 노출됐다. 밤 11시에 발견하고 새벽까지 모든 토큰 갈아치우고 사용자들한테 사과 메일 보냈다.

Q

로드밸런서 뒤에서 실행할 때 설정은?

A
GOTRUE_API_HOST=0.0.0.0  # 모든 인터페이스에서 수신
GOTRUE_API_EXTERNAL_URL=https://auth.myapp.com  # 실제 외부 URL
GOTRUE_RATE_LIMIT_HEADER=X-Forwarded-For  # 실제 클라이언트 IP 추적
Q

백업과 복구는 어떻게 하나요?

A

사용자 데이터는 PostgreSQL에 있으니까 일반적인 DB 백업으로 충분:

## 백업
pg_dump -h localhost -U postgres -d myapp > backup.sql

## 복구
psql -h localhost -U postgres -d myapp < backup.sql

GoTrue 설정은 환경변수니까 별도 백업 필요 없음.

Q

GDPR 대응은 어떻게 하나요?

A

사용자 데이터가 내 PostgreSQL에 있으니까 완전 제어 가능:

-- 사용자 데이터 완전 삭제
DELETE FROM auth.users WHERE id = 'user-uuid';
-- RLS 정책으로 관련 모든 데이터 자동 삭제됨
Q

JWT Secret이 노출되면 어떻게 하나요?

A

즉시 새 Secret으로 교체하고 모든 토큰 무효화:

## 새 Secret 설정
GOTRUE_JWT_SECRET=new-super-secret-key

## 기존 토큰들은 자동으로 검증 실패됨

Refresh token rotation 기능도 있어서 보안 강화 가능:

GOTRUE_SECURITY_REFRESH_TOKEN_ROTATION_ENABLED=true
Q

Rate limiting은 어떻게 설정하나요?

A
GOTRUE_RATE_LIMIT_EMAIL_SENT=60    # 시간당 이메일 60개
GOTRUE_RATE_LIMIT_HEADER=X-Real-IP # Rate limit 기준 헤더
Q

동시 사용자가 많을 때도 괜찮나요?

A

PostgreSQL connection pooling으로 최적화:

GOTRUE_DB_MAX_POOL_SIZE=50  # DB 연결 풀 크기

실제 Supabase에서 수십만 사용자 규모까지 검증됐다.

Q

모니터링은 어떻게 하나요?

A

OpenTelemetry 메트릭 지원:

GOTRUE_METRICS_ENABLED=true
GOTRUE_METRICS_EXPORTER=prometheus

Grafana 대시보드로 실시간 모니터링 가능.

Q

한국어 문서나 커뮤니티가 있나요?

A

공식 문서는 영어만 있지만, Supabase 한국 커뮤니티에서 한국 개발자들이 활발하게 소통하고 있다.

Q

버그 발견하면 어떻게 신고하나요?

A

GitHub Issues에 신고하면 된다. 오픈소스니까 직접 PR도 보낼 수 있고.

Q

유료 지원이 필요하면?

A

Supabase Team 플랜($599/월) 이상에서 이메일 지원 제공. Enterprise는 전담 지원팀까지 배정된다.

GoTrue 관련 유용한 리소스들