• ์ธ์ฆ ๋ฉ”์ผ ๊ตฌ์„ฑ์€ ์ธ์ฆ ์ฒ˜๋ฆฌ, ๋ฉ”์ผ ๋ฐœ์†ก, ๋„๋ฉ”์ธ ๊ฒ€์ฆ, ์ธ์ฆ ๊ฒฐ๊ณผ ์›น ํ™”๋ฉด์„ ์—ฐ๊ฒฐํ•œ ๊ตฌ์กฐ
  • ์•ฑ์ด ์š”์ฒญํ•œ ํšŒ์›๊ฐ€์ž… ํ™•์ธยท๋น„๋ฐ€๋ฒˆํ˜ธ ์žฌ์„ค์ • ๋ฉ”์ผ์„ ์ž์ฒด ๋„๋ฉ”์ธ์—์„œ ๋ฐœ์†กํ•˜๊ธฐ ์œ„ํ•œ ๊ตฌ์„ฑ
  • ์›น์‚ฌ์ดํŠธ ์ฃผ์†Œ์™€ ๋ฉ”์ผ ๋ฐœ์‹  ์ฃผ์†Œ๊ฐ€ ํ•˜๋‚˜์˜ ์†Œ์œ  ๋„๋ฉ”์ธ ์•„๋ž˜์—์„œ ์„œ๋กœ ๋‹ค๋ฅธ ์—ญํ• ์„ ๋งก๋Š” ๊ตฌ์„ฑ

ํ•ด๋‹น ๊ฐœ๋…์ด ํ•„์š”ํ•œ ์ด์œ 

Supabase Auth๋ฅผ ์—ฐ๊ฒฐํ•˜๋ฉด ๋ณ„๋„์˜ ๋ฉ”์ผ ์„œ๋น„์Šค๋ฅผ ์„ค์ •ํ•˜์ง€ ์•Š์•„๋„ ํšŒ์›๊ฐ€์ž… ํ™•์ธ ๋ฉ”์ผ์„ ์‹œํ—˜ํ•ด ๋ณผ ์ˆ˜ ์žˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ๊ธฐ๋ณธ SMTP๋Š” ํ”„๋กœ์ ํŠธ ํŒ€์— ๋“ฑ๋ก๋œ ์ฃผ์†Œ๋กœ๋งŒ ๋ฐœ์†กํ•˜๊ณ , ํ˜„์žฌ ํ”„๋กœ์ ํŠธ๋‹น ์‹œ๊ฐ„๋‹น 2ํ†ต์œผ๋กœ ์ œํ•œ๋œ๋‹ค. ์ „์†ก SLA๋„ ์ œ๊ณตํ•˜์ง€ ์•Š์•„ ์ผ๋ฐ˜ ์‚ฌ์šฉ์ž์—๊ฒŒ ๋ฉ”์ผ์„ ๋ณด๋‚ด๋Š” ์ถœ์‹œ ํ™˜๊ฒฝ์—๋Š” ์ ํ•ฉํ•˜์ง€ ์•Š๋‹ค. Supabase Custom SMTP ๋ฌธ์„œ

๋ฉ”์ผ ๋‚ด์šฉ์„ ๋ฐ”๊พธ๋ ค๋Š” ๊ฒฝ์šฐ์—๋„ ์กฐ๊ฑด์ด ์žˆ๋‹ค. 2026๋…„ 6์›” 3์ผ ์ดํ›„ ์ƒ์„ฑ๋œ Supabase Free ํ”„๋กœ์ ํŠธ๊ฐ€ ๊ธฐ๋ณธ SMTP๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ์ธ์ฆ ๋ฉ”์ผ ํ…œํ”Œ๋ฆฟ์„ ์ˆ˜์ •ํ•  ์ˆ˜ ์—†๋‹ค. ์ด๊ฒƒ์€ โ€œFree ํ”Œ๋žœ์—์„œ๋Š” ํ…œํ”Œ๋ฆฟ ์ˆ˜์ •์ด ์ „๋ถ€ ๋ถˆ๊ฐ€๋Šฅํ•˜๋‹คโ€๋Š” ๋œป์ด ์•„๋‹ˆ๋‹ค. Free ํ”„๋กœ์ ํŠธ์— Custom SMTP๋ฅผ ์—ฐ๊ฒฐํ•˜๋ฉด ์ œ๋ชฉ๊ณผ ๋ณธ๋ฌธ์„ ์ˆ˜์ •ํ•  ์ˆ˜ ์žˆ๋‹ค. ๊ธฐ์กด Free ํ”„๋กœ์ ํŠธ์™€ ์œ ๋ฃŒ ํ”„๋กœ์ ํŠธ์—๋„ ๊ฐ™์€ ์ œํ•œ์ด ์ผ๊ด„ ์ ์šฉ๋˜๋Š” ๊ฒƒ์€ ์•„๋‹ˆ๋‹ค. Supabase ํ…œํ”Œ๋ฆฟ ์ •์ฑ… ๋ณ€๊ฒฝ

AS-IS

sequenceDiagram
    autonumber
    participant App as ์•ฑ
    participant Auth as Supabase Auth
    participant Default as Supabase ๊ธฐ๋ณธ SMTP
    participant Inbox as ์‚ฌ์šฉ์ž ๋ฉ”์ผํ•จ

    App->>Auth: ํšŒ์›๊ฐ€์ž… ๋˜๋Š” ๋น„๋ฐ€๋ฒˆํ˜ธ ์žฌ์„ค์ • ์š”์ฒญ
    Auth->>Default: ์ธ์ฆ ๋ฉ”์ผ ๋ฐœ์†ก ์š”์ฒญ
    Note over Default: ํ”„๋กœ์ ํŠธ ํŒ€ ์ฃผ์†Œ๋งŒ ํ—ˆ์šฉ<br/>ํ˜„์žฌ ํ”„๋กœ์ ํŠธ๋‹น ์‹œ๊ฐ„๋‹น 2ํ†ต
    Default-->>Inbox: ์ œํ•œ๋œ ํ…Œ์ŠคํŠธ ๋ฉ”์ผ

TO-BE

