Supabase Auth - Team-HGD/SniffMEET GitHub Wiki

Authentication๊ณผ Authorization

Authentication: ์œ ์ €๊ฐ€ ์œ ์ € ์Šค์Šค๋กœ ์ฃผ์žฅํ•˜๋Š” ์‚ฌ๋žŒ์ด ๋งž๋Š”์ง€ ํ™•์ธํ•˜๋Š” ๊ณผ์ • Authorization: ํ•ด๋‹น ๋ฐ์ดํ„ฐ์— ์ ‘๊ทผ์ด ํ—ˆ์šฉ๋œ ์œ ์ €์ธ์ง€ ํ™•์ธํ•˜๋Š” ๊ณผ์ •

  • Supabase Auth๋Š” ์ธ์ฆ ํ•˜๋Š”๋ฐ JWT๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค.
  • Auth๋Š” Supabase์˜ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ๊ธฐ๋Šฅ๊ณผ ํ†ตํ•ฉ๋˜์–ด ์žˆ์œผ๋ฏ€๋กœ, RLS๋ฅผ ์‰ฝ๊ฒŒ ์‚ฌ์šฉํ•˜์—ฌ ์ธ์ฆํ•  ์ˆ˜ ์žˆ๋‹ค.

Auth architecture

image

Supabase Auth์˜ 4๊ฐœ์˜ ์ฃผ์š” ๊ณ„์ธต์ด ์žˆ๋‹ค.

  • Client Layer: Supabase SDK๊ฑฐ๋‚˜, HTTP ํด๋ผ์ด์–ธํŠธ๋ฅผ ์‚ฌ์šฉํ•ด์„œ ๋งŒ๋“  HTTP ์š”์ฒญ์ค‘ ํ•˜๋‚˜.
  • Kong API gateway: ๋ชจ๋“  Supabase ์ œํ’ˆ์ด ๊ณต์œ ํ•˜๋Š” ๊ฒŒ์ดํŠธ์›จ์ด
  • Auth Service
  • Postgres database: ๋ชจ๋“  Supabase ์ œํ’ˆ์ด ๊ณต์œ ํ•˜๋Š” ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค

ํด๋ผ์ด์–ธํŠธ ๋ ˆ์ด์–ด

์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์—์„œ ๋™์ž‘ํ•˜๋Š” ๋ ˆ์ด์–ด

  • ํ”„๋ก ํŠธ์—”๋“œ, ๋ฐฑ์—”๋“œ, ๋„ค์ดํ‹ฐ๋ธŒ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์ฝ”๋“œ์—์„œ ๋™์ž‘ํ•œ๋‹ค.
  • SDK๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์„ ๊ถŒ์žฅํ•˜๊ธด ํ•˜๋‚˜ ์›ํ•œ๋‹ค๋ฉด HTTP ํ˜ธ์ถœ๋กœ๋„ ๊ฐ€๋Šฅ

Auth Service

Supabase์—์„œ ๊ด€๋ฆฌํ•˜๋Š” Auth API ์„œ๋ฒ„

  • JWT๋ฅผ ๊ฒ€์ฆ, ๋ฐœ๊ธ‰, ๋ฆฌํ”„๋ ˆ์‹œ ํ•œ๋‹ค.
  • ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜๊ณผ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ๋‚ด๋ถ€์˜ Auth ์ •๋ณด ์‚ฌ์ด์˜ ์ค‘๊ฐœ์ž

Postgres

Supabase Auth๋Š” auth ์Šคํ‚ค๋งˆ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ Postgres DB์— ์œ ์ € ํ…Œ์ด๋ธ”์ด๋‚˜ ๋‹ค๋ฅธ ์ •๋ณด๋ฅผ ์ €์žฅํ•œ๋‹ค. ์ด ์Šคํ‚ค๋งˆ๋Š” ์ž๋™์œผ๋กœ ์ƒ์„ฑ๋œ API์— ๋…ธ์ถœ๋˜์ง€ ์•Š๋Š”๋‹ค.

์˜ค๋ธŒ์ ํŠธ์— Auth ์ •๋ณด๋ฅผ database trigger์™€ foreign key๋ฅผ ์ด์šฉํ•ด ์—ฐ๊ฒฐํ•  ์ˆ˜ ์žˆ๋‹ค. RLS๋‚˜ ๊ถŒํ•œ์„ ์ทจ์†Œํ•˜์—ฌ Auth ๋ฐ์ดํ„ฐ ๋‚ด๋ถ€์— ์ƒ์„ฑํ•œ ๋ทฐ๊ฐ€ ์ ์ ˆํ•˜๊ฒŒ ๋ณดํ˜ธ๋˜๋Š”์ง€ ํ™•์ธํ•ด์•ผ ํ•œ๋‹ค.

