개인의 기록
  • 소개
  • 프로젝트
  • 글
  • 링크

© 2026 newgirok

← 글 목록

Supabase Authentication — 사용자 인증 내장 기능

2025년 4월 5일
SupabaseAuthenticationJWTOAuthMagic Link

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는 이를 포크해 통합했다.

Email/Password 인증

가장 기본적인 방식이다. 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 후 이메일 링크를 클릭해야 세션이 발급된다.

OAuth — Google / GitHub

await supabase.auth.signInWithOAuth({
  provider: "google", // 또는 "github"
  options: {
    redirectTo: "https://yourapp.com/auth/callback",
  },
});

OAuth 플로우는 브라우저 리다이렉트 방식으로 동작한다. 콜백 URL에서 Supabase가 자동으로 세션을 교환하며, 클라이언트는 onAuthStateChange로 상태 변화를 감지한다.

OAuth: 제3자 서비스의 계정으로 로그인을 위임하는 표준 프로토콜. 패스워드를 직접 다루지 않는다.

Magic Link / Phone OTP

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",
});

JWT와 RLS 연동

로그인 성공 후 발급된 Access Token은 PostgreSQL RLS 정책에서 auth.uid로 참조된다. 별도의 미들웨어 없이 DB 레벨에서 사용자별 데이터 접근을 제어할 수 있다.

-- 본인 데이터만 읽기 허용
CREATE POLICY "본인 데이터만 조회"
ON posts
FOR SELECT
USING (auth.uid() = user_id);

인증 방식 비교

방식비밀번호 필요이메일 필요외부 서비스
Email/PasswordOOX
Google OAuthXOGoogle
GitHub OAuthXOGitHub
Magic LinkXOX
Phone OTPXXSMS Provider

세션 갱신은 클라이언트 SDK가 자동으로 처리한다. Refresh Token이 유효한 한 만료된 Access Token을 투명하게 교체하므로, 개발자가 토큰 갱신 로직을 직접 구현할 필요가 없다.

← 이전 글Row Level Security — 행 단위 접근 권한 제어
다음 글 →Supabase Authorization — 권한 기반 접근 제어