sequenceDiagram
    autonumber
    participant App as ์•ฑ
    participant Auth as Supabase Auth
    participant DNS as Cloudflare DNS
    participant Resend as Resend SMTP
    participant Inbox as ์‚ฌ์šฉ์ž ๋ฉ”์ผํ•จ
    participant User as ์‚ฌ์šฉ์ž ๋ธŒ๋ผ์šฐ์ €
    participant Firebase as Firebase Hosting

    Note over DNS,Resend: ์‚ฌ์ „ ์„ค์ •: DNS์— Resend๊ฐ€ ์•ˆ๋‚ดํ•œ DKIMยท๋ฐœ์†ก ๋ ˆ์ฝ”๋“œ๋ฅผ ๋“ฑ๋ก
    Note over DNS,Firebase: ์‚ฌ์ „ ์„ค์ •: DNS์— Firebase๊ฐ€ ์•ˆ๋‚ดํ•œ ์›นยท์†Œ์œ ๊ถŒยท์ธ์ฆ์„œ ๋ ˆ์ฝ”๋“œ๋ฅผ ๋“ฑ๋ก
    Resend->>DNS: ๋ฐœ์‹  ๋„๋ฉ”์ธ DNS ๋ ˆ์ฝ”๋“œ ์กฐํšŒ
    DNS-->>Resend: DKIMยท๋ฐœ์†ก ๋ ˆ์ฝ”๋“œ ์‘๋‹ต
    Resend->>Resend: ๋ฐœ์‹  ๋„๋ฉ”์ธ ๊ฒ€์ฆ
    Firebase->>DNS: ์›น ๋„๋ฉ”์ธยท์ธ์ฆ์„œ ๋ ˆ์ฝ”๋“œ ์กฐํšŒ
    DNS-->>Firebase: AยทTXT ๋ ˆ์ฝ”๋“œ ์‘๋‹ต
    Firebase->>Firebase: ๋„๋ฉ”์ธ ์—ฐ๊ฒฐ ๋ฐ HTTPS ์ธ์ฆ์„œ ํ™•์ธ

    App->>Auth: ๊ฐ€์ž… ํ™•์ธ ๋˜๋Š” ๋น„๋ฐ€๋ฒˆํ˜ธ ์žฌ์„ค์ • ์š”์ฒญ
    Auth->>Auth: ํ† ํฐ ์ƒ์„ฑ ๋ฐ ํ…œํ”Œ๋ฆฟ ๋ Œ๋”๋ง
    Auth->>Resend: SMTP๋กœ ์ธ์ฆ ๋ฉ”์ผ ์ „๋‹ฌ
    Resend->>Inbox: ์ธ์ฆ ๋ฉ”์ผ ๋ฐœ์†ก
    Inbox-->>User: ์ธ์ฆ ๋ฉ”์ผ ๋„์ฐฉ
    User->>Firebase: ๋ฉ”์ผ์˜ ์ธ์ฆ ๋งํฌ ์—ด๊ธฐ
    Firebase->>Auth: ํ† ํฐ ๊ฒ€์ฆ ์š”์ฒญ
    Auth-->>Firebase: ๊ฒ€์ฆ ๊ฒฐ๊ณผ ์ „๋‹ฌ
    alt ํšŒ์›๊ฐ€์ž… ํ™•์ธ
        Firebase-->>User: ๊ฐ€์ž… ํ™•์ธ ์™„๋ฃŒ ํ™”๋ฉด ํ‘œ์‹œ
    else ๋น„๋ฐ€๋ฒˆํ˜ธ ์žฌ์„ค์ •
        Firebase-->>User: ์ƒˆ ๋น„๋ฐ€๋ฒˆํ˜ธ ์ž…๋ ฅ ํ™”๋ฉด ํ‘œ์‹œ
        User->>Firebase: ์ƒˆ ๋น„๋ฐ€๋ฒˆํ˜ธ ์ž…๋ ฅ
        Firebase->>Auth: ๋น„๋ฐ€๋ฒˆํ˜ธ ๋ณ€๊ฒฝ ์š”์ฒญ
        Auth-->>Firebase: ๋ณ€๊ฒฝ ๊ฒฐ๊ณผ ์ „๋‹ฌ
        Firebase-->>User: ๋ณ€๊ฒฝ ์™„๋ฃŒ ํ™”๋ฉด ํ‘œ์‹œ
    end

๋„ค ์„œ๋น„์Šค๋Š” ๊ฐ๊ฐ ๋ฌด์—‡์„ ํ•˜๋Š”๊ฐ€

์ปดํฌ๋„ŒํŠธ๋งก์€ ์—ญํ• ์ž…๋ ฅ๊ฒฐ๊ณผยท๋‹ค์Œ ๋‹จ๊ณ„
Supabase Auth๊ณ„์ • ์ธ์ฆ, ํ™•์ธยท์žฌ์„ค์ • ํ† ํฐ ์ƒ์„ฑ, ์ธ์ฆ ๋ฉ”์ผ์˜ ์ œ๋ชฉยท๋ณธ๋ฌธยท๋งํฌ ๊ตฌ์„ฑ์•ฑ์˜ ๊ฐ€์ž…ยท์žฌ์„ค์ • ์š”์ฒญ, ์‚ฌ์šฉ์ž ์ด๋ฉ”์ผ๊ณผ language ๋ฉ”ํƒ€๋ฐ์ดํ„ฐํ…œํ”Œ๋ฆฟ์— ๋งž์ถ˜ ๋ฉ”์ผ์„ SMTP๋กœ ์ „๋‹ฌํ•˜๊ณ , ๋งํฌ์—์„œ ๋Œ์•„์˜จ ํ† ํฐ์„ ํ™•์ธ
ResendSMTP ์ค‘๊ณ„์™€ ์‹ค์ œ ์ด๋ฉ”์ผ ๋ฐœ์†ก, ๋ฐœ์‹  ๋„๋ฉ”์ธ์˜ ์ด๋ฉ”์ผ ์ธ์ฆ ์ƒํƒœ ํ™•์ธSupabase์˜ SMTP ์—ฐ๊ฒฐ๊ณผ ๋ฉ”์ผ ๋‚ด์šฉ, DNS์— ๋“ฑ๋ก๋œ ๋ฐœ์‹  ๋„๋ฉ”์ธ ๋ ˆ์ฝ”๋“œ์‚ฌ์šฉ์ž ๋ฉ”์ผํ•จ์œผ๋กœ ์ด๋ฉ”์ผ ์ „๋‹ฌ, ๋ฐœ์‹  ๋„๋ฉ”์ธ ๊ฒ€์ฆ ์ƒํƒœ ์ œ๊ณต
Cloudflare DNS๋„๋ฉ”์ธ ์ด๋ฆ„๋ณ„ DNS ๋ ˆ์ฝ”๋“œ ์ €์žฅ ๋ฐ ์กฐํšŒ ์‘๋‹ตResend๊ฐ€ ์ œ์‹œํ•˜๋Š” ๋ฉ”์ผ ๋ ˆ์ฝ”๋“œ, Firebase๊ฐ€ ์ œ์‹œํ•˜๋Š” ์›นยท์ธ์ฆ์„œ ๋ ˆ์ฝ”๋“œ๋ฉ”์ผ ์„œ๋ฒ„์—๋Š” ๋ฐœ์‹  ์ธ์ฆ ๋ ˆ์ฝ”๋“œ๋ฅผ, ์›น ์š”์ฒญ์—๋Š” Hosting ์—ฐ๊ฒฐ ์ •๋ณด๋ฅผ ์‘๋‹ต
Firebase Hosting๊ฐ€์ž… ํ™•์ธ ๋ฐ ๋น„๋ฐ€๋ฒˆํ˜ธ ์žฌ์„ค์ • ์›น ํŽ˜์ด์ง€ ์ œ๊ณต, HTTPS ์ฒ˜๋ฆฌ์‚ฌ์šฉ์ž๊ฐ€ ์—ฐ ์ธ์ฆ URL, URL์— ํฌํ•จ๋œ ์ธ์ฆ ์ •๋ณด๊ฐ€์ž… ์™„๋ฃŒ ํ™”๋ฉด ํ‘œ์‹œ ๋˜๋Š” ์ƒˆ ๋น„๋ฐ€๋ฒˆํ˜ธ๋ฅผ ๋ฐ›์•„ Supabase Auth์— ๋ณ€๊ฒฝ ์š”์ฒญ