User

  • auth์Šคํ‚ค๋งˆ์— ์ €์žฅ๋œ user ID๋ฅผ ๊ฐ€์ง„ ์‚ฌ๋žŒ
  • ์œ ์ €๋Š” Access Token์„ ๋ฐœ๊ธ‰ ๋ฐ›์•„์„œ Supabase endpoint์— ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๋‹ค.
  • RLS๋ฅผ ํ†ตํ•ด์„œ ๋ฆฌ์†Œ์Šค์— ๋Œ€ํ•œ ์œ ์ € ์•ก์„ธ์Šค๋ฅผ ์ œํ•œํ•  ์ˆ˜ ์žˆ๋‹ค.

Permanent and anonymous users

  • ์˜๊ตฌ ์œ ์ €: ๊ฐœ์ธ ์‹๋ณ„ ์ •๋ณด(PII)์— ์—ฐ๊ฒฐ๋œ ์œ ์ €, ์ด๋Ÿฌํ•œ ์‹๋ณ„ ์ •๋ณด๋ฅผ ํ†ตํ•ด ๋กœ๊ทธ์•„์›ƒ์„ ํ•ด๋„ ๋‹ค์‹œ ๊ณ„์ •์— ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๋‹ค.
  • ์ต๋ช… ์œ ์ €: ๊ฐœ์ธ ์‹๋ณ„ ์ •๋ณด๊ฐ€ ์—†๋Š” ์œ ์ € ๋กœ๊ทธ์•„์›ƒ ํ•  ๊ฒฝ์šฐ ๋™์ผํ•œ ์‚ฌ์šฉ์ž๋กœ ๋‹ค์‹œ ๋กœ๊ทธ์ธ ํ•  ๋ฐฉ๋ฒ•์ด ์—†๋‹ค.

User roles

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

User Session

Supabase Auth๋Š” ์œ ์ € ์„ธ์…˜์— ๋Œ€ํ•œ ์„ธ๋ถ„ํ™”๋œ ์ œ์–ด ๊ธฐ๋Šฅ์„ ์ œ๊ณตํ•œ๋‹ค.

  • ์œ ์ €๊ฐ€ ๋กœ๊ทธ์ธ ํ•˜๋ฉด ์„ธ์…˜์ด ์ƒ์„ฑ๋œ๋‹ค.
  • ๊ธฐ๋ณธ์ ์œผ๋กœ ์„ธ์…˜์€ ์ œํ•œ ์‹œ๊ฐ„์ด ์ •ํ•ด์ ธ ์žˆ์ง€ ์•Š๊ณ , ํ™œ์„ฑํ™”๋œ ์„ธ์…˜๊ณผ ์žฅ์น˜์˜ ๊ฐœ์ˆ˜๋„ ์ œํ•œํ•˜์ง€ ์•Š๋Š”๋‹ค.
  • JWT ํ˜•ํƒœ์˜ access token๊ณผ ๊ณ ์œ  ๋ฌธ์ž์—ด(unique string)์ธ refresh token์œผ๋กœ ํ‘œํ˜„๋œ๋‹ค.
  • ๊ธฐ๋ณธ์ ์œผ๋กœ ์•ก์„ธ์Šค ํ† ํฐ์€ 5๋ถ„ - 1์‹œ๊ฐ„ ์‚ฌ์ด์˜ ์งง์€ ๋งŒ๋ฃŒ ์‹œ๊ฐ„์„ ๊ฐ€์ง€๊ณ , ๋ฆฌํ”„๋ ˆ์‹œ ํ† ํฐ์€ ๋งŒ๋ฃŒ ์‹œ๊ฐ„์ด ์—†์ง€๋งŒ ๋‹จ ํ•œ๋ฒˆ๋งŒ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.
    • refresh token์„ ์‚ฌ์šฉํ•œ๋‹ค(์„ธ์…˜ ์ƒˆ๋กœ ๊ณ ์นจ): ์ƒˆ๋กœ์šด access token, refresh token ์Œ๊ณผ ๊ตํ™˜ํ•œ๋‹ค.
  • ์„ธ์…˜์ด ์ข…๋ฃŒ๋˜๋Š” ๊ฒƒ์€ config์— ๋‹ฌ๋ ค์žˆ๋‹ค
    • ๋กœ๊ทธ์•„์›ƒ
    • ๋น„๋ฐ€๋ฒˆํ˜ธ ๋ณ€๊ฒฝ, ๋ณด์•ˆ์ƒ ๋ฏผ๊ฐํ•œ ์ž‘์—… ์ˆ˜ํ–‰
    • ๋น„ํ™œ์„ฑ์œผ๋กœ ์ธํ•œ ์‹œ๊ฐ„ ์ดˆ๊ณผ
    • ์„ธ์…˜ ๋งŒ๋ฃŒ ์‹œ๊ฐ„์— ๋„๋‹ฌ (์œ„์™€ ๋‹ค๋ฅธ ์ ์€, ์œ„๋Š” ๋น„ํ™œ์„ฑ ์ƒํƒœ๊ฐ€ ์–ผ๋งˆ๋‚˜ ์ง€์†๋˜์—ˆ๋А๋ƒ๊ฐ€ ๊ธฐ์ค€์ด๊ณ , ์ด ๊ฒƒ์€ ๋น„ํ™œ์„ฑ ์ƒํƒœ๋ž‘ ์ƒ๊ด€ ์—†์ด ๋งŒ๋ฃŒ ์‹œ๊ฐ„์— ๋„๋‹ฌํ•˜๋ฉด ๋ฌด์กฐ๊ฑด ์„ธ์…˜์„ ์ข…๋ฃŒ ์‹œํ‚ด)
    • ๋‹ค๋ฅธ ์žฅ์น˜ ๋กœ๊ทธ์ธ

