Supabase는 PostgreSQL 위에 인증 레이어를 통합해 별도의 Auth 서버 없이 회원가입부터 로그인, 세션 관리까지 처리할 수 있다. 내부적으로 GoTrue라는 오픈소스 Auth 서비스를 사용하며, 모든 인증 결과는 JWT로 발급된다. Email/Password, OAuth, Magic Link, Phone 등 다양한 방식을 동일한 API로 다룰 수 있다는 점이 핵심이다.
Client
│
├─ signUp / signInWithPassword
├─ signInWithOAuth (Google, GitHub)
├─ signInWithOtp (Magic Link / Phone)
│
▼
GoTrue (Supabase Auth)
│
├─ JWT Access Token (기본 1시간 유효)
├─ Refresh Token (세션 연장용)
│
▼
PostgreSQL ←→ Row Level Security (RLS)
auth.uid() 로 사용자 식별
GoTrue: Netlify가 오픈소스로 공개한 사용자 인증 마이크로서비스. Supabase는 이를 포크해 통합했다.
가장 기본적인 방식이다. signUp으로 계정을 생성하고, signInWithPassword로 로그인한다.
import { createClient } from "@supabase/supabase-js";
const supabase = createClient(SUPABASE_URL, SUPABASE_ANON_KEY);
// 회원가입
const { data, error } = await supabase.auth.signUp({
email: "user@example.com",
password: "secret-password",
});
// 로그인
const { data: session, error: loginError } = await supabase.auth.signInWithPassword({
email: "user@example.com",
password: "secret-password",
});
// 로그아웃
await supabase.auth.signOut();
이메일 확인(Confirm Email)은 Supabase 대시보드에서 활성화/비활성화할 수 있다. 확인이 활성화된 경우 signUp 후 이메일 링크를 클릭해야 세션이 발급된다.
await supabase.auth.signInWithOAuth({
provider: "google", // 또는 "github"
options: {
redirectTo: "https://yourapp.com/auth/callback",
},
});
OAuth 플로우는 브라우저 리다이렉트 방식으로 동작한다. 콜백 URL에서 Supabase가 자동으로 세션을 교환하며, 클라이언트는 onAuthStateChange로 상태 변화를 감지한다.
OAuth: 제3자 서비스의 계정으로 로그인을 위임하는 표준 프로토콜. 패스워드를 직접 다루지 않는다.
Magic Link는 이메일로 일회성 로그인 링크를 발송한다. 비밀번호 없이 인증할 수 있어 마찰을 줄인다.
// Magic Link
await supabase.auth.signInWithOtp({ email: "user@example.com" });
// Phone OTP
await supabase.auth.signInWithOtp({ phone: "+821012345678" });
// OTP 코드 검증 (Phone)
await supabase.auth.verifyOtp({
phone: "+821012345678",
token: "123456",
type: "sms",
});
로그인 성공 후 발급된 Access Token은 PostgreSQL RLS 정책에서 auth.uid로 참조된다. 별도의 미들웨어 없이 DB 레벨에서 사용자별 데이터 접근을 제어할 수 있다.
-- 본인 데이터만 읽기 허용
CREATE POLICY "본인 데이터만 조회"
ON posts
FOR SELECT
USING (auth.uid() = user_id);
| 방식 | 비밀번호 필요 | 이메일 필요 | 외부 서비스 |
|---|---|---|---|
| Email/Password | O | O | X |
| Google OAuth | X | O | |
| GitHub OAuth | X | O | GitHub |
| Magic Link | X | O | X |
| Phone OTP | X | X | SMS Provider |
세션 갱신은 클라이언트 SDK가 자동으로 처리한다. Refresh Token이 유효한 한 만료된 Access Token을 투명하게 교체하므로, 개발자가 토큰 갱신 로직을 직접 구현할 필요가 없다.