๋”ฐ๋ผ์„œ ์ œ๋ชฉ๊ณผ ๋ณธ๋ฌธ์„ ๋ฐ”๊ฟ€ ๋•Œ๋Š” Supabase Auth์˜ Email Templates๋ฅผ ์ˆ˜์ •ํ•œ๋‹ค. Resend๋Š” ๊ทธ ๊ฒฐ๊ณผ๋ฌผ์„ ์ „๋‹ฌํ•˜๋ฉฐ ๋ฉ”์ผ ํ…œํ”Œ๋ฆฟ์˜ ํŽธ์ง‘ ์žฅ์†Œ๊ฐ€ ์•„๋‹ˆ๋‹ค. Supabase ์ด๋ฉ”์ผ ํ…œํ”Œ๋ฆฟ ๋ฌธ์„œ

Cloudflare DNS๋Š” ์›น์‚ฌ์ดํŠธ๋ฅผ ํ˜ธ์ŠคํŒ…ํ•˜๊ฑฐ๋‚˜ ์ด๋ฉ”์ผ์„ ๋ฐœ์†กํ•˜์ง€ ์•Š๋Š”๋‹ค. DNS ๋ ˆ์ฝ”๋“œ๋ฅผ ๋ณด๊ด€ํ•˜๊ณ  ์กฐํšŒ์— ์‘๋‹ตํ•œ๋‹ค. Cloudflare Pages๋ฅผ ์‚ฌ์šฉ ์ค‘์ด์–ด๋„ ๊ฐ™์€ ๋„๋ฉ”์ธ์˜ DNS๊ฐ€ Firebase Hosting์„ ๊ฐ€๋ฆฌํ‚ค๋„๋ก ๊ตฌ์„ฑํ•  ์ˆ˜ ์žˆ๋‹ค. Cloudflare DNS FAQ, Firebase ์ปค์Šคํ…€ ๋„๋ฉ”์ธ ๋ฌธ์„œ

๋„๋ฉ”์ธ์€ ์–ด๋””์„œ ์ค€๋น„ํ•ด์•ผ ํ•˜๋Š”๊ฐ€

๋ฉ”์ผ์„ noreply@auth.example.com์—์„œ ๋ณด๋‚ด๋ ค๋ฉด ๋จผ์ € ์ƒ์œ„ ๋„๋ฉ”์ธ example.com์„ ์†Œ์œ ํ•˜๊ณ  ์žˆ์–ด์•ผ ํ•œ๋‹ค. Resend์— auth.example.com์„ ์ž…๋ ฅํ•˜๋Š” ๊ฒƒ๋งŒ์œผ๋กœ example.com์˜ ์†Œ์œ ๊ถŒ์ด ์ƒ๊ธฐ์ง€๋Š” ์•Š๋Š”๋‹ค. example.com์˜ DNS๋ฅผ ์ˆ˜์ •ํ•  ์ˆ˜ ์žˆ์–ด์•ผ Resend๊ฐ€ ์š”๊ตฌํ•œ ๋ ˆ์ฝ”๋“œ๋ฅผ ์ถ”๊ฐ€ํ•˜๊ณ  ๊ฒ€์ฆ์„ ํ†ต๊ณผํ•  ์ˆ˜ ์žˆ๋‹ค.

๋„๋ฉ”์ธ ๊ตฌ๋งคยท๊ฐฑ์‹ , DNS ๊ด€๋ฆฌ, ๋ฉ”์ผ ๋ฐœ์†ก์€ ๋ณ„๊ฐœ์˜ ์ผ์ด๋‹ค. Cloudflare Registrar ๋˜๋Š” ๋‹ค๋ฅธ ๋“ฑ๋ก์—…์ฒด์—์„œ ๋„๋ฉ”์ธ์„ ๊ตฌ์ž…ํ•˜๊ณ , DNS๋Š” Cloudflare์—์„œ ๊ด€๋ฆฌํ•˜๋ฉฐ, ๋ฉ”์ผ์€ Resend์—์„œ ๋ณด๋‚ด๋Š” ๊ตฌ์„ฑ์ด ๊ฐ€๋Šฅํ•˜๋‹ค. Cloudflare์˜ ๋ฌด๋ฃŒ DNS ์ด์šฉ๊ณผ ๋„๋ฉ”์ธ์˜ ๋“ฑ๋กยท๊ฐฑ์‹  ๋น„์šฉ๋„ ๊ตฌ๋ถ„ํ•ด์•ผ ํ•œ๋‹ค. Cloudflare Registrar

