FastAPI와 Supabase로 만드는 로그인 예제
FastAPI 백엔드에서 Supabase 인증으로 이메일 로그인을 붙이는 최소 예제를 따라 만들어봐요.
FastAPI와 Supabase로 만드는 로그인 예제
로그인 기능을 직접 만들려고 하면, 비밀번호 해싱부터 토큰 발급까지 챙길 게 생각보다 많아요. 혹시 "이걸 다 직접 짜야 하나" 싶어서 시작도 못 한 적 없나요?
그럴 때 인증은 Supabase에 맡기고, FastAPI는 그 위에 얇게 얹는 방식이 편해요. 혼자 운영하면서 반복을 줄이려고 자주 쓰는 구성이에요. 이번엔 이메일·비밀번호 로그인만 딱 따라 만들어볼게요.
준비물
먼저 패키지 두 개만 설치하면 돼요.
pip install fastapi supabase uvicorn그리고 Supabase 대시보드의 Project Settings에서 URL과 anon key를 가져와 환경변수로 둬요. 키를 코드에 직접 박지 말고 .env로 분리하는 게 안전해요.
SUPABASE_URL=https://your-project.supabase.co
SUPABASE_ANON_KEY=your-anon-key
여기서 service_role 키는 클라이언트나 공개 저장소에 절대 노출하면 안 돼요. 서버 안에서만, 그것도 꼭 필요할 때만 써요.
로그인 엔드포인트
Supabase 클라이언트를 만들고, sign_in_with_password로 로그인을 처리해요. 성공하면 access token이 담긴 세션이 돌아와요.
import os
from fastapi import FastAPI, HTTPException
from pydantic import BaseModel
from supabase import create_client
app = FastAPI()
supabase = create_client(
os.environ["SUPABASE_URL"],
os.environ["SUPABASE_ANON_KEY"],
)
class LoginInput(BaseModel):
email: str
password: str
@app.post("/login")
def login(body: LoginInput):
try:
res = supabase.auth.sign_in_with_password(
{"email": body.email, "password": body.password}
)
except Exception:
raise HTTPException(status_code=401, detail="로그인에 실패했어요")
return {"access_token": res.session.access_token}입력을 Pydantic 모델로 받으니 형식 검증은 FastAPI가 알아서 해줘요. 로그인이 틀리면 401로 떨어지게 두면, 어떤 계정인지 굳이 알려주지 않아 정보 노출도 줄어요.
받은 토큰 확인하기
이후 요청에서 토큰이 유효한지 보고 싶으면 get_user로 확인하면 돼요.
@app.get("/me")
def me(token: str):
user = supabase.auth.get_user(token)
if user is None:
raise HTTPException(status_code=401, detail="유효하지 않은 토큰이에요")
return {"email": user.user.email}여기까지가 가장 작은 형태예요. 비밀번호 저장이나 토큰 만료 같은 무거운 부분은 Supabase가 맡고, 우리는 흐름만 연결했어요.
마무리
작은 도구를 직접 만들어보면, 인증 같은 영역도 한 번 흐름을 잡아두면 다음 프로젝트에서 그대로 재사용할 수 있어요. 라이프케어로그의 플랜비(plan-b) 같은 사이드 프로젝트들도 이런 최소 구성으로 시작해서 필요한 만큼만 키워가는 편이에요.
처음부터 완벽한 인증을 짜려 하지 말고, 로그인 하나가 도는 걸 먼저 확인해보세요. 거기서부터 붙여나가는 게 혼자 만들 땐 제일 빠른 길이에요.
관련 글
댓글
아직 댓글이 없어요. 첫 댓글을 남겨주세요.