Ch.19 Supabase — 백엔드 없이 풀스택
인증과 스토리지
로그인 기능 직접 만들면 보안 구멍 투성이
비밀번호 해싱, 세션 관리, 토큰 갱신, CSRF 방어… 인증을 직접 구현하면 보안 전문가도 실수합니다.
안전한 로그인을 쉽게 구현할 수 있을까?
Supabase Auth — 이메일, 소셜 로그인을 메서드 하나로 처리합니다.
핵심 내용
회원가입, 로그인, 소셜 로그인 메서드 하나로 끝납니다
// 회원가입
const { data, error } = await supabase.auth.signUp({
email: 'user@example.com',
password: 'securePassword123'
})
// 로그인
const { data, error } = await supabase.auth.signInWithPassword({
email: 'user@example.com',
password: 'securePassword123'
})
// 로그아웃
await supabase.auth.signOut()소셜 로그인도 간단합니다. Google, GitHub 등을 대시보드에서 활성화하면 됩니다.
// Google 로그인
const { data, error } = await supabase.auth.signInWithOAuth({
provider: 'google'
})
// GitHub 로그인
const { data, error } = await supabase.auth.signInWithOAuth({
provider: 'github'
})바이브 코더 팁 비밀번호 해싱, JWT 토큰, 세션 관리를 Supabase가 알아서 처리합니다. 직접 구현하면 보안 사고의 원인이 됩니다.
로그인 상태가 바뀌면 자동으로 감지해서 UI를 전환합니다
import { useEffect, useState } from 'react'
import { supabase } from '@/lib/supabase'
export default function AuthButton() {
const [user, setUser] = useState(null)
useEffect(() => {
// 현재 사용자 확인
supabase.auth.getUser().then(({ data }) => {
setUser(data.user)
})
// 상태 변경 감지
const { data: { subscription } } = supabase.auth
.onAuthStateChange((_event, session) => {
setUser(session?.user ?? null)
})
return () => subscription.unsubscribe()
}, [])
if (user) {
return (
<div>
<span>{user.email}</span>
<button onClick={() => supabase.auth.signOut()}>
로그아웃
</button>
</div>
)
}
return <button>로그인</button>
}프로필 이미지, 첨부 파일도 Supabase Storage로 관리합니다
Bucket 생성: 대시보드 Storage → New Bucket (예: avatars)
Policy 설정: 누가 업로드/다운로드할 수 있는지 규칙 설정
업로드: supabase.storage.from('bucket').upload()
URL 생성: getPublicUrl()로 이미지 주소 획득
// 파일 업로드
const file = event.target.files[0]
const filePath = `${userId}/${file.name}`
const { data, error } = await supabase.storage
.from('avatars')
.upload(filePath, file)
// 공개 URL 가져오기
const { data: { publicUrl } } = supabase.storage
.from('avatars')
.getPublicUrl(filePath)
// 파일 삭제
await supabase.storage
.from('avatars')
.remove([filePath])파일 경로 팁 `userId/파일명` 구조로 저장하면 RLS Policy에서 사용자별 접근 제어가 쉬워집니다.
Supabase에서 Google 로그인을 구현하려면?
onAuthStateChange는 로그인/로그아웃 시에만 호출된다.
Supabase Storage에서 업로드한 파일의 공개 URL을 얻으려면?
핵심 용어
SIGNED_IN
사용자가 로그인했을 때
SIGNED_OUT
사용자가 로그아웃했을 때
TOKEN_REFRESHED
토큰이 자동 갱신되었을 때
USER_UPDATED
사용자 프로필이 변경되었을 때
정리 노트
Supabase 인증과 스토리지
핵심 기능
- Auth 회원가입
- supabase.auth.signUp({email, password}) — 간편 인증
- Auth 로그인
- supabase.auth.signInWithPassword({...}) — 세션 자동 관리
- 소셜 로그인
- signInWithOAuth({provider: 'google'}) — OAuth 간편 연동
- Storage
- supabase.storage.from('bucket').upload(path, file) — 파일 관리
Supabase Auth는 세션 관리까지 자동으로 처리해줍니다.
퀴즈와 인터랙션으로 더 깊이 학습하세요
play_circle인터랙티브 레슨 시작