example.com ํ•˜๋‚˜๋ฅผ ์†Œ์œ ํ–ˆ๋‹ค๋ฉด dev.example.com, auth-dev.example.com, auth.example.com ๋“ฑ์˜ ํ•˜์œ„ ๋„๋ฉ”์ธ์„ ์šฉ๋„์— ๋”ฐ๋ผ ๋งŒ๋“ค ์ˆ˜ ์žˆ๋‹ค. ๊ฐ ํ•˜์œ„ ๋„๋ฉ”์ธ์„ ๋ณ„๋„๋กœ ๊ตฌ๋งคํ•˜๋Š” ๋ฐฉ์‹์ด ์•„๋‹ˆ๋‹ค. ๋ฐ˜๋ฉด Firebase๊ฐ€ ์ œ๊ณตํ•œ ํ”„๋กœ์ ํŠธ๋ช….web.app ๋˜๋Š” ํ”„๋กœ์ ํŠธ๋ช….firebaseapp.com์€ ๋‚ด ์†Œ์œ  ๋„๋ฉ”์ธ์ด ์•„๋‹ˆ๋ฏ€๋กœ, ๊ทธ ์•„๋ž˜ ์ž„์˜์˜ ์ฃผ์†Œ๋ฅผ Resend ๋ฐœ์‹  ๋„๋ฉ”์ธ์œผ๋กœ ๊ฒ€์ฆํ•˜๋Š” ์šฉ๋„๋กœ ์‚ฌ์šฉํ•  ์ˆ˜ ์—†๋‹ค.

์›น ์ฃผ์†Œ์™€ ๋ฉ”์ผ ์ฃผ์†Œ๋ฅผ ๋ถ„๋ฆฌํ•˜๋Š” ์ด์œ 

์šฉ๋„๊ฐœ๋ฐœ ํ™˜๊ฒฝ ์˜ˆ์‹œ์šด์˜ ํ™˜๊ฒฝ ์˜ˆ์‹œ
์‚ฌ์šฉ์ž๊ฐ€ ๋ฐฉ๋ฌธํ•  ์›น ์ฃผ์†Œdev.example.comexample.com
์ธ์ฆ ๋ฉ”์ผ ๋ฐœ์‹  ๋„๋ฉ”์ธauth-dev.example.comauth.example.com
์ธ์ฆ ๋ฉ”์ผ ๋ฐœ์‹  ์ฃผ์†Œnoreply@auth-dev.example.comnoreply@auth.example.com
๊ฐ€์ž… ํ™•์ธ ํ™”๋ฉดdev.example.com/auth/verifiedexample.com/auth/verified
๋น„๋ฐ€๋ฒˆํ˜ธ ์žฌ์„ค์ • ํ™”๋ฉดdev.example.com/auth/reset-passwordexample.com/auth/reset-password

auth.example.com์€ ๋ฉ”์ผ ๋ฐœ์‹  ์ฃผ์†Œ์˜ ๋„๋ฉ”์ธ์ด๋‹ค. ๋ฉ”์ผ ์† ๋งํฌ๊ฐ€ ์—ด๋ฆด ์›น์‚ฌ์ดํŠธ๊นŒ์ง€ ๋ฐ˜๋“œ์‹œ auth.example.com์ด์–ด์•ผ ํ•œ๋‹ค๋Š” ๋œป์€ ์•„๋‹ˆ๋‹ค. ์œ„ ์˜ˆ์‹œ์—์„œ๋Š” ์›น ํ™”๋ฉด์„ example.com๊ณผ dev.example.com์˜ Firebase Hosting์—์„œ ์ œ๊ณตํ•œ๋‹ค.

๊ฐœ๋ฐœยท์šด์˜์€ Resend ๊ณ„์ • ํ•˜๋‚˜์— ๋ฐœ์‹  ๋„๋ฉ”์ธ ๋‘ ๊ฐœ๋ฅผ ๋“ฑ๋กํ•  ์ˆ˜ ์žˆ๋‹ค. ํ˜„์žฌ Resend Free๋Š” ๊ฒ€์ฆ๋œ ๋„๋ฉ”์ธ 3๊ฐœ๋ฅผ ํ—ˆ์šฉํ•œ๋‹ค. ๋‘ ํ™˜๊ฒฝ์˜ ๋ฐœ์†ก๋Ÿ‰์€ ๊ฐ™์€ Resend ๊ณ„์ •์˜ ์ผยท์›” ํ•œ๋„๋ฅผ ํ•จ๊ป˜ ์‚ฌ์šฉํ•œ๋‹ค. Resend ์š”๊ธˆ์ œ, ๋ฌด๋ฃŒ ๋„๋ฉ”์ธ ํ•œ๋„ ๋ณ€๊ฒฝ

์‹ค์ œ ์„ค์ • ์ˆœ์„œ

1. Resend์—์„œ ๋ฐœ์‹  ๋„๋ฉ”์ธ ๋“ฑ๋ก

Resend์˜ Domains์—์„œ ๊ฐœ๋ฐœ์šฉ auth-dev.example.com๊ณผ ์šด์˜์šฉ auth.example.com์„ ๋“ฑ๋กํ•œ๋‹ค. Resend๊ฐ€ ๊ฐ ๋„๋ฉ”์ธ์— ๋Œ€ํ•ด ์ œ์‹œํ•˜๋Š” DNS ๋ ˆ์ฝ”๋“œ๋ฅผ ํ™•์ธํ•œ๋‹ค. ๋„๋ฉ”์ธ์„ ๋“ฑ๋กํ–ˆ๋‹ค๊ณ  ์ฆ‰์‹œ ๋ฐœ์†กํ•  ์ˆ˜ ์žˆ๋Š” ๊ฒƒ์€ ์•„๋‹ˆ๋ฉฐ, DNS ๋ ˆ์ฝ”๋“œ๋ฅผ ๊ฒŒ์‹œํ•œ ๋’ค Resend์˜ ๊ฒ€์ฆ์„ ํ†ต๊ณผํ•ด์•ผ ํ•œ๋‹ค.

2. Cloudflare DNS์— ๋ฉ”์ผ ๋ ˆ์ฝ”๋“œ ๊ฒŒ์‹œ

