https://supabase.com/docs
■ Supabase
- 구글 Firebase를 엔터프라이즈 레벨에서도 사용 가능하도록 만든 오픈소스 프로젝트
- 모바일 및 웹 애플리케이션에서 사용할 수 있는 백엔드 서비스
- Firebase의 오픈 소스 대체제
- 컴퓨터에 직접 설치하는 방식은 아니고, Firebase 처럼 클라우드로 제공되는 서비스
- 2분 안에 Postgres, 인증과 API, 실시간 구독을 구현할 수 있다.
Create a backend in less than 2 minutes.
Start your project with a Postgres Database, Authentication, instant APIs, and realtime subscriptions.
- GraphQL에 익숙한 사람들을 위해 비슷하게 사용할 수 있는 인터페이스도 제공된다.
■ 기본 설정
1) 회원가입 후, 새로운 프로젝트 생성
2) 생성하면 해당 프로젝트에서 사용할 서버 인스턴스와 PostgreSQL 데이터베이스가 자동 생성된다.
3) 모바일/웹 프로젝트에 Supabase SDK를 설치
■ 유저 인증
회원 관리
코드 3줄이면 비밀번호 암호화 알고리즘을 구현할 필요없이 회원가입 기능을 구현할 수 있다.
아래와 같이 Supabase SDK를 통해 supabase.auth.signUp를 호출한다.
let { user, error } = await supabase.auth.signUp({
email: 'someone@email.com',
password: 'nshOpnIDkwgnouwsVLnk'
})
로그인
단순히 ID / 비밀번호로 로그인하려 한다면, 회원가입과 비슷하게 supabase.auth/signInWithPassword를 호출하면 된다.
그 후에는 세션이 로컬 쿠키에 저장되어서, supabase.auth.getUser()를 통해 로그인된 유저의 정보를 확인할 수 있다.
const { data, error } = await supabase.auth.signInWithPassword({
email: "example@email.com",
password: "example-password",
});
소셜 로그인
일반적으로 소셜 로그인을 구현하기 위해서는 별도의 웹훅 API로 소셜 로그인 프로바이더와 정보를 주고받고, 이를 클라이언트로 전달하는 로직을 백엔드로 구현해야 하지만, Supabase를 사용하면 회원가입과 비슷하게, 몇 줄의 코드만으로 구현할 수 있다.
async function signInWithGoogle() {
const { data, error } = await supabase.auth.signInWithOAuth({
provider: "google",
});
}
Supabase는 유저가 회원가입하면 고유한 id를 만들고, 서버가 켜져 있는 동안 어디서든 `supabase.auth.user()`를 호출하는 것으로 유저 정보를 가져올 수 있다.
물론, 이 id를 다른 테이블에서 FK로 넣어줄 수 있다.
let { user, error } = await supabase.auth.signIn({
email: 'someone@email.com'
})
// OAuth
let { user, error } = await supabase.auth.signIn({
provider: 'github'
})
기타 편의 기능
// 비밀번호 재설정 이메일 보내기
let { data, error } = await supabase.auth.api.resetPasswordForEail(email)
// 현재 세션에 저장된 유저 정보 가져오기
const user = supabase.auth.user()
// 초대 메일 보내기
let { user, error } = await supabase.auth.api.inviteUserByEmail(
email: 'someone@email.com'
)
■ 데이터베이스
1) Supabase 프로젝트를 생성할 때 같이 만들어진 PostgreSQL 데이터베이스는 Supabase의 대시보드에서 관리할 수 있다.
2) 테이블을 추가하려고 한다면, Supabase의 대시보드를 통해 만들 수 있다.
3) 테이블이 만들어졌다면, 이를 접근하기 위한 REST API가 자동으로 생성되고,
4) 클라이언트에서는 이를 SDK로 손쉽게 접근할 수 있다.
데이터를 읽어오고, 생성하고, 업데이트하는 쿼리 모두 SDK를 통해서 직접 실행할 수 있다. 즉, 프로트엔드에서 데이터베이스 쿼리를 필요에 맞게 직접 작성해서 실행할 수 있다. 단순 CRUD를 위해 백엔드에서 별도의 API를 만들 필요가 전혀 없다.
RLS, Row Level Security -- 추가 공부 필요
아무런 보안 설정없이 supabase를 웹 클라이언트에서 그대로 사용한다면, supabaseUrl과 supabaseKey(=public anon-key)가 network 단에서 그대로 노출된다. 심각한 보안 위험에 노출된다. 이 경우 악의를 가진 사용자가 해당 값들을 가지고 데이터베이스에 접속해 모든 데이터를 삭제할 수도 있는 사건이 발생할 수도 있다.
프론트에서 필요한 데이터베이스 쿼리를 직접 실행할 수 있다면,
"자신의 데이터만 가져올 수 있다"와 같은 보안 정책도 설정해야 안전할 것이다.
-> 아직 보안 부분에서 보완되어야 하는 부분이 있다.
-> 큰 프로젝트를 하기에는 우려되는 점이 있다.
이런 취약점에 대해 대처하는 방법은 다음과 같다.
1) 서버에서만 Supabase를 사용한다.
- 마치 ORM 처럼 사용한다. supabase에서 별도 인증 설정을 하지 않아도 되는 장점이 있다. 앞의 두 키가 노출될 일만 없다면 외부 데이터베이스에 연결해서 사용하는 것과 같은 경험을 할 수 있다.
- 그러나 자신이 직접 API를 호출하는 데 있어 보안 정책을 별도로 구축해야 하는 불편함이 발생한다.
- 그리고 서버에서 Supabase 서버로 호출하게 될 떄 발생할 네트워크 비용이 발생할 수 있다.
- 또한 기능 별 API를 만들어서 관리해야 하는 불편함이 발생한다.
2) 데이터베이스에 RLS를 설정한다.
- 이는 PostgreSQL에서 제공하는 기능인데, RLS를 사용하면 행(Row) 단위로 발생하는 조회, 수정 및 삭제 행위를 사용자별로 제한할 수 있다. 그렇다면 어떻게 제한을 적용해야 할까?
- 바로 정책이란 단위로 기술해야 한다. 정책은 기본적으로 SQL로 작성해야 하지만 Supabase 콘솔에서는 이 정책을 쉽게 초기화할 수 있게 GUI를 제공한다.
RLS 설정을 통해 얻는 장단점은 무엇일까?
1) 장점 : Supabase에 개별적으로 요청을 해도 정교한 제한이 가능하기 때문에 서버를 구현하는 것에 대한 부담이 줄어든다. 또한 ㅂㄹ도 서버를 거치지 않기에 빠른 응답 속도를 경험할 수 있다.
2) 단점 : RLS를 사용하기 위해선 Auth 기능을 필수적으로 사용해야 한다. 또한 정교한 정책을 작성하는 게 어려울 수 있다. 자신이 사용하는 언어로 로직을 작성하는 것이 더욱 익숙한데, PostgreSQL로 정책을 작성하는 것이 어색하거나 어려울 수 있기 때문이다.
SQL
내부적으로 PostgreSQL을 사용하므로, 이렇게 웹 브라우저에서 SQL을 실행시키는 인터페이스도 제공된다.
그 외 기타 기능들
1. Storage 기능은 파일/이미지를 업로드하고 다운로드할 때 사용할 수 있다. 일반적으로 사용하는 AWS S3와 같은 스토리지 서비스의 대체제로 사용할 수 있다.
2. Edge Function 기능은 외부 API를 호출하는 등 백엔드에서 실행되는 코드가 필요할 때, Deno 런타임에서 실행되는 ㄴ백엔드 코드를 작성해 배포할 수 있다.
3. Realtime 기능을 사용하면 클라이언트간에 메세지를 전송하거나, 클라이언트에서 DB의 변경에 대해 실시간으로 알림을 받을 수 있다. 이런 기능들을 통해 실시간 채팅등을 유용하게 사용할 수 있다.
PostgreSQL 사용
PostgreSQL는 객체-관계형 데이터베이스 시스템(ORDBMS)이다.
Supabase는 스스로 "The Open Source Firebase Alternative"로 홍보한다. Firebase에서도 사용자 인증, 데이터베이스 연동 등 Supabase에서 제공하는 기능이 존재한다. 얼핏 두 서비스는 비슷해보인다. 그럼에도 Supabase는 내부적으로 PostgreSQL과 같은 오픈 소스 기술을 적극 활용하고 있는 반면, Firebase는 내부적으로 구글이 소유하고 있는 자체 NoSQL 데이터베이스를 사용한다.
Supabase가 내부적으로 PostgreSQL을 활용한다는 사실은 상대적으로 더 매끄러운 온보딩 경험을 제공한다. 또한, PostgreSQL의 다양한 기능들을 그대로 사용할 수 있다는 것을 의미한다.
참고
https://www.peterkimzz.com/supasbase-overview/
https://dlwocks31.me/blog/supabase/
https://velog.io/@racoon/supabase-%ED%8F%BC-%EB%AF%B8%EC%B3%A4%EB%8B%A4
'프론트엔드 > Supabase + Jotai' 카테고리의 다른 글
Supabase - Edge Functions (0) | 2024.05.29 |
---|---|
Supabase - Storage (0) | 2024.05.28 |
Supabase - Auth / Auth architecture /Auth with React (0) | 2024.05.25 |
Supabase (0) | 2024.05.08 |
Jotai (0) | 2023.07.11 |
댓글