Supabase Auth - Team-HGD/SniffMEET GitHub Wiki
Authentication: ์ ์ ๊ฐ ์ ์ ์ค์ค๋ก ์ฃผ์ฅํ๋ ์ฌ๋์ด ๋ง๋์ง ํ์ธํ๋ ๊ณผ์ Authorization: ํด๋น ๋ฐ์ดํฐ์ ์ ๊ทผ์ด ํ์ฉ๋ ์ ์ ์ธ์ง ํ์ธํ๋ ๊ณผ์
- Supabase Auth๋ ์ธ์ฆ ํ๋๋ฐ JWT๋ฅผ ์ฌ์ฉํ๋ค.
- Auth๋ Supabase์ ๋ฐ์ดํฐ๋ฒ ์ด์ค ๊ธฐ๋ฅ๊ณผ ํตํฉ๋์ด ์์ผ๋ฏ๋ก, RLS๋ฅผ ์ฝ๊ฒ ์ฌ์ฉํ์ฌ ์ธ์ฆํ ์ ์๋ค.

Supabase Auth์ 4๊ฐ์ ์ฃผ์ ๊ณ์ธต์ด ์๋ค.
- Client Layer: Supabase SDK๊ฑฐ๋, HTTP ํด๋ผ์ด์ธํธ๋ฅผ ์ฌ์ฉํด์ ๋ง๋ HTTP ์์ฒญ์ค ํ๋.
- Kong API gateway: ๋ชจ๋ Supabase ์ ํ์ด ๊ณต์ ํ๋ ๊ฒ์ดํธ์จ์ด
- Auth Service
- Postgres database: ๋ชจ๋ Supabase ์ ํ์ด ๊ณต์ ํ๋ ๋ฐ์ดํฐ๋ฒ ์ด์ค
์ ํ๋ฆฌ์ผ์ด์ ์์ ๋์ํ๋ ๋ ์ด์ด
- ํ๋ก ํธ์๋, ๋ฐฑ์๋, ๋ค์ดํฐ๋ธ ์ ํ๋ฆฌ์ผ์ด์ ์ฝ๋์์ ๋์ํ๋ค.
- SDK๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์ ๊ถ์ฅํ๊ธด ํ๋ ์ํ๋ค๋ฉด HTTP ํธ์ถ๋ก๋ ๊ฐ๋ฅ
Supabase์์ ๊ด๋ฆฌํ๋ Auth API ์๋ฒ
- JWT๋ฅผ ๊ฒ์ฆ, ๋ฐ๊ธ, ๋ฆฌํ๋ ์ ํ๋ค.
- ์ ํ๋ฆฌ์ผ์ด์ ๊ณผ ๋ฐ์ดํฐ๋ฒ ์ด์ค ๋ด๋ถ์ Auth ์ ๋ณด ์ฌ์ด์ ์ค๊ฐ์
Supabase Auth๋ auth ์คํค๋ง๋ฅผ ์ฌ์ฉํ์ฌ Postgres DB์ ์ ์ ํ
์ด๋ธ์ด๋ ๋ค๋ฅธ ์ ๋ณด๋ฅผ ์ ์ฅํ๋ค. ์ด ์คํค๋ง๋ ์๋์ผ๋ก ์์ฑ๋ API์ ๋
ธ์ถ๋์ง ์๋๋ค.
์ค๋ธ์ ํธ์ Auth ์ ๋ณด๋ฅผ database trigger์ foreign key๋ฅผ ์ด์ฉํด ์ฐ๊ฒฐํ ์ ์๋ค. RLS๋ ๊ถํ์ ์ทจ์ํ์ฌ Auth ๋ฐ์ดํฐ ๋ด๋ถ์ ์์ฑํ ๋ทฐ๊ฐ ์ ์ ํ๊ฒ ๋ณดํธ๋๋์ง ํ์ธํด์ผ ํ๋ค.
-
auth์คํค๋ง์ ์ ์ฅ๋ user ID๋ฅผ ๊ฐ์ง ์ฌ๋ - ์ ์ ๋ Access Token์ ๋ฐ๊ธ ๋ฐ์์ Supabase endpoint์ ์ ๊ทผํ ์ ์๋ค.
- RLS๋ฅผ ํตํด์ ๋ฆฌ์์ค์ ๋ํ ์ ์ ์ก์ธ์ค๋ฅผ ์ ํํ ์ ์๋ค.
- ์๊ตฌ ์ ์ : ๊ฐ์ธ ์๋ณ ์ ๋ณด(PII)์ ์ฐ๊ฒฐ๋ ์ ์ , ์ด๋ฌํ ์๋ณ ์ ๋ณด๋ฅผ ํตํด ๋ก๊ทธ์์์ ํด๋ ๋ค์ ๊ณ์ ์ ์ ๊ทผํ ์ ์๋ค.
- ์ต๋ช ์ ์ : ๊ฐ์ธ ์๋ณ ์ ๋ณด๊ฐ ์๋ ์ ์ ๋ก๊ทธ์์ ํ ๊ฒฝ์ฐ ๋์ผํ ์ฌ์ฉ์๋ก ๋ค์ ๋ก๊ทธ์ธ ํ ๋ฐฉ๋ฒ์ด ์๋ค.
https://supabase.com/docs/guides/database/postgres/roles
-
postgres: ๊ด๋ฆฌ์ ๊ถํ์ด ์๋ Postgres role -
anon: ๋ก๊ทธ์ธ ๋์ด์์ง ์๋ ์ํ์์ ์ก์ธ์ค๋ฅผ ์ํ role -
authenticated: ๋ก๊ทธ์ธ ํ ์ ์ ๋ฅผ ์ํ role -
service_role: API์์ RLS๋ฅผ ์ฐํํ๊ธฐ ์ํ role
โ ๏ธ ์ต๋ช ์ ์ ๋ anon-role์ ์ฌ์ฉํ์ง ์๋๋ค. ์๊ตฌ ์ ์ ์ ๋ง์ฐฌ๊ฐ์ง๋ก ์ต๋ช ์ ์ ๋ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ์ ๊ทผํ ๋ authenticated-role์ ์ฌ์ฉํ๋ค. anon-role์ ๋ก๊ทธ์ธ ๋์ด์์ง ์์ ์ ์ (unauthenticated, public user)๋ฅผ ์ํ ๊ฒ์ด๋ค. roles: https://supabase.com/docs/guides/database/postgres/roles
Supabase Auth๋ ์ ์ ์ธ์ ์ ๋ํ ์ธ๋ถํ๋ ์ ์ด ๊ธฐ๋ฅ์ ์ ๊ณตํ๋ค.
- ์ ์ ๊ฐ ๋ก๊ทธ์ธ ํ๋ฉด ์ธ์ ์ด ์์ฑ๋๋ค.
- ๊ธฐ๋ณธ์ ์ผ๋ก ์ธ์ ์ ์ ํ ์๊ฐ์ด ์ ํด์ ธ ์์ง ์๊ณ , ํ์ฑํ๋ ์ธ์ ๊ณผ ์ฅ์น์ ๊ฐ์๋ ์ ํํ์ง ์๋๋ค.
- JWT ํํ์ access token๊ณผ ๊ณ ์ ๋ฌธ์์ด(unique string)์ธ refresh token์ผ๋ก ํํ๋๋ค.
- ๊ธฐ๋ณธ์ ์ผ๋ก ์ก์ธ์ค ํ ํฐ์ 5๋ถ - 1์๊ฐ ์ฌ์ด์ ์งง์ ๋ง๋ฃ ์๊ฐ์ ๊ฐ์ง๊ณ , ๋ฆฌํ๋ ์ ํ ํฐ์ ๋ง๋ฃ ์๊ฐ์ด ์์ง๋ง ๋จ ํ๋ฒ๋ง ์ฌ์ฉํ ์ ์๋ค.
- refresh token์ ์ฌ์ฉํ๋ค(์ธ์ ์๋ก ๊ณ ์นจ): ์๋ก์ด access token, refresh token ์๊ณผ ๊ตํํ๋ค.
- ์ธ์
์ด ์ข
๋ฃ๋๋ ๊ฒ์ config์ ๋ฌ๋ ค์๋ค
- ๋ก๊ทธ์์
- ๋น๋ฐ๋ฒํธ ๋ณ๊ฒฝ, ๋ณด์์ ๋ฏผ๊ฐํ ์์ ์ํ
- ๋นํ์ฑ์ผ๋ก ์ธํ ์๊ฐ ์ด๊ณผ
- ์ธ์ ๋ง๋ฃ ์๊ฐ์ ๋๋ฌ (์์ ๋ค๋ฅธ ์ ์, ์๋ ๋นํ์ฑ ์ํ๊ฐ ์ผ๋ง๋ ์ง์๋์๋๋๊ฐ ๊ธฐ์ค์ด๊ณ , ์ด ๊ฒ์ ๋นํ์ฑ ์ํ๋ ์๊ด ์์ด ๋ง๋ฃ ์๊ฐ์ ๋๋ฌํ๋ฉด ๋ฌด์กฐ๊ฑด ์ธ์ ์ ์ข ๋ฃ ์ํด)
- ๋ค๋ฅธ ์ฅ์น ๋ก๊ทธ์ธ
๋ชจ๋ ์ก์ธ์ค ํ ํฐ์ session_id ํด๋ ์, UUID๋ฅผ ๊ฐ์ง๊ณ ์๋ค. ์ด ID๋ฅผ auth.sessions์ ํ
์ด๋ธ์ ๊ธฐ๋ณธ ํค์ ์๊ด๊ด๊ณ๋ฅผ ๋ง๋ค ์ ์๋ค.
์ธ์
์ ์ ์ ๊ฐ ๋ก๊ทธ์ธ ํ์ ๋ ๊ฐ์๋๋ค. ์ธ์
์ auth.sessionํ
์ด๋ธ์ ์ ์ฅ๋๊ณ , ์ฑ์ access์ refresh token์ ์์ ํด์ผ ํ๋ค. session์ ๊ฐ์ํ๋ ํ๋ฆ์ ๋ค์๊ณผ ๊ฐ๋ค:
- ๋ก๊ทธ์ธ์ ์ฑ๊ณตํ๋ฉด ๋ค์๊ณผ ๊ฐ์ ํํ์ URL๊ณผ ํจ๊ป ์ฑ์ผ๋ก ๋ฆฌ๋๋ ์ ๋๋ค.
https://yourapp.com/...#access_token=<...>&refresh_token=<...>&...URL์ access token๊ณผ refresh token์ด ํฌํจ๋์ด ์๋ค.
- ์ด๋ฌํ ์ ํ์ URL์ ๊ฐ์งํ๊ณ
- ์ ๋ณด๋ฅผ ์ถ์ถํ ๋ค์
- ์ฑ์์ ์ถ๊ฐ์ ์ผ๋ก ์ฌ์ฉํ ์ ์๋๋ก ๋ก์ปฌ ์ ์ฅ์์ ๋ณด๊ดํ๋ค.
- ์ต๋ช ์ ์ ๋ ๋ก๊ทธ์์ํ๊ฑฐ๋ ๋ธ๋ผ์ฐ์ง ๋ฐ์ดํฐ๋ฅผ ์ง์ฐ๊ฑฐ๋ ๋ค๋ฅธ ์ฅ์น๋ฅผ ์ฌ์ฉํ๋ ๊ฒฝ์ฐ ๊ณ์ ์ ์ก์ธ์คํ ์ ์๋ค๋ ๊ฒ์ ์ ์ธํ๊ณ ๋ ์๊ตฌ ์ ์ ์ ๊ฐ๋ค.
- ์๊ตฌ ์ ์ ์ฒ๋ผ authenticated role ์ ์ต๋ช
์ ์ ์ JWT์๋ RLS ์ ์ฑ
์์ ๊ตฌ๋ณํ๋ ๋ฐ ์ฌ์ฉํ ์ ์๋
is_anonymousํด๋ ์์ด ์๋ค. - anon API Key๋ ์ ์ ๋ฅผ ์์ฑํ์ง ์๊ณ , anon role ์ฌ์ฉํ๋ฏ๋ก ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ๋ํ ๊ณต๊ฐ ์ก์ธ์ค๋ฅผ ๊ตฌํํ๋๋ฐ ์ฌ์ฉํ๋ค.
โ ๏ธ ์ต๋ช ๋ก๊ทธ์ธ์ ํ์ฑํ ํ๊ธฐ ์ ์ RLS ์ ์ฑ ์ ํ์ธํด์ผ ํ๋ค. ์ต๋ช ์ ์ ๋ authenticated role์ ์ฌ์ฉํ๊ธฐ ๋๋ฌธ์ ์๊ตฌ ์ ์ ์ ๊ตฌ๋ถ์ ์ํด์๋ JWT ํ ํฐ์ ์๋is_anonymousํ๋๋ฅผ ํ์ธํ์.
์ต๋ช
์ ์ ๋ ์๊ตฌ ์ ์ ์ฒ๋ผ authenticated role์ ์ฌ์ฉํ๊ธฐ ๋๋ฌธ์, RLS ์ ์ฑ
์ ์ฌ์ฉํ์ฌ auth.jwt()์์ ๋ฆฌํด๋ is_anonymousํด๋ ์์ ์ด์ฉํ์ฌ ๊ตฌ๋ถํ ์ ์๋ค.
Supabase๋ ์ด๋ PostgREST๋ฅผ ์ฌ์ฉํ๋ API ๋ ์ด์ด๋ฅผ ์ ๊ณตํ๋ค. ์ด๋ Postgres ์์ ์๋ ์์ ๋ ์ด์ด์ด๋ค.
-
CRUD์ ๊ด๋ จ๋ ๋ชจ๋ ์์ ์ ๋ค์ URL์์ ํ ์ ์๋ค:
https://<project_ref>.supabase.co/rest/v1/ -- ์ฐ๋ฆฌ ์ฃผ์๋: https://hgdhgd.supabase.co/rest/v1/ -
๋ฐ์ดํฐ๋ฒ ์ด์ค๋ฅผ ์ ๋ฐ์ดํธ ํ๋ฉด, ๋ณ๊ฒฝ ์ฌํญ์ด ๊ณง๋ฐ๋ก API์ ๋ฐ์๋๋ค.
-
RLS๋ฅผ ์ฌ์ฉํด ๋ณด์์ด ๊ตฌ์ฑ๋๋ค.
-
Firebase๋ณด๋ค ์ฝ๊ธฐ ์์ ์ด 3๋ฐฐ ์ด์ ๋น ๋ฅด๋ค.
- ๊ธฐ๋ณธ CRUD ์์ (Create/Read/Update/Delete)
-
Postgres ๋ทฐ(Views), ๋ฌผ๋ฆฌ์ ๋ทฐ(Materialized Views)
- ๋ฌผ๋ฆฌ์ ๋ทฐ: ์ค์ ๋ก ๋ฐ์ดํฐ๊ฐ ์ ์ฅ๋์ด ์๋ ๋ทฐ
-
Postgres ํจ์
- ํน์ ์์ ์ ์ํํ๋ SQL ์ฝ๋ ๋ธ๋ก, ๋ณต์กํ ๋ก์ง์ ์ฝ๊ฒ ์ฌ์ฌ์ฉ ํ ์ ์์.
- Postgres์ ๋ณด์ ๋ชจ๋ธ - Row Level Security, ์ญํ (Role), ๊ถํ ๋ถ์ฌ(Grants)๋ฅผ ํฌํจ