Resend๊ฐ€ ๋ณด์—ฌ ์ฃผ๋Š” DKIM TXT์™€ ๋ฐœ์†ก์šฉ CNAME ๋“ฑ์„ Cloudflare์— ์ถ”๊ฐ€ํ•œ๋‹ค. ๋ ˆ์ฝ”๋“œ์˜ ์ด๋ฆ„๊ณผ ๊ฐ’์€ Resend ํ™”๋ฉด์˜ ๊ฐ’์„ ๊ทธ๋Œ€๋กœ ์‚ฌ์šฉํ•œ๋‹ค. ์ง€์—ญ๊ณผ ๋„๋ฉ”์ธ ์„ค์ •์— ๋”ฐ๋ผ ๊ฐ’์ด ๋‹ฌ๋ผ์งˆ ์ˆ˜ ์žˆ๋‹ค. ๋ฉ”์ผ ๊ฒ€์ฆ์šฉ CNAME์€ Cloudflare์˜ ํ”„๋ก์‹œ๋ฅผ ๋„๊ณ  DNS only๋กœ ๋‘”๋‹ค. ํ”„๋ก์‹œ๋ฅผ ์ผœ๋ฉด ๊ฒ€์ฆ ๊ณผ์ •์—์„œ ์›๋ž˜ CNAME ๊ฐ’์ด ๋ณด์ด์ง€ ์•Š์„ ์ˆ˜ ์žˆ๋‹ค. Cloudflare CNAME ๊ฒ€์ฆ ์•ˆ๋‚ด

3. Firebase Hosting์— ์›น ๋„๋ฉ”์ธ ์—ฐ๊ฒฐ

Firebase Hosting์˜ ์ปค์Šคํ…€ ๋„๋ฉ”์ธ ์„ค์ •์—์„œ ๊ฐœ๋ฐœยท์šด์˜ ์›น ์ฃผ์†Œ๋ฅผ ๊ฐ๊ฐ ์—ฐ๊ฒฐํ•œ๋‹ค. Firebase๊ฐ€ ์š”๊ตฌํ•˜๋Š” ์†Œ์œ ๊ถŒ TXT, HTTPS ์ธ์ฆ์„œ ํ™•์ธ์šฉ ๋ ˆ์ฝ”๋“œ, ์›น ์—ฐ๊ฒฐ์šฉ A ๋ ˆ์ฝ”๋“œ๋ฅผ Cloudflare DNS์— ์ถ”๊ฐ€ํ•œ๋‹ค.

DNS๋ฅผ ์ถ”๊ฐ€ํ–ˆ๋‹ค๋Š” ์‚ฌ์‹ค๊ณผ Firebase ํ™”๋ฉด์— Connected๋กœ ํ‘œ์‹œ๋˜๋Š” ๊ฒƒ์€ ๋‹ค๋ฅด๋‹ค. DNS ์ „ํŒŒ์™€ ์ธ์ฆ์„œ ๋ฐœ๊ธ‰์— ์‹œ๊ฐ„์ด ๊ฑธ๋ฆด ์ˆ˜ ์žˆ๋‹ค. Firebase์—์„œ Connected ์ƒํƒœ๋ฅผ ํ™•์ธํ•˜๊ณ , ์‹ค์ œ https:// ์ฃผ์†Œ์—์„œ ์˜ˆ์ƒํ•œ ์›น ํŽ˜์ด์ง€๊ฐ€ ์—ด๋ฆฌ๋Š”์ง€ ํ™•์ธํ•ด์•ผ ํ•œ๋‹ค. Firebase์˜ ์ผ๋ฐ˜์ ์ธ A ๋ ˆ์ฝ”๋“œ ์˜ˆ์‹œ๋Š” 199.36.158.100์ด์ง€๋งŒ, ์„ค์ •ํ•  ๋•Œ๋Š” Firebase ์ฝ˜์†”์ด ํ•ด๋‹น ๋„๋ฉ”์ธ์— ์ œ์‹œํ•œ ๊ฐ’์„ ๋”ฐ๋ฅธ๋‹ค. Firebase ์ปค์Šคํ…€ ๋„๋ฉ”์ธ ์„ค์ •

4. Resend API key ์ค€๋น„

Supabase๊ฐ€ Resend SMTP์— ์ ‘์†ํ•  ๋•Œ ์‚ฌ์šฉํ•˜๋Š” Password๋Š” Resend ๊ณ„์ • ๋กœ๊ทธ์ธ ๋น„๋ฐ€๋ฒˆํ˜ธ๊ฐ€ ์•„๋‹ˆ๋ผ Resend API key๋‹ค. SMTP ์„ค์ •๊ฐ’์€ Host smtp.resend.com, Port 465, Username resend, Password Resend API key๋‹ค. Resend SMTP ์•ˆ๋‚ด

๋ฉ”์ผ ๋ฐœ์†ก๋งŒ ํ•„์š”ํ•˜๋ฏ€๋กœ API key ๊ถŒํ•œ์€ Sending access๋ฉด ๋œ๋‹ค. ํ•˜๋‚˜์˜ ํ‚ค์— All domains๋ฅผ ํ—ˆ์šฉํ•˜๋ฉด ๋“ฑ๋ก๋œ ๋ฐœ์‹  ๋„๋ฉ”์ธ๋“ค์— ํ•จ๊ป˜ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค. ๊ฐœ๋ฐœยท์šด์˜ ํ‚ค๋ฅผ ๋”ฐ๋กœ ๋งŒ๋“ค๊ณ  ๊ฐ๊ฐ ํ•ด๋‹น ๋„๋ฉ”์ธ์œผ๋กœ ๋ฒ”์œ„๋ฅผ ์ œํ•œํ•˜๋ฉด ํ‚ค๋ฅผ ๊ต์ฒดํ•˜๊ฑฐ๋‚˜ ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ–ˆ์„ ๋•Œ ์˜ํ–ฅ ๋ฒ”์œ„๋ฅผ ์ขํžˆ๊ธฐ ์‰ฝ๋‹ค. ํ‚ค์˜ ์‹ค์ œ ๊ฐ’์€ ๋ฌธ์„œยท์ €์žฅ์†Œยท์Šคํฌ๋ฆฐ์ƒท์— ๊ธฐ๋กํ•˜์ง€ ์•Š๋Š”๋‹ค.

