블로그로 돌아가기
Python

python supabase 연동: FastAPI에서 실무로 바로 적용하기

python supabase 연동 가이드는 FastAPI 기반 실무 웹 개발자를 위해 개념, 인증·스토리지 연동 예제, 보안 및 운영 주의점을 단계별로 정리해 즉시 적용할 수 있도록 제공합니다.

supabasepythonfastapisupabase-auth
FastAPI에서 python supabase 연동을 설명하는 기술 블로그용 이미지

python supabase 연동이 필요한 상황

python supabase 연동을 통해 빠르게 데이터베이스, 인증, 스토리지 기능을 서비스에 통합하는 방법을 안내합니다. 이 글을 읽으면 FastAPI 환경에서 Supabase 클라이언트 초기화, 인증 처리, 데이터 쿼리, 파일 업로드 흐름을 코드 예제와 체크리스트로 바로 적용할 수 있습니다.

python supabase 연동 핵심 개념

Supabase는 Postgres 기반 BaaS로, 주요 구성은 Database (Postgres), Auth, Storage, Realtime, 그리고 REST/GraphQL 엔드포인트입니다. Python 환경에서는 공식 또는 커뮤니티 클라이언트(supabase-py 등)를 사용해 HTTP/Realtime API를 호출합니다. 핵심 개념은 다음과 같습니다:

  • 서비스 키 vs 익명 키: 서버에서는 서비스 키(RLS 우회 가능)를, 클라이언트에는 익명 키를 사용합니다.
  • RLS(Row Level Security): 권한은 Postgres RLS로 설계합니다. 앱 레벨 검증과 함께 사용해야 안전합니다.
  • 인증 흐름: OAuth, 이메일/비밀번호, Magic Link 등을 사용할 수 있습니다.
  • 스토리지: 파일 업로드는 사전 서명 URL 또는 서버측 proxy 방식으로 처리할 수 있습니다.

python supabase 연동 실무 예제 (FastAPI)

아래 예제는 FastAPI에서 supabase-py(또는 httpx)로 인증과 간단한 CRUD를 처리하는 흐름입니다.

# main.py from fastapi import FastAPI, Depends, HTTPException, UploadFile, File from supabase import create_client import os SUPABASE_URL = os.getenv('SUPABASE_URL') SUPABASE_KEY = os.getenv('SUPABASE_SERVICE_KEY') # 서버에서만 사용 supabase = create_client(SUPABASE_URL, SUPABASE_KEY) app = FastAPI() @app.post('/signup') async def signup(email: str, password: str): user = supabase.auth.sign_up({"email": email, "password": password}) return user @app.get('/items') async def list_items(): res = supabase.table('items').select('*').execute() if res.error: raise HTTPException(status_code=500, detail=res.error.message) return res.data @app.post('/upload') async def upload(file: UploadFile = File(...)): content = await file.read() bucket = 'uploads' path = f'{file.filename}' res = supabase.storage.from_(bucket).upload(path, content) if res.error: raise HTTPException(status_code=500, detail=res.error.message) url = supabase.storage.from_(bucket).get_public_url(path) return {"url": url}

위 코드는 교육용 예시입니다. 실제로는 입력 검증, 에러 핸들링, 비동기 클라이언트 사용(권장) 등을 보강해야 합니다.

인증과 권한: supabase-auth 연동 팁

  • 서버에서는 서비스 키로 사용자 관리(예: 비밀번호 초기화, 유저 삭제) 작업을 합니다.
  • 클라이언트 인증 흐름은 익명 키 또는 OAuth 리디렉션을 사용합니다.
  • RLS 정책을 설계할 때는 jwt.claims를 활용해 user_id 기반 접근 제어를 적용하세요.

스토리지와 파일 업로드 (supabase-storage)

  • 프론트엔드에서 직접 업로드 시: 사전 서명된 URL 또는 익명 키+RLS 조합으로 제한합니다.
  • 서버 프록시 방식: 서버에서 파일 검사(바이너리 스캔, 확장자 체크 등) 후 업로드하면 보안성이 높습니다.

비교: Supabase 연동 방식 판단 기준

