Supabase Concepts
Docs
Docs > https://supabase.com/docs
supabase 란 ?
프로젝트를 빠르게 구축하기 위한 백앤드 서비스들 모음집 + 클라우드
데이터베이스:
- Supabase는 각 프로젝트에 대해 전체적인 Postgres 데이터베이스를 제공하며 실시간 기능, 데이터베이스 백업, 확장 기능 등을 제공합니다.
인증(Auth):
- 이메일 및 비밀번호, 비밀번호 없는 인증, OAuth 및 모바일 로그인과 같은 다양한 인증 방법을 통해 프로젝트에 사용자를 추가하고 관리할 수 있습니다.
스토리지:
- 대용량 파일을 저장, 정리, 변환 및 제공할 수 있으며, 데이터베이스와 완전히 통합되어 Row Level Security 접근 정책을 사용할 수 있습니다.
실시간:
- 데이터베이스 변경 사항을 실시간으로 감지하고, 사용자 상태를 클라이언트 간에 동기화하며, 채널에 구독된 클라이언트에게 데이터를 브로드캐스트할 수 있습니다.
Edge Functions:
- 전 세계적으로 분산된 서버 측 함수를 통해 사용자에게 가장 낮은 지연 시간으로 코드를 실행할 수 있습니다.
AI 및 벡터:
- Supabase를 사용하여 임베딩 벡터를 저장하고 검색할 수 있습니다.
- Search: how similar is a search term to a body of text?
- Recommendations: how similar are two products?
- Classifications: how do we categorize a body of text?
- Clustering: how do we identify trends?
클라우스 서비스 구조
계정 생성 - 조직 생성 - 프로젝트 생성 - DB 만들기
- DB Level 에서 인증, 스토리지, 관리 가능
Pricing
- 시작은 FREE 이다.!
- DB의 용량을 500MB 혹은 1 GB file storage 혹은 MAU 5만 넘어가면, 이후 PRO 사용하면 된다.
- https://supabase.com/pricing
Free 버전에서 문제
- 클라우드 리소스를 절약하기 위해 현재 7일 이상 비활성 상태인 무료 계층 프로젝트를 일시 중지하고 있습니다.
그럼 유료 버전에서는 ?
- 100,000 monthly active users
- 8 GB database space
- 250 GB bandwidth
- 100 GB file storage
- Email support
- Daily backups stored for 7 days
- 7-day log retention
RLS (Row-Level Security)
Supabase의 RLS는 "Row-Level Security"의 약자.
- 데이터베이스 테이블의 행에 대한 보안을 관리하는 기능
- 사용자 또는 역할이 특정 행에 접근할 수 있는지 여부를 제어.
행 수준의 보안 장점
- 블로그 포스팅이라는 테이블이 있다라고 가정 하면
- 포스팅이라는 하나의 테이블에는 다른 사람들의 포스팅도 있음
- 원래는 서버단에서 내 포스팅과 다른 사람의 포스팅이 섞이지 않도록 권한체크 해야 한다.
- 근데 DB Level에서 이를 해주는 거임
- 보안이 향상된 인프라가 있으니 맘놓고 개발 가능!
예)
- Todo테이블의 Todo 정보에 대해서 다음 규칙을 DB Level에서 적용 가능
- 3가지 권한 타입 : owner(소유권자), auth(인증자) ,public(공개,anon 누구나, 익명)
- 정책 만들기 예)
- SELECT : Todo테이블은 읽기는 누구나 가능하다.
- UPDATE : Todo테이블은 수정은 로그인 한 사람은 누구나 가능하다.
- DELETE : Todo테이블 삭제는 만든사람만 가능하다.
신기한 점
- 로그인 후 + select * from post 라고 조회하면 로그인 한 사용자것만 나옴
- sql이 실제랑 다르다.
# App 요청
select * from todos
# DB Level 처리
select * from todos
where auth.uid() = todos.user_id; -- Policy is implicitly added.
참조 : https://supabase.com/docs/guides/database/postgres/row-level-security#policies
RLS 로 해결하는 API 취약점
BOLA - Broken Object Level Authorization.
- 접근 권한이 없는 데이터에 접근을 하는 경우이다.
- 예를 들어, A 사용자는 자신의 정보만 볼 수 있어야 하는 데, 같은 권한 수준을 가진 B 사용자의 정보까지 볼 수 있는 경우를 말한다.
BFLA - Broken Function Level Authorization
- BOLA가 Access - 데이터 접근에 대한 문제라면 BFLA는 Action - 작업 수행에 대한 문제이다. 즉, 권한이 없는 작업을 수행하는 것이다.
- postgreSQL의 RLS 기능을 이용해서 BOLA, BFLA 예방할 수 있다.
ref : 11개 API 취약점
필수 data types
https://supabase.com/docs/guides/database/tables#data-types
불리언 저장 : boolean
정수 저장 : bigint(int8), integer(int4)
소수점 저장 : double precision float8 double precision floating-point number (8 bytes)
문자열 저장 : text, varchar (variable-length character string)
json 저장 : json
사용자 식별자 저장 : uuid universally unique identifier
시간 저장 : timestamptz ( 타임존 정보도 함께 )
*시간 저장 : timestamp ( 타임존 정보 X , UTC 기본 - 하지만 데이터 잘못 들어가면 ?? )
Authentication
Authentication
- Supabase는 JWT와 키 인증을 혼합하여 작동합니다.
- Authorization 헤더가 포함되어 있지 않으면 API는 익명 사용자에게 요청을 하는 것으로 가정합니다.
- Authorization 헤더가 포함된 경우 API는 요청을 수행하는 사용자의 역할로 "전환"됩니다.(키를 환경 변수로 설정하는 것이 좋습니다.)
예)
// 로그인 전 요청, apiKey를 헤더에 넣어서 요청한다. ( apiKey는 anon key, service role key )
curl 'https://xscduanzzfseqszwzhcy.supabase.co/rest/v1/colors?select=name' \
-H "apikey: eyxx..xc" \
// 로그인을 하면 JWT 토큰이 발급된다.
supabase.auth.signIn({
email: 'lao.gimmie@gov.sg',
password: 'They_Live_1988!',
})
// 로그인 요청 후, apiKey + Authorization 와 함께 요청을 보낸다.
curl 'https://xscduanzzfseqszwzhcy.supabase.co/rest/v1/colors?select=name' \
-H "apikey: eyxx..xc" \
-H "Authorization: Bearer eyx..xs"
Client API Keys
- 클라이언트 키는 사용자가 로그인할 때까지 데이터베이스에 대한 "익명 액세스"를 허용합니다. 로그인한 후 키는 사용자 자신의 로그인 토큰으로 전환됩니다.
- 이 문서에서는 SUPABASE_KEY라는 이름을 사용하여 키를 참조합니다.
- 시작할 수 있도록 클라이언트 키를 제공했습니다. 곧 원하는 만큼 키를 추가할 수 있게 될 것입니다.
- API 설정 페이지에서 anon 키를 찾을 수 있습니다.
Service Keys
- 서비스 키는 모든 보안 정책을 우회하여 데이터에 대한 전체 액세스 권한을 갖습니다. 이러한 키를 노출할 때에는 매우 주의하십시오. 서버에서만 사용해야 하며 클라이언트나 브라우저에서는 절대 사용해서는 안 됩니다.
- 이 문서에서는 SERVICE_KEY라는 이름을 사용하여 키를 참조합니다.
- 시작할 수 있도록 서비스 키를 제공했습니다. 곧 원하는 만큼 키를 추가할 수 있게 될 것입니다.
- API 설정 페이지에서 service_role을 찾을 수 있습니다.
Architecture
https://supabase.com/docs/guides/getting-started/architecture
참고자료
리액트 핸드북 > 파일 구조 > bulletproof-react
Next.js 14 + @supabase/ssr: authencation, oauth, page protection,CRUD
Learn Supabase (Firebase Alternative) – Full Tutorial for Beginners
Next.js 14 + @supabase/ssr: 인증, oauth, 페이지 보호, CRUD