5. Supabase Custom SMTP์™€ ํ…œํ”Œ๋ฆฟ ์„ค์ •

๊ฐ ํ™˜๊ฒฝ์˜ Supabase Auth์—์„œ Emails โ†’ SMTP Settings๋กœ ์ด๋™ํ•ด Custom SMTP๋ฅผ ์ผ ๋‹ค. ๋ฐœ์‹  ์ฃผ์†Œ์™€ ์ด๋ฆ„์„ ์ž…๋ ฅํ•˜๊ณ , Resend์˜ SMTP ์„ค์ •๊ฐ’ ๋ฐ API key๋ฅผ ์ €์žฅํ•œ๋‹ค.

๋ฉ”์ผ์˜ ์ œ๋ชฉ๊ณผ ๋‚ด์šฉ์€ Emails โ†’ Templates์—์„œ Confirm sign up, Reset password๋ฅผ ๊ฐ๊ฐ ์ˆ˜์ •ํ•œ๋‹ค. Supabase๋Š” Go ํ…œํ”Œ๋ฆฟ์„ ์ง€์›ํ•˜๋ฏ€๋กœ ์•ฑ์ด ํšŒ์›๊ฐ€์ž… ๋•Œ ์ „๋‹ฌํ•œ language ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ์— ๋”ฐ๋ผ ํ•œ๊ตญ์–ด์™€ ์˜์–ด๋ฅผ ๋‚˜๋ˆŒ ์ˆ˜ ์žˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด ko์ผ ๋•Œ ํ•œ๊ตญ์–ด, ๊ทธ ๋ฐ–์˜ ๊ฐ’๊ณผ ๊ฐ’์ด ์—†์„ ๋•Œ ์˜์–ด๋กœ ์ฒ˜๋ฆฌํ•˜๋ฉด ํ”„๋ž‘์Šค์–ด ๊ฐ™์€ ๋ฏธ์ง€์› ์–ธ์–ด๊ฐ€ ํ•œ๊ตญ์–ด๋กœ ํ‘œ์‹œ๋˜๋Š” ์ผ์„ ๋ง‰๋Š”๋‹ค. ์•ฑ์ด kr, ko-KR ๋“ฑ์˜ ์ž…๋ ฅ์„ ๋ฐ›๋Š”๋‹ค๋ฉด ํ…œํ”Œ๋ฆฟ๊ณผ ํด๋ผ์ด์–ธํŠธ ์ค‘ ์–ด๋””์—์„œ ko๋กœ ์ •๊ทœํ™”ํ• ์ง€๋„ ์ •ํ•ด์•ผ ํ•œ๋‹ค. Supabase ์–ธ์–ด๋ณ„ ํ…œํ”Œ๋ฆฟ ์•ˆ๋‚ด

{{ if eq .Data.language "ko" }}
  <p>์ด๋ฉ”์ผ ์ฃผ์†Œ๋ฅผ ํ™•์ธํ•ด ์ฃผ์„ธ์š”.</p>
{{ else }}
  <p>Please confirm your email address.</p>
{{ end }}

6. ์ธ์ฆ ๋งํฌ์™€ ์›น ํ™”๋ฉด ์—ฐ๊ฒฐ

Supabase์˜ URL Configuration์—๋Š” ๊ธฐ๋ณธ Site URL๊ณผ ํ—ˆ์šฉํ•  Redirect URL์„ ์„ค์ •ํ•œ๋‹ค. ์•ฑ์ด ํšŒ์›๊ฐ€์ž… ํ™•์ธ์—๋Š” /auth/verified, ๋น„๋ฐ€๋ฒˆํ˜ธ ์žฌ์„ค์ •์—๋Š” /auth/reset-password๋ฅผ ์ง€์ •ํ•œ๋‹ค๋ฉด, ๋‘ ์ฃผ์†Œ๊ฐ€ ๊ฐ๊ฐ ์‹ค์ œ ์›น ํ™”๋ฉด์œผ๋กœ ์—ฐ๊ฒฐ๋˜์–ด์•ผ ํ•œ๋‹ค.

๊ฐ€์ž… ํ™•์ธ ํ™”๋ฉด์€ ํ† ํฐ์„ ํ™•์ธํ•œ ๋’ค ์™„๋ฃŒ ์•ˆ๋‚ด๋ฅผ ๋ณด์—ฌ ์ค€๋‹ค. ๋น„๋ฐ€๋ฒˆํ˜ธ ์žฌ์„ค์ • ํ™”๋ฉด์€ ํ† ํฐ์„ ํ™•์ธํ•˜๊ณ  ์ƒˆ ๋น„๋ฐ€๋ฒˆํ˜ธ๋ฅผ ์ž…๋ ฅ๋ฐ›์•„ ๋ณ€๊ฒฝํ•œ ๋’ค ์™„๋ฃŒ ์•ˆ๋‚ด๋ฅผ ๋ณด์—ฌ ์ค€๋‹ค. ๋‘ ๋งํฌ๋ฅผ ๊ฐ™์€ ์™„๋ฃŒ ํ™”๋ฉด์—๋งŒ ์—ฐ๊ฒฐํ•˜๋ฉด, ์žฌ์„ค์ • ๋ฉ”์ผ์€ ๋„์ฐฉํ•ด๋„ ์‚ฌ์šฉ์ž๊ฐ€ ์ƒˆ ๋น„๋ฐ€๋ฒˆํ˜ธ๋ฅผ ์„ค์ •ํ•  ์ˆ˜ ์—†๋‹ค.

์ด ๋ฐฉ์‹์„ ์‚ฌ์šฉํ•˜๋ฉด ์•ฑ์—์„œ ์š”์ฒญํ•œ ๋’ค ๋‹ค๋ฅธ ๊ธฐ๊ธฐ์˜ ์›น ๋ธŒ๋ผ์šฐ์ €์—์„œ ๋ฉ”์ผ์„ ์—ด์–ด๋„ ์žฌ์„ค์ •์„ ๋งˆ์น  ์ˆ˜ ์žˆ๋‹ค. ์•ฑ ์ž๋™ ์‹คํ–‰์€ ๋ณ„๋„์˜ App Links ์„ค์ •์— ๋‹ฌ๋ ค ์žˆ์œผ๋ฏ€๋กœ, ๋น„๋ฐ€๋ฒˆํ˜ธ ๋ณ€๊ฒฝ์„ ์™„๋ฃŒํ•˜๋Š” ๋ฐ ํ•„์ˆ˜ ์กฐ๊ฑด์œผ๋กœ ๋‘์ง€ ์•Š๋Š”๋‹ค.