Access token(JWT) claims

๋ชจ๋“  ์•ก์„ธ์Šค ํ† ํฐ์€ session_id ํด๋ ˆ์ž„, UUID๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ๋‹ค. ์ด ID๋ฅผ auth.sessions์˜ ํ…Œ์ด๋ธ”์˜ ๊ธฐ๋ณธ ํ‚ค์™€ ์ƒ๊ด€๊ด€๊ณ„๋ฅผ ๋งŒ๋“ค ์ˆ˜ ์žˆ๋‹ค.

Initiating a session

์„ธ์…˜์€ ์œ ์ €๊ฐ€ ๋กœ๊ทธ์ธ ํ–ˆ์„ ๋•Œ ๊ฐœ์‹œ๋œ๋‹ค. ์„ธ์…˜์€ auth.sessionํ…Œ์ด๋ธ”์— ์ €์žฅ๋˜๊ณ , ์•ฑ์€ access์™€ refresh token์„ ์ˆ˜์‹ ํ•ด์•ผ ํ•œ๋‹ค. session์„ ๊ฐœ์‹œํ•˜๋Š” ํ๋ฆ„์€ ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค:

  1. ๋กœ๊ทธ์ธ์— ์„ฑ๊ณตํ•˜๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์€ ํ˜•ํƒœ์˜ URL๊ณผ ํ•จ๊ป˜ ์•ฑ์œผ๋กœ ๋ฆฌ๋””๋ ‰์…˜ ๋œ๋‹ค.
https://yourapp.com/...#access_token=<...>&refresh_token=<...>&...

URL์— access token๊ณผ refresh token์ด ํฌํ•จ๋˜์–ด ์žˆ๋‹ค.

  1. ์ด๋Ÿฌํ•œ ์œ ํ˜•์˜ URL์„ ๊ฐ์ง€ํ•˜๊ณ 
  2. ์ •๋ณด๋ฅผ ์ถ”์ถœํ•œ ๋‹ค์Œ
  3. ์•ฑ์—์„œ ์ถ”๊ฐ€์ ์œผ๋กœ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋„๋ก ๋กœ์ปฌ ์ €์žฅ์†Œ์— ๋ณด๊ด€ํ•œ๋‹ค.

Anonymous user vs the anon key

  • ์ต๋ช… ์œ ์ €๋Š” ๋กœ๊ทธ์•„์›ƒํ•˜๊ฑฐ๋‚˜ ๋ธŒ๋ผ์šฐ์ง• ๋ฐ์ดํ„ฐ๋ฅผ ์ง€์šฐ๊ฑฐ๋‚˜ ๋‹ค๋ฅธ ์žฅ์น˜๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ ๊ณ„์ •์— ์•ก์„ธ์Šคํ•  ์ˆ˜ ์—†๋‹ค๋Š” ๊ฒƒ์„ ์ œ์™ธํ•˜๊ณ ๋Š” ์˜๊ตฌ ์œ ์ €์™€ ๊ฐ™๋‹ค.
  • ์˜๊ตฌ ์œ ์ €์ฒ˜๋Ÿผ authenticated role ์€ ์ต๋ช… ์œ ์ €์˜ JWT์—๋Š” RLS ์ •์ฑ…์—์„œ ๊ตฌ๋ณ„ํ•˜๋Š” ๋ฐ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” is_anonymousํด๋ ˆ์ž„์ด ์žˆ๋‹ค.
  • anon API Key๋Š” ์œ ์ €๋ฅผ ์ƒ์„ฑํ•˜์ง€ ์•Š๊ณ , anon role ์‚ฌ์šฉํ•˜๋ฏ€๋กœ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์— ๋Œ€ํ•œ ๊ณต๊ฐœ ์•ก์„ธ์Šค๋ฅผ ๊ตฌํ˜„ํ•˜๋Š”๋ฐ ์‚ฌ์šฉํ•œ๋‹ค.

