Skip to main content
Sonamu๋Š” better-auth๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ํ•˜๋Š” ์ธ์ฆ ์‹œ์Šคํ…œ์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. ์ด๋ฉ”์ผ/๋น„๋ฐ€๋ฒˆํ˜ธ ์ธ์ฆ, ์†Œ์…œ ๋กœ๊ทธ์ธ ๋“ฑ ๋‹ค์–‘ํ•œ ์ธ์ฆ ๋ฐฉ์‹์„ ์ง€์›ํ•˜๋ฉฐ, /api/auth/* ๊ฒฝ๋กœ๋กœ ์ธ์ฆ API๊ฐ€ ์ž๋™ ๋“ฑ๋ก๋ฉ๋‹ˆ๋‹ค.

๊ธฐ๋ณธ ๊ตฌ์กฐ

auth ์„ค์ •

ํƒ€์ž…

ํƒ€์ž…: BetterAuthOptions (better-auth ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์˜ ์„ค์ • ํƒ€์ž…)

์ด๋ฉ”์ผ/๋น„๋ฐ€๋ฒˆํ˜ธ ์ธ์ฆ

์†Œ์…œ ๋กœ๊ทธ์ธ (Google)

์†Œ์…œ ๋กœ๊ทธ์ธ (GitHub)

basePath ์ปค์Šคํ„ฐ๋งˆ์ด์ง•

๊ธฐ๋ณธ ๊ฒฝ๋กœ๋Š” /api/auth์ž…๋‹ˆ๋‹ค. ๋ณ€๊ฒฝ์ด ํ•„์š”ํ•œ ๊ฒฝ์šฐ:

์—”ํ‹ฐํ‹ฐ ์ƒ์„ฑ

better-auth๋ฅผ ์‚ฌ์šฉํ•˜๋ ค๋ฉด ๋จผ์ € ํ•„์š”ํ•œ ์—”ํ‹ฐํ‹ฐ๋“ค์„ ์ƒ์„ฑํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

CLI๋กœ ์—”ํ‹ฐํ‹ฐ ์ƒ์„ฑ

์ด ๋ช…๋ น์€ ๋‹ค์Œ ์—”ํ‹ฐํ‹ฐ๋“ค์„ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค:
์ด๋ฏธ User ์—”ํ‹ฐํ‹ฐ๊ฐ€ ์žˆ๋Š” ๊ฒฝ์šฐ, ๋ช…๋ น ์‹คํ–‰ ์‹œ ๋ˆ„๋ฝ๋œ ํ•„๋“œ๋งŒ ์ถ”๊ฐ€๋ฉ๋‹ˆ๋‹ค.

ํ”Œ๋Ÿฌ๊ทธ์ธ๊ณผ ํ•จ๊ป˜ ์—”ํ‹ฐํ‹ฐ ์ƒ์„ฑ

better-auth ํ”Œ๋Ÿฌ๊ทธ์ธ์„ ์‚ฌ์šฉํ•˜๋ ค๋ฉด --plugins ์˜ต์…˜์œผ๋กœ ํ•„์š”ํ•œ ํ”Œ๋Ÿฌ๊ทธ์ธ๋“ค์„ ์ง€์ •ํ•ฉ๋‹ˆ๋‹ค:
์ง€์›ํ•˜๋Š” ํ”Œ๋Ÿฌ๊ทธ์ธ:
ํ”Œ๋Ÿฌ๊ทธ์ธ ์‚ฌ์šฉ ์‹œ sonamu.config.ts์—์„œ๋„ ํ•ด๋‹น ํ”Œ๋Ÿฌ๊ทธ์ธ์„ ํ™œ์„ฑํ™”ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์ž์„ธํ•œ ๋‚ด์šฉ์€ ์•„๋ž˜ ํ”Œ๋Ÿฌ๊ทธ์ธ ์„ค์ • ์„น์…˜์„ ์ฐธ์กฐํ•˜์„ธ์š”.

ํ•„๋“œ ๋งคํ•‘

Sonamu๋Š” snake_case ์ปฌ๋Ÿผ๋ช…์„ ์‚ฌ์šฉํ•˜๋ฏ€๋กœ, better-auth์˜ camelCase ํ•„๋“œ๋ช…์ด ์ž๋™์œผ๋กœ ๋งคํ•‘๋ฉ๋‹ˆ๋‹ค:

์ธ์ฆ API

better-auth๊ฐ€ ๋“ฑ๋ก๋˜๋ฉด ๋‹ค์Œ API๋“ค์ด ์ž๋™์œผ๋กœ ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค:

ํšŒ์›๊ฐ€์ž…

๋กœ๊ทธ์ธ

๋กœ๊ทธ์•„์›ƒ

ํ˜„์žฌ ์„ธ์…˜

์†Œ์…œ ๋กœ๊ทธ์ธ (Google)

์ „์ฒด API ๋ชฉ๋ก์€ better-auth ๋ฌธ์„œ๋ฅผ ์ฐธ์กฐํ•˜์„ธ์š”.

Context์—์„œ ์‚ฌ์šฉ์ž ์ •๋ณด ์ ‘๊ทผ

์ธ์ฆ๋œ ์š”์ฒญ์—์„œ๋Š” Context๋ฅผ ํ†ตํ•ด ์‚ฌ์šฉ์ž ์ •๋ณด์— ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

User ํƒ€์ž…

Session ํƒ€์ž…

Guard๋ฅผ ์ด์šฉํ•œ ์ ‘๊ทผ ์ œ์–ด

guardHandler ์„ค์ •:

ํด๋ผ์ด์–ธํŠธ ์ธก ์—ฐ๋™

React์—์„œ ์‚ฌ์šฉ

ํ”Œ๋Ÿฌ๊ทธ์ธ ์„ค์ •

better-auth ํ”Œ๋Ÿฌ๊ทธ์ธ์„ ์‚ฌ์šฉํ•˜๋ ค๋ฉด sonamu.config.ts์˜ auth.plugins ๋ฐฐ์—ด์— ํ”Œ๋Ÿฌ๊ทธ์ธ์„ ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค.
ํ”Œ๋Ÿฌ๊ทธ์ธ์„ ์„ค์ •ํ•˜๊ธฐ ์ „์— ๋จผ์ € pnpm sonamu auth generate --plugins=... ๋ช…๋ น์œผ๋กœ ํ•„์š”ํ•œ ์—”ํ‹ฐํ‹ฐ์™€ ํ•„๋“œ๋ฅผ ์ƒ์„ฑํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

2๋‹จ๊ณ„ ์ธ์ฆ (2FA)

TOTP ๊ธฐ๋ฐ˜ 2๋‹จ๊ณ„ ์ธ์ฆ์„ ํ™œ์„ฑํ™”ํ•ฉ๋‹ˆ๋‹ค:
2FA ๊ด€๋ จ API:
  • POST /api/auth/two-factor/enable - 2FA ํ™œ์„ฑํ™” ์‹œ์ž‘
  • POST /api/auth/two-factor/verify - 2FA ์ฝ”๋“œ ๊ฒ€์ฆ
  • POST /api/auth/two-factor/disable - 2FA ๋น„ํ™œ์„ฑํ™”

๊ด€๋ฆฌ์ž ํ”Œ๋Ÿฌ๊ทธ์ธ (Admin)

์‚ฌ์šฉ์ž ์—ญํ• , ์ฐจ๋‹จ ๊ธฐ๋Šฅ, ๋Œ€๋ฆฌ ๋กœ๊ทธ์ธ(impersonation)์„ ์ง€์›ํ•ฉ๋‹ˆ๋‹ค:
Admin ํ”Œ๋Ÿฌ๊ทธ์ธ์ด User ํ…Œ์ด๋ธ”์— ์ถ”๊ฐ€ํ•˜๋Š” ํ•„๋“œ:
  • role - ์‚ฌ์šฉ์ž ์—ญํ•  (๊ธฐ๋ณธ๊ฐ’: โ€œuserโ€)
  • banned - ์ฐจ๋‹จ ์—ฌ๋ถ€
  • ban_reason - ์ฐจ๋‹จ ์‚ฌ์œ 
  • ban_expires - ์ฐจ๋‹จ ๋งŒ๋ฃŒ ์‹œ๊ฐ„ (Unix timestamp)

์‚ฌ์šฉ์ž๋ช… ํ”Œ๋Ÿฌ๊ทธ์ธ (Username)

์ด๋ฉ”์ผ ๋Œ€์‹  ์‚ฌ์šฉ์ž๋ช…์œผ๋กœ ๋กœ๊ทธ์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค:
Username ํ”Œ๋Ÿฌ๊ทธ์ธ์ด User ํ…Œ์ด๋ธ”์— ์ถ”๊ฐ€ํ•˜๋Š” ํ•„๋“œ:
  • username - ์ •๊ทœํ™”๋œ ์‚ฌ์šฉ์ž๋ช… (์†Œ๋ฌธ์ž, unique ์ธ๋ฑ์Šค)
  • display_username - ํ‘œ์‹œ์šฉ ์‚ฌ์šฉ์ž๋ช… (์›๋ณธ ์ผ€์ด์Šค ์œ ์ง€)

์ „ํ™”๋ฒˆํ˜ธ ํ”Œ๋Ÿฌ๊ทธ์ธ (Phone Number)

์ „ํ™”๋ฒˆํ˜ธ ์ธ์ฆ์„ ์ง€์›ํ•ฉ๋‹ˆ๋‹ค:
Phone Number ํ”Œ๋Ÿฌ๊ทธ์ธ์ด User ํ…Œ์ด๋ธ”์— ์ถ”๊ฐ€ํ•˜๋Š” ํ•„๋“œ:
  • phone_number - ์ „ํ™”๋ฒˆํ˜ธ (unique ์ธ๋ฑ์Šค)
  • phone_number_verified - ์ „ํ™”๋ฒˆํ˜ธ ์ธ์ฆ ์—ฌ๋ถ€

ํŒจ์Šคํ‚ค ํ”Œ๋Ÿฌ๊ทธ์ธ (Passkey)

WebAuthn/FIDO2 ๊ธฐ๋ฐ˜ ํŒจ์Šคํ‚ค ์ธ์ฆ์„ ์ง€์›ํ•ฉ๋‹ˆ๋‹ค:
Passkey ํ”Œ๋Ÿฌ๊ทธ์ธ์ด ์ƒ์„ฑํ•˜๋Š” ํ…Œ์ด๋ธ”:
  • passkeys - ์‚ฌ์šฉ์ž์˜ ํŒจ์Šคํ‚ค ์ •๋ณด (๊ณต๊ฐœํ‚ค, ์ž๊ฒฉ ์ฆ๋ช… ID ๋“ฑ)
Passkey ๊ด€๋ จ API:
  • POST /api/auth/passkey/generate-register-options - ํŒจ์Šคํ‚ค ๋“ฑ๋ก ์˜ต์…˜ ์ƒ์„ฑ
  • POST /api/auth/passkey/verify-registration - ํŒจ์Šคํ‚ค ๋“ฑ๋ก ๊ฒ€์ฆ
  • POST /api/auth/passkey/generate-authentication-options - ํŒจ์Šคํ‚ค ์ธ์ฆ ์˜ต์…˜ ์ƒ์„ฑ
  • POST /api/auth/passkey/verify-authentication - ํŒจ์Šคํ‚ค ์ธ์ฆ ๊ฒ€์ฆ
Passkey ํ”Œ๋Ÿฌ๊ทธ์ธ ์‚ฌ์šฉ ์‹œ @better-auth/passkey ํŒจํ‚ค์ง€๊ฐ€ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.

SSO ํ”Œ๋Ÿฌ๊ทธ์ธ

์™ธ๋ถ€ IdP(OIDC, SAML)๋ฅผ ํ†ตํ•œ SSO ๋กœ๊ทธ์ธ์„ ์ง€์›ํ•ฉ๋‹ˆ๋‹ค:
SSO ํ”Œ๋Ÿฌ๊ทธ์ธ์ด ์ƒ์„ฑํ•˜๋Š” ํ…Œ์ด๋ธ”:
  • sso_providers - SSO ์ œ๊ณต์ž ์„ค์ • (OIDC/SAML ์„ค์ • ํฌํ•จ)
SSO ํ”Œ๋Ÿฌ๊ทธ์ธ ์‚ฌ์šฉ ์‹œ @better-auth/sso ํŒจํ‚ค์ง€๊ฐ€ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.

API ํ‚ค ํ”Œ๋Ÿฌ๊ทธ์ธ (API Key)

API ํ‚ค ๊ธฐ๋ฐ˜ ์ธ์ฆ์„ ์ง€์›ํ•ฉ๋‹ˆ๋‹ค:
API Key ํ”Œ๋Ÿฌ๊ทธ์ธ์ด ์ƒ์„ฑํ•˜๋Š” ํ…Œ์ด๋ธ”:
  • api_keys - API ํ‚ค ์ •๋ณด (ํ•ด์‹œ๋œ ํ‚ค, Rate Limit ์„ค์ • ๋“ฑ)
API Key ๊ด€๋ จ API:
  • POST /api/auth/api-key/create - API ํ‚ค ์ƒ์„ฑ
  • POST /api/auth/api-key/revoke - API ํ‚ค ํ๊ธฐ
  • GET /api/auth/api-key/list - API ํ‚ค ๋ชฉ๋ก ์กฐํšŒ

JWT ํ”Œ๋Ÿฌ๊ทธ์ธ

JWT ํ† ํฐ ๋ฐœ๊ธ‰ ๋ฐ JWKS ํ‚ค ๊ด€๋ฆฌ๋ฅผ ์ง€์›ํ•ฉ๋‹ˆ๋‹ค:
JWT ํ”Œ๋Ÿฌ๊ทธ์ธ์ด ์ƒ์„ฑํ•˜๋Š” ํ…Œ์ด๋ธ”:
  • jwks - JSON Web Key Set ์ •๋ณด (๊ณต๊ฐœํ‚ค, ๋น„๋ฐ€ํ‚ค)
JWT ๊ด€๋ จ API:
  • GET /api/auth/.well-known/jwks.json - JWKS ์—”๋“œํฌ์ธํŠธ
  • POST /api/auth/jwt/generate - JWT ํ† ํฐ ์ƒ์„ฑ

์กฐ์ง ํ”Œ๋Ÿฌ๊ทธ์ธ (Organization)

์กฐ์ง, ๋ฉค๋ฒ„, ์ดˆ๋Œ€, ํŒ€ ๊ด€๋ฆฌ๋ฅผ ์ง€์›ํ•ฉ๋‹ˆ๋‹ค:
Organization ํ”Œ๋Ÿฌ๊ทธ์ธ์ด ์ƒ์„ฑํ•˜๋Š” ํ…Œ์ด๋ธ”:
  • organizations - ์กฐ์ง ์ •๋ณด
  • members - ์กฐ์ง ๋ฉค๋ฒ„
  • invitations - ์กฐ์ง ์ดˆ๋Œ€
  • teams - ํŒ€
  • team_members - ํŒ€ ๋ฉค๋ฒ„
Organization ํ”Œ๋Ÿฌ๊ทธ์ธ์ด Session ํ…Œ์ด๋ธ”์— ์ถ”๊ฐ€ํ•˜๋Š” ํ•„๋“œ:
  • active_organization_id - ํ˜„์žฌ ํ™œ์„ฑ ์กฐ์ง ID
  • active_team_id - ํ˜„์žฌ ํ™œ์„ฑ ํŒ€ ID
Organization ๊ด€๋ จ API:
  • POST /api/auth/organization/create - ์กฐ์ง ์ƒ์„ฑ
  • POST /api/auth/organization/invite - ๋ฉค๋ฒ„ ์ดˆ๋Œ€
  • POST /api/auth/organization/accept-invitation - ์ดˆ๋Œ€ ์ˆ˜๋ฝ
  • POST /api/auth/organization/set-active - ํ™œ์„ฑ ์กฐ์ง ์„ค์ •

์ต๋ช… ์‚ฌ์šฉ์ž ํ”Œ๋Ÿฌ๊ทธ์ธ (Anonymous)

์ต๋ช… ์‚ฌ์šฉ์ž ์ธ์ฆ์„ ์ง€์›ํ•ฉ๋‹ˆ๋‹ค. ํšŒ์›๊ฐ€์ž… ์—†์ด ์ž„์‹œ ์‚ฌ์šฉ์ž๋ฅผ ์ƒ์„ฑํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค:
Anonymous ํ”Œ๋Ÿฌ๊ทธ์ธ์ด User ํ…Œ์ด๋ธ”์— ์ถ”๊ฐ€ํ•˜๋Š” ํ•„๋“œ:
  • is_anonymous - ์ต๋ช… ์‚ฌ์šฉ์ž ์—ฌ๋ถ€
Anonymous ๊ด€๋ จ API:
  • POST /api/auth/sign-in/anonymous - ์ต๋ช… ๋กœ๊ทธ์ธ
  • POST /api/auth/anonymous/link - ์ต๋ช… ๊ณ„์ •์„ ์ •์‹ ๊ณ„์ •์œผ๋กœ ์—ฐ๊ฒฐ

์—ฌ๋Ÿฌ ํ”Œ๋Ÿฌ๊ทธ์ธ ํ•จ๊ป˜ ์‚ฌ์šฉ

๊ฐ ํ”Œ๋Ÿฌ๊ทธ์ธ์˜ ์Šคํ‚ค๋งˆ(*_SCHEMA)๋Š” Sonamu์˜ snake_case ์ปฌ๋Ÿผ๋ช…๊ณผ better-auth์˜ camelCase ํ•„๋“œ๋ช…์„ ๋งคํ•‘ํ•˜๋Š” ์—ญํ• ์„ ํ•ฉ๋‹ˆ๋‹ค. ๋ฐ˜๋“œ์‹œ ํ•ด๋‹น ํ”Œ๋Ÿฌ๊ทธ์ธ๊ณผ ํ•จ๊ป˜ ์ „๋‹ฌํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

์‹ค์ „ ์˜ˆ์‹œ

๊ธฐ๋ณธ ์„ค์ •

์†Œ์…œ ๋กœ๊ทธ์ธ + ์ด๋ฉ”์ผ ์ธ์ฆ

์ฃผ์˜์‚ฌํ•ญ

1. ์—”ํ‹ฐํ‹ฐ ์ƒ์„ฑ ํ•„์ˆ˜

2. ํ™˜๊ฒฝ ๋ณ€์ˆ˜ ์„ค์ •

3. CORS ์„ค์ •

ํด๋ผ์ด์–ธํŠธ๊ฐ€ ๋‹ค๋ฅธ ๋„๋ฉ”์ธ์—์„œ ์‹คํ–‰๋˜๋Š” ๊ฒฝ์šฐ:

4. ๊ธฐ์กด User ์—”ํ‹ฐํ‹ฐ์™€์˜ ํ˜ธํ™˜์„ฑ

์ด๋ฏธ User ์—”ํ‹ฐํ‹ฐ๊ฐ€ ์žˆ๋Š” ๊ฒฝ์šฐ, pnpm sonamu auth generate ์‹คํ–‰ ์‹œ ๋ˆ„๋ฝ๋œ ํ•„๋“œ๋งŒ ์ถ”๊ฐ€๋ฉ๋‹ˆ๋‹ค. ๊ธฐ์กด ๋ฐ์ดํ„ฐ๋Š” ์œ ์ง€๋ฉ๋‹ˆ๋‹ค.

๋‹ค์Œ ๋‹จ๊ณ„

์ธ์ฆ ์„ค์ •์„ ์™„๋ฃŒํ–ˆ๋‹ค๋ฉด:
  • Context - Context์—์„œ ์‚ฌ์šฉ์ž ์ •๋ณด ์ ‘๊ทผ
  • Guards - API ์ ‘๊ทผ ์ œ์–ด