Cloudflare DNS ํ™”๋ฉด์˜ 12๊ฐœ ๋ ˆ์ฝ”๋“œ ์ฝ๊ธฐ

๊ฐœ๋ฐœยท์šด์˜์— ๊ฐ™์€ ์ข…๋ฅ˜์˜ ๋ ˆ์ฝ”๋“œ๋ฅผ ๊ฐ๊ฐ ํ•˜๋‚˜์”ฉ ๋‘๋ฉด ์ด 12๊ฐœ๊ฐ€ ๋œ๋‹ค. Firebase ๊ด€๋ จ 6๊ฐœ์™€ Resend ๊ด€๋ จ 6๊ฐœ๋กœ ๋‚˜๋ˆŒ ์ˆ˜ ์žˆ๋‹ค.

ํ™”๋ฉด์— ๋ณด์ด๋Š” ํ˜•ํƒœ์š”๊ตฌํ•œ ์„œ๋น„์Šค์˜๋ฏธ
์›น ๋„๋ฉ”์ธ์˜ A, ๊ฐ’ 199.36.158.100Firebase Hostingํ•ด๋‹น ์ฃผ์†Œ์˜ ์›น ์š”์ฒญ์„ Firebase Hosting์œผ๋กœ ์—ฐ๊ฒฐ
์›น ๋„๋ฉ”์ธ์˜ TXT, ๊ฐ’ hosting-site=...Firebase Hosting๋„๋ฉ”์ธ์„ ์–ด๋А Hosting ์‚ฌ์ดํŠธ์— ์—ฐ๊ฒฐํ• ์ง€ ์ฆ๋ช…
_acme-challenge... TXTFirebase HostingHTTPS ์ธ์ฆ์„œ ๋ฐœ๊ธ‰ ๊ณผ์ •์—์„œ ๋„๋ฉ”์ธ ์ œ์–ด ๊ถŒํ•œ ํ™•์ธ
resend._domainkey... TXT, ๊ฐ’ p=...Resend์ˆ˜์‹  ์ธก์ด DKIM ์„œ๋ช…์„ ๊ฒ€์ฆํ•  ๋•Œ ์“ฐ๋Š” ๊ณต๊ฐœ ํ‚ค
rsend... CNAMEResendResend๊ฐ€ ์ œ์‹œํ•œ ๋ฐœ์†ก ๊ด€๋ จ ํ˜ธ์ŠคํŠธ ์—ฐ๊ฒฐ
send... CNAMEResendReturn-Path ๋“ฑ ๋ฐœ์†ก ๋„๋ฉ”์ธ ์„ค์ •์— ํ•„์š”ํ•œ ํ˜ธ์ŠคํŠธ ์—ฐ๊ฒฐ

hosting-site=...์™€ _acme-challenge...๋Š” ์›น์‚ฌ์ดํŠธ๋ฅผ ์œ„ํ•œ ๊ฐ’์ด๋‹ค. resend._domainkey..., rsend..., send...๋Š” ๋ฉ”์ผ ๋ฐœ์†ก์„ ์œ„ํ•œ ๊ฐ’์ด๋‹ค. ์ด๋ฆ„์ด ๋น„์Šทํ•ด ๋ณด์—ฌ๋„ ์„œ๋กœ ๋Œ€์ฒดํ•  ์ˆ˜ ์—†๋‹ค. resend._domainkey์˜ p=...๋Š” DNS์— ๊ณต๊ฐœํ•˜๋Š” DKIM ๊ณต๊ฐœ ํ‚ค์ด๋ฉฐ API key์™€ ๋‹ค๋ฅด๋‹ค. Firebase ์ปค์Šคํ…€ ๋„๋ฉ”์ธ ์„ค์ •, Resend Return-Path ์„ค๋ช…

ํ™”๋ฉด์˜ DNS only๋Š” Cloudflare๊ฐ€ ํŠธ๋ž˜ํ”ฝ์„ ํ”„๋ก์‹œํ•˜์ง€ ์•Š๊ณ  DNS ๊ฐ’๋งŒ ์‘๋‹ตํ•œ๋‹ค๋Š” ์˜๋ฏธ๋‹ค. TTL์€ DNS ์‘๋‹ต์„ ์–ผ๋งˆ๋‚˜ ์บ์‹œํ• ์ง€ ์ •ํ•˜๋Š” ๊ฐ’์ด๋‹ค. Auto์™€ 1 hr๊ฐ€ ํ•จ๊ป˜ ์žˆ์–ด๋„ ๊ทธ ์ฐจ์ด ์ž์ฒด๊ฐ€ ์„ค์ • ์˜ค๋ฅ˜๋Š” ์•„๋‹ˆ๋‹ค. ๋ ˆ์ฝ”๋“œ๋ฅผ ๋ฐ”๊พผ ๋’ค ์ƒˆ ๊ฐ’์ด ๋ณด์ด๊ธฐ๊นŒ์ง€์˜ ์‹œ๊ฐ„์— ์˜ํ–ฅ์„ ์ค€๋‹ค. Cloudflare ํ”„๋ก์‹œ ์ƒํƒœ, Cloudflare TTL

ํ™”๋ฉด์— DMARC ๋ ˆ์ฝ”๋“œ๊ฐ€ ์—†๋”๋ผ๋„ ์œ„ 12๊ฐœ๋ฅผ ์„ค๋ช…ํ•˜๋Š” ๋ฐ ๋น ์ง„ ํ–‰์ด ์žˆ๋Š” ๊ฒƒ์€ ์•„๋‹ˆ๋‹ค. DMARC๋Š” ๋ฐœ์‹  ๋„๋ฉ”์ธ์˜ ๋ฉ”์ผ ์ธ์ฆ ์ •์ฑ…์„ ์•Œ๋ฆฌ๋Š” ๋ณ„๋„ ๊ถŒ์žฅ ์„ค์ •์œผ๋กœ ๊ฒ€ํ† ํ•  ์ˆ˜ ์žˆ๋‹ค. ๊ฐ’์€ ์šด์˜ํ•  ๋ฉ”์ผ ์ •์ฑ…์— ๋งž์ถฐ ์ •ํ•ด์•ผ ํ•œ๋‹ค. Supabase ๋ฐœ์‹  ๋„๋ฉ”์ธ ๊ถŒ์žฅ์‚ฌํ•ญ