구분항목1항목2항목3
내용직접 클라이언트 업로드서버 프록시 업로드사전 서명 URL
내용간단 구현, 낮은 비용보안성 우수, 추가 부하안전·직접 접근, 만료 가능
내용클라이언트에서 바로 업로드 가능서버에서 검사 후 저장단기 토큰으로 제한 가능

실무 체크리스트

  • 환경 변수: SUPABASE_URL, SUPABASE_SERVICE_KEY 분리 저장
  • 키 관리: 클라이언트에는 익명 키만 노출
  • RLS 적용: 데이터 테이블에 RLS 활성화 및 정책 검증
  • 입력 검증: API 엔드포인트에서 반드시 validation 수행
  • 파일 검증: 확장자, MIME 검사 및 바이너리 스캔
  • 로깅/모니터링: 실패 요청 및 인증 실패 로그 수집

언제 쓰면 좋고 언제 피해야 할까

언제 쓰면 좋은가:

  • 빠르게 Postgres 기반 인증·스토리지·Realtime 기능을 통합해야 할 때
  • 작은 팀에서 백엔드 인프라 구축 시간을 줄이고 싶을 때
  • 표준 SQL(Postgres)과 호환되는 데이터 모델을 유지하려는 경우

언제 피해야 하는가:

  • 복잡한 커스텀 DB 확장이나 특수한 인덱싱이 필요한 경우
  • 엄격한 온프레미스 규정(데이터 주권)이 있어 외부 서비스 사용이 불가한 경우
  • 고도로 최적화된 고성능 쿼리 튜닝이 핵심 요구사항인 경우

성능·보안·운영 주의점

성능 관련

  • 네트워크 호출이 빈번한 패턴은 서버 사이드 캐시나 배치 처리로 줄이세요.
  • 대용량 파일은 스트리밍 업로드를 적용하고 시간 제한을 충분히 설정하세요.

보안 관련

  • 서비스 키는 절대 클라이언트에 노출하지 마세요.
  • RLS를 기본으로 두고 서버 검증을 병행하세요.
  • 업로드 파일은 확장자와 콘텐츠 유형을 모두 검사하고 필요 시 악성코드 스캔을 추가하세요.

운영 관련

  • 백업과 스키마 마이그레이션 전략을 마련하세요.
  • 모니터링: 실패율, 인증 실패, 스토리지 사용량 경고를 설정하세요.
  • 비용: 데이터 및 스토리지 사용량에 따른 비용 경고를 구성하세요.

자주 묻는 질문

Q1: Supabase를 Python에서 사용할 때 권장 클라이언트는 무엇인가요? A1: 공식 지원 클라이언트가 있는 경우 해당 패키지를 우선 사용하세요. 커뮤니티 패키지(supabase-py) 또는 HTTP 클라이언트(httpx)로 직접 호출하는 방법도 실무에서 널리 사용됩니다.

Q2: 서비스 키와 익명 키의 차이는 무엇인가요? A2: 서비스 키는 서버에서 전권한(관리 작업 포함)을 수행할 수 있으며 절대 클라이언트에 노출하면 안 됩니다. 익명 키는 공개 키로써 클라이언트 인증에 사용되며 RLS로 보호됩니다.

Q3: 대용량 파일 업로드는 어떻게 처리해야 하나요? A3: 스트리밍 업로드나 사전 서명 URL을 사용하고, 서버 프록시 방식으로 업로드 전 바이러스 검사 및 메타데이터 검증을 권장합니다.

Q4: RLS 적용 시 주의할 점은? A4: RLS 정책은 최소 권한 원칙을 적용하되, 테스트 환경에서 실제 사용자 권한 시나리오를 충분히 검증하세요. JWT 클레임 매핑 오류로 인한 권한 누락이 흔한 실수입니다.

정리

  • python supabase 연동은 FastAPI 환경에서 인증, DB, 스토리지를 빠르게 통합할 수 있는 실무 솔루션입니다.
  • 서비스 키와 익명 키를 엄격히 구분하고 RLS를 기본 적용하세요.
  • 파일 업로드는 서버 검증 또는 사전 서명 방식을 사용해 보안성을 확보하세요.
  • 성능 이슈는 네트워크 호출 최적화와 캐시로 대응하고, 운영 모니터링과 비용 경고를 설정하세요.
  • 체크리스트로 배포 전 필수 항목을 모두 점검하세요.