โš ๏ธ ์ต๋ช… ๋กœ๊ทธ์ธ์„ ํ™œ์„ฑํ™” ํ•˜๊ธฐ ์ „์— RLS ์ •์ฑ…์„ ํ™•์ธํ•ด์•ผ ํ•œ๋‹ค. ์ต๋ช… ์œ ์ €๋Š” authenticated role์„ ์‚ฌ์šฉํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์˜๊ตฌ ์œ ์ €์™€ ๊ตฌ๋ถ„์„ ์œ„ํ•ด์„œ๋Š” JWT ํ† ํฐ์— ์žˆ๋Š” is_anonymous ํ•„๋“œ๋ฅผ ํ™•์ธํ•˜์ž.

Access control

Anonymous Sign-Ins

์ต๋ช… ์œ ์ €๋Š” ์˜๊ตฌ ์œ ์ €์ฒ˜๋Ÿผ authenticated role์„ ์‚ฌ์šฉํ•˜๊ธฐ ๋•Œ๋ฌธ์—, RLS ์ •์ฑ…์„ ์‚ฌ์šฉํ•˜์—ฌ auth.jwt()์—์„œ ๋ฆฌํ„ด๋œ is_anonymousํด๋ ˆ์ž„์„ ์ด์šฉํ•˜์—ฌ ๊ตฌ๋ถ„ํ•  ์ˆ˜ ์žˆ๋‹ค.

REST API ํŠน์ง•

Supabase๋Š” ์ด๋Š” PostgREST๋ฅผ ์‚ฌ์šฉํ•˜๋Š” API ๋ ˆ์ด์–ด๋ฅผ ์ œ๊ณตํ•œ๋‹ค. ์ด๋Š” Postgres ์œ„์— ์žˆ๋Š” ์–‡์€ ๋ ˆ์ด์–ด์ด๋‹ค.

  • CRUD์™€ ๊ด€๋ จ๋œ ๋ชจ๋“  ์ž‘์—…์€ ๋‹ค์Œ URL์—์„œ ํ•  ์ˆ˜ ์žˆ๋‹ค:

    https://<project_ref>.supabase.co/rest/v1/
    -- ์šฐ๋ฆฌ ์ฃผ์†Œ๋Š”: https://hgdhgd.supabase.co/rest/v1/
    
  • ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋ฅผ ์—…๋ฐ์ดํŠธ ํ•˜๋ฉด, ๋ณ€๊ฒฝ ์‚ฌํ•ญ์ด ๊ณง๋ฐ”๋กœ API์— ๋ฐ˜์˜๋œ๋‹ค.

  • RLS๋ฅผ ์‚ฌ์šฉํ•ด ๋ณด์•ˆ์ด ๊ตฌ์„ฑ๋œ๋‹ค.

  • Firebase๋ณด๋‹ค ์ฝ๊ธฐ ์ž‘์—…์ด 3๋ฐฐ ์ด์ƒ ๋น ๋ฅด๋‹ค.

Postgres ๊ธฐ๋Šฅ ์ง€์›

  • ๊ธฐ๋ณธ CRUD ์ž‘์—… (Create/Read/Update/Delete)
  • Postgres ๋ทฐ(Views), ๋ฌผ๋ฆฌ์  ๋ทฐ(Materialized Views)
    • ๋ฌผ๋ฆฌ์  ๋ทฐ: ์‹ค์ œ๋กœ ๋ฐ์ดํ„ฐ๊ฐ€ ์ €์žฅ๋˜์–ด ์žˆ๋Š” ๋ทฐ
  • Postgres ํ•จ์ˆ˜
    • ํŠน์ • ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•˜๋Š” SQL ์ฝ”๋“œ ๋ธ”๋ก, ๋ณต์žกํ•œ ๋กœ์ง์„ ์‰ฝ๊ฒŒ ์žฌ์‚ฌ์šฉ ํ•  ์ˆ˜ ์žˆ์Œ.
  • Postgres์˜ ๋ณด์•ˆ ๋ชจ๋ธ - Row Level Security, ์—ญํ• (Role), ๊ถŒํ•œ ๋ถ€์—ฌ(Grants)๋ฅผ ํฌํ•จ
โš ๏ธ **GitHub.com Fallback** โš ๏ธ