๋ฌด๋ฃŒ ์‚ฌ์šฉ ๋ฒ”์œ„์™€ ์ œํ•œ

์„œ๋น„์Šคํ˜„์žฌ ํ™•์ธํ•œ ๋ฒ”์œ„
Supabase ๊ธฐ๋ณธ SMTPํ”„๋กœ์ ํŠธ ํŒ€ ์ฃผ์†Œ๋กœ๋งŒ ๋ฐœ์†ก, ํ˜„์žฌ ํ”„๋กœ์ ํŠธ๋‹น ์‹œ๊ฐ„๋‹น 2ํ†ต
Supabase Custom SMTPํ™œ์„ฑํ™” ํ›„ ๊ธฐ๋ณธ๊ฐ’ ์‹œ๊ฐ„๋‹น 30ํ†ต. Auth Rate Limits์—์„œ ์กฐ์ • ๊ฐ€๋Šฅ
Resend Free์›” 3,000ํ†ตยท์ผ 100ํ†ต, ๊ฒ€์ฆ๋œ ๋„๋ฉ”์ธ 3๊ฐœ
Cloudflare DNS๋„๋ฉ”์ธ ๋“ฑ๋กยท๊ฐฑ์‹ ๊ณผ ๊ตฌ๋ถ„๋˜๋Š” DNS ๊ด€๋ฆฌ
๋„๋ฉ”์ธ ๋“ฑ๋ก์†Œ์œ  ๋„๋ฉ”์ธ์˜ ๊ตฌ๋งค ๋ฐ ๊ฐฑ์‹  ๋น„์šฉ ๋ฐœ์ƒ

Custom SMTP๋ฅผ ์—ฐ๊ฒฐํ•ด๋„ ๋ฐœ์†ก๋Ÿ‰์ด ๋ฌด์ œํ•œ์ด ๋˜๋Š” ๊ฒƒ์€ ์•„๋‹ˆ๋‹ค. Supabase Auth์˜ ์‹œ๊ฐ„๋‹น ์ œํ•œ๊ณผ Resend ๊ณ„์ •์˜ ์ผยท์›” ํ•œ๋„๋ฅผ ๋ชจ๋‘ ํ™•์ธํ•ด์•ผ ํ•œ๋‹ค. ๊ฐœ๋ฐœยท์šด์˜ ๋„๋ฉ”์ธ์„ ํ•œ Resend ๊ณ„์ •์— ๋“ฑ๋กํ•˜๋ฉด ๋„๋ฉ”์ธ ์ˆ˜๋Š” ๊ฐ๊ฐ ์ฐจ์ง€ํ•˜์ง€๋งŒ ๋ฐœ์†ก๋Ÿ‰์€ ๊ณ„์ • ํ•œ๋„๋ฅผ ๊ณต์œ ํ•œ๋‹ค. Supabase SMTP ์ œํ•œ, Resend ์š”๊ธˆ์ œ

์„ค์ • ์™„๋ฃŒ๋ฅผ ํ™•์ธํ•˜๋Š” ์ˆœ์„œ

  1. Cloudflare์— ๊ฐ ์„œ๋น„์Šค๊ฐ€ ์š”๊ตฌํ•œ DNS ๋ ˆ์ฝ”๋“œ๊ฐ€ ์žˆ๋Š”์ง€ ํ™•์ธํ•œ๋‹ค.
  2. Resend์—์„œ ๋ฐœ์‹  ๋„๋ฉ”์ธ์ด Verified์ธ์ง€ ํ™•์ธํ•œ๋‹ค.
  3. Firebase Hosting์—์„œ ์›น ๋„๋ฉ”์ธ์ด Connected์ธ์ง€ ํ™•์ธํ•˜๊ณ , HTTPS๋กœ ๊ฐ€์ž… ํ™•์ธยท๋น„๋ฐ€๋ฒˆํ˜ธ ์žฌ์„ค์ • ๊ฒฝ๋กœ๊ฐ€ ์—ด๋ฆฌ๋Š”์ง€ ํ™•์ธํ•œ๋‹ค.
  4. Supabase์—์„œ Custom SMTP์˜ ๋ฐœ์‹  ์ฃผ์†Œ์™€ ํ…œํ”Œ๋ฆฟ์„ ํ™•์ธํ•œ๋‹ค.
  5. ์‹ค์ œ ํšŒ์›๊ฐ€์ž… ๋ฉ”์ผ์„ ๋ฐ›์•„ ์–ธ์–ดยท๋ฐœ์‹  ์ฃผ์†Œยท๊ฐ€์ž… ํ™•์ธ ํ™”๋ฉด์„ ํ™•์ธํ•œ๋‹ค.
  6. ์‹ค์ œ ์žฌ์„ค์ • ๋ฉ”์ผ์„ ๋ฐ›์•„ ์ƒˆ ๋น„๋ฐ€๋ฒˆํ˜ธ ์ž…๋ ฅ, ๋ณ€๊ฒฝ ์™„๋ฃŒ, ์ƒˆ ๋น„๋ฐ€๋ฒˆํ˜ธ ๋กœ๊ทธ์ธ๊นŒ์ง€ ํ™•์ธํ•œ๋‹ค.

DNS ํ™”๋ฉด์— ๋ ˆ์ฝ”๋“œ๊ฐ€ ๋ณด์ด๋Š” ๊ฒƒ๋งŒ์œผ๋กœ ๋ฉ”์ผ ๋ฐœ์†ก๊ณผ ์ธ์ฆ ํ๋ฆ„ ์ „์ฒด๊ฐ€ ์™„๋ฃŒ๋œ ๊ฒƒ์€ ์•„๋‹ˆ๋‹ค. ๋งˆ์ง€๋ง‰ ๋‘ ๋‹จ๊ณ„๊ฐ€ ์‚ฌ์šฉ์ž ๊ด€์ ์˜ ๊ฒ€์ฆ์ด๋‹ค.

์ฐธ๊ณ  ๋ฌธ์„œ