[๐Ÿค–] Next.js App Router Edge Runtime: ๊ธ€๋กœ๋ฒŒ ์„ฑ๋Šฅ๊ณผ ๋น„์šฉ ํšจ์œจ์„ฑ ๊ทน๋Œ€ํ™” ์ „๋žต

Next.js App Router์—์„œ Edge Runtime์„ ํ™œ์šฉํ•ด Route Handler ์„ฑ๋Šฅ์„ ๊ทน๋Œ€ํ™”ํ•˜๊ณ , ๊ธ€๋กœ๋ฒŒ ์‚ฌ์šฉ์ž์—๊ฒŒ ๋น ๋ฅธ ์‘๋‹ต ์†๋„๋ฅผ ์ œ๊ณตํ•˜๋ฉฐ, ๋น„์šฉ ํšจ์œจ์ ์œผ๋กœ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ์šด์˜ํ•˜๋Š” ์‹ค์ „ ์ „๋žต์„ ์ž์„ธํžˆ ๋‹ค๋ค„์š”. Edge Runtime์˜ ์žฅ์ ๊ณผ ์ œํ•œ์‚ฌํ•ญ, ๊ทธ๋ฆฌ๊ณ  ์‹ค์ œ ์ฝ”๋“œ ์˜ˆ์‹œ๋ฅผ ํ†ตํ•ด ํšจ๊ณผ์ ์ธ ์ ์šฉ ๋ฐฉ๋ฒ•์„ ๋ฐฐ์›Œ๋ณด์„ธ์š”.

15๋ถ„
๋‹จ์–ด: 1,283๊ฐœ
๊ฒŒ์‹œ๊ธ€ ์ธ๋„ค์ผ
์ •๋ณด

๐Ÿค– ์ด ํฌ์ŠคํŒ…์€ Gemini 2.5 Flash AI๊ฐ€ ์ž‘์„ฑํ–ˆ์–ด์š”.
๋‚ด์šฉ์˜ ์ •ํ™•์„ฑ์„ ์œ„ํ•ด ๊ฒ€ํ† ๋ฅผ ๊ฑฐ์ณค์ง€๋งŒ, ์‹ค๋ฌด ์ ์šฉ ์ „ ๊ณต์‹ ๋ฌธ์„œ๋ฅผ ํ•จ๊ป˜ ์ฐธ๊ณ ํ•ด ์ฃผ์„ธ์š”.

์œ ์šฉํ•œ ํŒ

Next.js App Router์—์„œ Edge Runtime์„ ํ™œ์šฉํ•ด Route Handler์˜ ๊ธ€๋กœ๋ฒŒ ์„ฑ๋Šฅ์„ ๊ทน๋Œ€ํ™”ํ•˜๊ณ  ๋น„์šฉ ํšจ์œจ์„ฑ์„ ๋†’์ด๋Š” ๋ฐฉ๋ฒ•์„ ์‹ค์ „ ์ฝ”๋“œ ์˜ˆ์‹œ์™€ ํ•จ๊ป˜ ์ž์„ธํžˆ ์•Œ๋ ค๋“œ๋ ค์š”.

์•ˆ๋…•ํ•˜์„ธ์š”, 10๋…„ ์ด์ƒ ์‹ค๋ฌด ๊ฒฝํ—˜์„ ๊ฐ€์ง„ ์‹œ๋‹ˆ์–ด ํ’€์Šคํƒ ๊ฐœ๋ฐœ์ž์ด์ž ๊ธฐ์ˆ  ๋ธ”๋กœ๊ทธ SEO ์ „๋ฌธ๊ฐ€ ๋ธ”๋ฃจ์˜ˆ์š”.
์˜ค๋Š˜์€ Next.js App Router๋ฅผ ์‚ฌ์šฉํ•˜์‹œ๋Š” ๋ถ„๋“ค์ด๋ผ๋ฉด ๊ผญ ์•Œ์•„๋‘๋ฉด ์ข‹์„ Edge Runtime์— ๋Œ€ํ•ด ์ด์•ผ๊ธฐํ•ด๋ณด๋ ค๊ณ  ํ•ด์š”.
ํŠนํžˆ Route Handler์™€ ๊ฒฐํ•ฉํ–ˆ์„ ๋•Œ ์–ป์„ ์ˆ˜ ์žˆ๋Š” ๋†€๋ผ์šด ์„ฑ๋Šฅ ํ–ฅ์ƒ๊ณผ ๋น„์šฉ ํšจ์œจ์„ฑ ๊ทน๋Œ€ํ™” ์ „๋žต์— ์ดˆ์ ์„ ๋งž์ถฐ ์ดˆ์ค‘๊ธ‰ ๊ฐœ๋ฐœ์ž๋ถ„๋“ค์—๊ฒŒ ์‹ค์งˆ์ ์ธ ๋„์›€์ด ๋  ๋งŒํ•œ ๋‚ด์šฉ์„ ์ค€๋น„ํ•ด ๋ดค์–ด์š”.

๐Ÿค” ์™œ Edge Runtime์— ์ฃผ๋ชฉํ•ด์•ผ ํ• ๊นŒ์š”?

0๏ธโƒฃ ๊ธ€๋กœ๋ฒŒ ์„œ๋น„์Šค์˜ ํ•„์ˆ˜ ์š”์†Œ, ๋‚ฎ์€ ์ง€์—ฐ ์‹œ๊ฐ„

์ตœ๊ทผ ์›น ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์€ ์ „ ์„ธ๊ณ„ ์‚ฌ์šฉ์ž๋ฅผ ๋Œ€์ƒ์œผ๋กœ ํ•˜๋Š” ๊ฒฝ์šฐ๊ฐ€ ๋งŽ์•„์กŒ์–ด์š”.
์‚ฌ์šฉ์ž๊ฐ€ ์–ด๋””์— ์žˆ๋“  ๋น ๋ฅด๊ณ  ์ผ๊ด€๋œ ์‘๋‹ต ์†๋„๋ฅผ ์ œ๊ณตํ•˜๋Š” ๊ฒƒ์€ ์‚ฌ์šฉ์ž ๊ฒฝํ—˜์— ๋งค์šฐ ์ค‘์š”ํ•˜์ฃ .
๊ธฐ์กด์˜ ์„œ๋ฒ„๋ฆฌ์Šค ํ•จ์ˆ˜๋Š” ํŠน์ • ๋ฆฌ์ „์— ๋ฐฐํฌ๋˜์–ด ์žˆ์–ด์„œ, ์ง€๋ฆฌ์ ์œผ๋กœ ๋ฉ€๋ฆฌ ๋–จ์–ด์ง„ ์‚ฌ์šฉ์ž์—๊ฒŒ๋Š” ๋„คํŠธ์›Œํฌ ์ง€์—ฐ ์‹œ๊ฐ„(latency)์ด ๋ฐœ์ƒํ•  ์ˆ˜๋ฐ–์— ์—†์—ˆ์–ด์š”.
์ด๋Ÿฌํ•œ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด ๋“ฑ์žฅํ•œ ๊ฐœ๋…์ด ๋ฐ”๋กœ Edge Computing์ด๋ž๋‹ˆ๋‹ค.

1๏ธโƒฃ ๊ธฐ์กด Node.js ๋Ÿฐํƒ€์ž„์˜ ํ•œ๊ณ„

Next.js์˜ ๊ธฐ๋ณธ ์„œ๋ฒ„๋ฆฌ์Šค ํ•จ์ˆ˜ ๋Ÿฐํƒ€์ž„์€ Node.js ๊ธฐ๋ฐ˜์ด์—์š”.
Node.js ๋Ÿฐํƒ€์ž„์€ ๊ฐ•๋ ฅํ•˜๊ณ  ๋‹ค์–‘ํ•œ ๊ธฐ๋Šฅ์„ ์ œ๊ณตํ•˜์ง€๋งŒ, ๋ช‡ ๊ฐ€์ง€ ๋‹จ์ ๋„ ๊ฐ€์ง€๊ณ  ์žˆ์–ด์š”.
๋Œ€ํ‘œ์ ์œผ๋กœ ์ฝœ๋“œ ์Šคํƒ€ํŠธ(Cold Start) ์‹œ๊ฐ„์ด ๋น„๊ต์  ๊ธธ๊ณ , ์ „ ์„ธ๊ณ„์— ๋ถ„์‚ฐ ๋ฐฐ์น˜ํ•˜๊ธฐ ์œ„ํ•œ ์ถ”๊ฐ€์ ์ธ ์„ค์ •์ด๋‚˜ ์„œ๋น„์Šค๊ฐ€ ํ•„์š”ํ•˜๋‹ค๋Š” ์ ์ด์—์š”.
๋˜ํ•œ, AWS Lambda ๊ฐ™์€ ์„œ๋น„์Šค์—์„œ๋Š” ํ˜ธ์ถœ ํšŸ์ˆ˜๋‚˜ ์‹คํ–‰ ์‹œ๊ฐ„์— ๋”ฐ๋ผ ๋น„์šฉ์ด ๋ฐœ์ƒํ•˜๋ฏ€๋กœ, ์ „ ์„ธ๊ณ„์—์„œ ๋นˆ๋ฒˆํ•˜๊ฒŒ ํ˜ธ์ถœ๋˜๋Š” API์˜ ๊ฒฝ์šฐ ๋น„์šฉ ๋ถ€๋‹ด์ด ์ปค์งˆ ์ˆ˜ ์žˆ์–ด์š”.

๐Ÿš€ Edge Runtime, ๋ฌด์—‡์ด ๋‹ค๋ฅผ๊นŒ์š”?

0๏ธโƒฃ V8 ๋Ÿฐํƒ€์ž„ ๊ธฐ๋ฐ˜์˜ ์ดˆ๊ฒฝ๋Ÿ‰, ์ดˆ๊ณ ์† ์‹คํ–‰ ํ™˜๊ฒฝ

Edge Runtime์€ Node.js ๋Œ€์‹  ์›น ๋ธŒ๋ผ์šฐ์ €์˜ JavaScript ์—”์ง„์ธ V8 ๋Ÿฐํƒ€์ž„์„ ๊ธฐ๋ฐ˜์œผ๋กœ ๋™์ž‘ํ•ด์š”.
V8 ์—”์ง„์€ Chrome, Edge ๊ฐ™์€ ์›น ๋ธŒ๋ผ์šฐ์ €์— ๋‚ด์žฅ๋˜์–ด ์žˆ์–ด์„œ ๋งค์šฐ ๋น ๋ฅด๊ฒŒ JavaScript ์ฝ”๋“œ๋ฅผ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ๋„๋ก ์„ค๊ณ„๋˜์—ˆ์–ด์š”.
์ด๋Ÿฌํ•œ ํŠน์„ฑ ๋•๋ถ„์— Edge Runtime์€ ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์žฅ์ ์„ ๊ฐ€์ ธ์š”.

  • โšก๏ธ ๋‚ฎ์€ ์ฝœ๋“œ ์Šคํƒ€ํŠธ: Node.js ๋Ÿฐํƒ€์ž„์— ๋น„ํ•ด ํ›จ์”ฌ ๋น ๋ฅด๊ฒŒ ํ•จ์ˆ˜๋ฅผ ์‹œ์ž‘ํ•  ์ˆ˜ ์žˆ์–ด์š”.
    ์ด๋Š” ์‚ฌ์šฉ์ž๊ฐ€ API๋ฅผ ํ˜ธ์ถœํ–ˆ์„ ๋•Œ ์ฆ‰๊ฐ์ ์ธ ์‘๋‹ต์„ ๋ฐ›์„ ์ˆ˜ ์žˆ๋‹ค๋Š” ์˜๋ฏธ์˜ˆ์š”.
  • ๐ŸŒ ๊ธ€๋กœ๋ฒŒ ๋ถ„์‚ฐ ๋ฐฐ์น˜: CDN(Content Delivery Network) ์—ฃ์ง€ ๋กœ์ผ€์ด์…˜์— ๊ฐ€๊นŒ์šด ๊ณณ์— ํ•จ์ˆ˜๊ฐ€ ๋ฐฐํฌ๋˜์–ด ์‚ฌ์šฉ์ž์™€ ๊ฐ€์žฅ ๊ฐ€๊นŒ์šด ์„œ๋ฒ„์—์„œ ์‘๋‹ตํ•  ์ˆ˜ ์žˆ์–ด์š”.
    ๋•๋ถ„์— ๋„คํŠธ์›Œํฌ ์ง€์—ฐ ์‹œ๊ฐ„์ด ํš๊ธฐ์ ์œผ๋กœ ์ค„์–ด๋“ค์–ด ๊ธ€๋กœ๋ฒŒ ์‚ฌ์šฉ์ž์—๊ฒŒ ์ผ๊ด€๋œ ๊ณ ์„ฑ๋Šฅ์„ ์ œ๊ณตํ•  ์ˆ˜ ์žˆ๋‹ต๋‹ˆ๋‹ค.
  • ๐Ÿ’ธ ๋น„์šฉ ํšจ์œจ์„ฑ: ์ผ๋ฐ˜์ ์œผ๋กœ Node.js ๋Ÿฐํƒ€์ž„๋ณด๋‹ค ์ €๋ ดํ•œ ๋น„์šฉ์œผ๋กœ ์šด์˜ํ•  ์ˆ˜ ์žˆ์–ด์š”.
    ์ด๋Š” ์งง์€ ์‹คํ–‰ ์‹œ๊ฐ„๊ณผ ํšจ์œจ์ ์ธ ๋ฆฌ์†Œ์Šค ์‚ฌ์šฉ ๋•๋ถ„์ด์ฃ .
์ •๋ณด

Edge Runtime์€ Vercel์˜ Edge Functions, Cloudflare Workers, Deno Deploy ๋“ฑ ๋‹ค์–‘ํ•œ ํ”Œ๋žซํผ์—์„œ ์ œ๊ณตํ•˜๋Š” ์„œ๋ฒ„๋ฆฌ์Šค ๊ธฐ์ˆ ๊ณผ ์œ ์‚ฌํ•œ ๊ฐœ๋…์ด๋ผ๊ณ  ์ƒ๊ฐํ•˜์‹œ๋ฉด ์ดํ•ดํ•˜๊ธฐ ์‰ฌ์šธ ๊ฑฐ์˜ˆ์š”.

1๏ธโƒฃ Edge Runtime์˜ ์ฃผ์š” ์ œํ•œ์‚ฌํ•ญ

๋ฌผ๋ก , Edge Runtime์ด ๋ชจ๋“  ์ƒํ™ฉ์—์„œ ๋งŒ๋Šฅ์ธ ๊ฒƒ์€ ์•„๋‹ˆ์—์š”.
๋น ๋ฅธ ์†๋„์™€ ํšจ์œจ์„ฑ์„ ์œ„ํ•ด ์ผ๋ถ€ ๊ธฐ๋Šฅ์€ ์ œํ•œ๋  ์ˆ˜๋ฐ–์— ์—†์–ด์š”.
์ฃผ์š” ์ œํ•œ์‚ฌํ•ญ์€ ๋‹ค์Œ๊ณผ ๊ฐ™์•„์š”.

  • ๐Ÿ“ฆ Node.js API ์ œํ•œ: ํŒŒ์ผ ์‹œ์Šคํ…œ(fs), child_process, net, tls ๋“ฑ Node.js ๊ณ ์œ ์˜ API๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์—†์–ด์š”.
    ๋”ฐ๋ผ์„œ ์ด๋Ÿฌํ•œ ๊ธฐ๋Šฅ์„ ์‚ฌ์šฉํ•˜๋Š” ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋Š” Edge Runtime์—์„œ ๋™์ž‘ํ•˜์ง€ ์•Š์•„์š”.
  • ๐Ÿ“ ๋ฒˆ๋“ค ํฌ๊ธฐ ์ œํ•œ: ๋ฐฐํฌ ํ™˜๊ฒฝ์— ๋”ฐ๋ผ ๋ฒˆ๋“ค ํฌ๊ธฐ์— ์—„๊ฒฉํ•œ ์ œํ•œ์ด ์žˆ์„ ์ˆ˜ ์žˆ์–ด์š”.
    (Vercel Edge Functions์˜ ๊ฒฝ์šฐ 1MB ์ดํ•˜๋ฅผ ๊ถŒ์žฅํ•ด์š”.)
  • โณ ์งง์€ ์‹คํ–‰ ์‹œ๊ฐ„: ๋ณต์žกํ•˜๊ณ  ๊ธด ์—ฐ์‚ฐ์„ ์ˆ˜ํ–‰ํ•˜๋Š” ์ž‘์—…์—๋Š” ์ ํ•ฉํ•˜์ง€ ์•Š์•„์š”.
    ์ฃผ๋กœ ๊ฐ€๋ณ๊ณ  ๋น ๋ฅธ ์‘๋‹ต์ด ํ•„์š”ํ•œ API์— ํ™œ์šฉํ•˜๋Š” ๊ฒƒ์ด ์ข‹์•„์š”.
  • ๐ŸŒ Web API ๊ธฐ๋ฐ˜: Node.js API ๋Œ€์‹  fetch, Request, Response์™€ ๊ฐ™์€ Web API ํ‘œ์ค€์„ ์‚ฌ์šฉํ•ด์•ผ ํ•ด์š”.

๐Ÿ› ๏ธ Next.js App Router์—์„œ Edge Runtime ์ ์šฉํ•˜๊ธฐ

Next.js App Router์—์„œ Route Handler์— Edge Runtime์„ ์ ์šฉํ•˜๋Š” ๋ฐฉ๋ฒ•์€ ๋งค์šฐ ๊ฐ„๋‹จํ•ด์š”.
route.ts ๋˜๋Š” route.js ํŒŒ์ผ์— export const runtime = 'edge'; ํ•œ ์ค„๋งŒ ์ถ”๊ฐ€ํ•˜๋ฉด ๋ผ์š”.

0๏ธโƒฃ ๊ฐ„๋‹จํ•œ Edge Runtime Route Handler ์˜ˆ์‹œ

๋จผ์ €, Edge Runtime์˜ ์žฅ์ ์„ ์‚ด๋ ค ๊ฐ€๋ณ๊ฒŒ ๋™์ž‘ํ•˜๋Š” ๊ฐ„๋‹จํ•œ API๋ฅผ ๋งŒ๋“ค์–ด ๋ณผ๊ฒŒ์š”.
์ด API๋Š” ์š”์ฒญ๋ฐ›์€ ์ด๋ฆ„์„ ์ด์šฉํ•ด ํ™˜์˜ ๋ฉ”์‹œ์ง€๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋Š” ์—ญํ• ์„ ํ•ด์š”.

// app/api/hello-edge/route.ts export const runtime = 'edge'; // โœจ ์ด ํ•œ ์ค„์ด Edge Runtime์„ ํ™œ์„ฑํ™”ํ•ด์š”. export async function GET(request: Request) { const { searchParams } = new URL(request.url); const name = searchParams.get('name') || 'World'; return new Response(JSON.stringify({ message: `Hello, ${name} from the Edge!` }), { status: 200, headers: { 'content-type': 'application/json' }, }); } export async function POST(request: Request) { const data = await request.json(); const name = data.name || 'Anonymous'; return new Response(JSON.stringify({ message: `Welcome, ${name} to the Edge POST API!` }), { status: 200, headers: { 'content-type': 'application/json' }, }); }

์œ„ ์ฝ”๋“œ์—์„œ ๋ณผ ์ˆ˜ ์žˆ๋“ฏ์ด, export const runtime = 'edge'; ํ•œ ์ค„๋งŒ์œผ๋กœ ํ•ด๋‹น Route Handler๋Š” Edge Runtime ํ™˜๊ฒฝ์—์„œ ๋™์ž‘ํ•˜๊ฒŒ ๋ผ์š”.
Request์™€ Response ๊ฐ์ฒด๋„ Web API ํ‘œ์ค€์„ ๋”ฐ๋ฅด๊ณ  ์žˆ์Œ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ์–ด์š”.

1๏ธโƒฃ Node.js API๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ ๋Œ€์ฒ˜ ๋ฐฉ๋ฒ•

๋งŒ์•ฝ ํŠน์ • ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๊ฐ€ Node.js API์— ์˜์กดํ•œ๋‹ค๋ฉด Edge Runtime์—์„œ๋Š” ์‚ฌ์šฉํ•  ์ˆ˜ ์—†์–ด์š”.
์ด๋Ÿฐ ๊ฒฝ์šฐ, ํ•ด๋‹น ๊ธฐ๋Šฅ์„ Web API ๊ธฐ๋ฐ˜์œผ๋กœ ๋Œ€์ฒดํ•˜๊ฑฐ๋‚˜, ํ•ด๋‹น Route Handler๋งŒ Node.js ๋Ÿฐํƒ€์ž„์œผ๋กœ ์œ ์ง€ํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ๊ณ ๋ คํ•ด์•ผ ํ•ด์š”.
์˜ˆ๋ฅผ ๋“ค์–ด, Node.js์˜ crypto ๋ชจ๋“ˆ ๋Œ€์‹  Web Crypto API๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์–ด์š”.

Node.js crypto ๋ชจ๋“ˆ ์‚ฌ์šฉ ์˜ˆ์‹œ (Edge Runtime์—์„œ ์‚ฌ์šฉ ๋ถˆ๊ฐ€):

// Node.js ๋Ÿฐํƒ€์ž„์—์„œ๋งŒ ๋™์ž‘ํ•ด์š”. import crypto from 'crypto'; function generateRandomStringNode() { return crypto.randomBytes(16).toString('hex'); }

Web Crypto API ์‚ฌ์šฉ ์˜ˆ์‹œ (Edge Runtime์—์„œ ์‚ฌ์šฉ ๊ฐ€๋Šฅ):

// Edge Runtime์—์„œ๋„ ๋™์ž‘ํ•ด์š”. function generateRandomStringWeb() { const array = new Uint8Array(16); crypto.getRandomValues(array); return Array.from(array, byte => byte.toString(16).padStart(2, '0')).join(''); }

์ด์ฒ˜๋Ÿผ Edge Runtime์˜ ์ œ์•ฝ์„ ์ดํ•ดํ•˜๊ณ  ์ ์ ˆํ•œ ๋Œ€์•ˆ์„ ์ฐพ๋Š” ๊ฒƒ์ด ์ค‘์š”ํ•ด์š”.
์ž‘์€ ์œ ํ‹ธ๋ฆฌํ‹ฐ ํ•จ์ˆ˜๋‚˜ ์ธ์ฆ/์ธ๊ฐ€ ๋กœ์ง์ฒ˜๋Ÿผ ๊ฐ€๋ณ๊ณ  ์ž์ฃผ ํ˜ธ์ถœ๋˜๋Š” API์— Edge Runtime์„ ์ ์šฉํ•˜๋ฉด ํฐ ํšจ๊ณผ๋ฅผ ๋ณผ ์ˆ˜ ์žˆ์–ด์š”.

๐ŸŒ ์‹ค์ „ ํ™œ์šฉ: ์ธ์ฆ ๋ฏธ๋“ค์›จ์–ด๋กœ Edge Runtime ํ™œ์šฉํ•˜๊ธฐ

Edge Runtime์€ ์ธ์ฆ/์ธ๊ฐ€ ๋กœ์ง๊ณผ ๊ฐ™์€ ๋ฏธ๋“ค์›จ์–ด ์—ญํ• ์— ์•„์ฃผ ์ ํ•ฉํ•ด์š”.
์‚ฌ์šฉ์ž ์š”์ฒญ์ด ๋“ค์–ด์™”์„ ๋•Œ ๊ฐ€์žฅ ๋จผ์ € ์ฒ˜๋ฆฌ๋˜์–ด์•ผ ํ•˜๊ณ , ๋น ๋ฅด๊ฒŒ ์‘๋‹ตํ•ด์•ผ ํ•˜๊ธฐ ๋•Œ๋ฌธ์ด์—์š”.
๋‹ค์Œ์€ JWT ํ† ํฐ์„ ๊ฒ€์ฆํ•˜๋Š” ๊ฐ„๋‹จํ•œ ์ธ์ฆ ๋ฏธ๋“ค์›จ์–ด ์˜ˆ์‹œ์˜ˆ์š”.

// app/api/auth-protected-edge/route.ts export const runtime = 'edge'; // ์‹ค์ œ ํ™˜๊ฒฝ์—์„œ๋Š” ํ™˜๊ฒฝ ๋ณ€์ˆ˜๋‚˜ KMS ๋“ฑ ์•ˆ์ „ํ•œ ๋ฐฉ์‹์œผ๋กœ ๋น„๋ฐ€ ํ‚ค๋ฅผ ๊ด€๋ฆฌํ•ด์•ผ ํ•ด์š”. const JWT_SECRET = process.env.JWT_SECRET || 'your-super-secret-key'; export async function GET(request: Request) { const authHeader = request.headers.get('Authorization'); if (!authHeader || !authHeader.startsWith('Bearer ')) { return new Response('Unauthorized: No token provided', { status: 401 }); } const token = authHeader.split(' ')[1]; try { // ์‹ค์ œ JWT ๊ฒ€์ฆ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ (์˜ˆ: jose)๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ๋”์šฑ ๊ฒฌ๊ณ ํ•ด์š”. // ์—ฌ๊ธฐ์„œ๋Š” ๊ฐ„๋‹จํ•˜๊ฒŒ ํ† ํฐ์ด 'valid-token'์ธ์ง€ ํ™•์ธํ•˜๋Š” ์˜ˆ์‹œ๋กœ ๋Œ€์ฒดํ•ด์š”. if (token !== 'valid-token') { throw new Error('Invalid token'); } // ํ† ํฐ์ด ์œ ํšจํ•˜๋ฉด ๋‹ค์Œ ๋กœ์ง์„ ์ง„ํ–‰ํ•ด์š”. return new Response(JSON.stringify({ message: 'Access granted!', user: 'edge-user' }), { status: 200, headers: { 'content-type': 'application/json' }, }); } catch (error) { return new Response(`Unauthorized: ${error.message}`, { status: 401 }); } }

์ด ์˜ˆ์‹œ์—์„œ๋Š” JWT_SECRET์„ ํ™˜๊ฒฝ ๋ณ€์ˆ˜์—์„œ ๊ฐ€์ ธ์˜ค๊ณ , ํ† ํฐ์ด valid-token์ธ์ง€ ๊ฐ„๋‹จํžˆ ํ™•์ธํ•˜๋Š” ๋กœ์ง์„ ๋ณด์—ฌ๋“œ๋ ธ์–ด์š”.
์‹ค์ œ ํ”„๋กœ๋•์…˜ ํ™˜๊ฒฝ์—์„œ๋Š” jose ๊ฐ™์€ ๊ฐ•๋ ฅํ•œ JWT ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์‚ฌ์šฉํ•ด์„œ ์„œ๋ช… ๊ฒ€์ฆ์„ ํฌํ•จํ•œ ๋ณต์žกํ•œ ์ธ์ฆ ๋กœ์ง์„ ๊ตฌํ˜„ํ•ด์•ผ ํ•ด์š”.
ํ•˜์ง€๋งŒ Edge Runtime์˜ ์ œ์•ฝ์‚ฌํ•ญ์„ ๊ณ ๋ คํ•˜์—ฌ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์„ ํƒ ์‹œ Edge Runtime ํ˜ธํ™˜์„ฑ์„ ๊ผญ ํ™•์ธํ•ด์•ผ ํ•œ๋‹ต๋‹ˆ๋‹ค.
์ด๋Ÿฌํ•œ ์ธ์ฆ ๋ฏธ๋“ค์›จ์–ด๋ฅผ Edge Runtime์œผ๋กœ ๋ฐฐํฌํ•˜๋ฉด, ์‚ฌ์šฉ์ž ์š”์ฒญ์ด ์„œ๋ฒ„์— ๋„๋‹ฌํ•˜๊ธฐ๋„ ์ „์— ์—ฃ์ง€ ๋กœ์ผ€์ด์…˜์—์„œ ๋น ๋ฅด๊ฒŒ ์ธ์ฆ์„ ์ฒ˜๋ฆฌํ•˜์—ฌ ๋ถˆํ•„์š”ํ•œ ์„œ๋ฒ„ ๋ฆฌ์†Œ์Šค ์‚ฌ์šฉ์„ ์ค„์ด๊ณ  ์‘๋‹ต ์†๋„๋ฅผ ํ–ฅ์ƒ์‹œํ‚ฌ ์ˆ˜ ์žˆ์–ด์š”.

๐Ÿ“ ์ •๋ฆฌํ•˜๋ฉฐ

0๏ธโƒฃ ํ•ต์‹ฌ ์š”์•ฝ

Next.js App Router์—์„œ Edge Runtime์„ Route Handler์— ์ ์šฉํ•˜๋Š” ๊ฒƒ์€ ๊ธ€๋กœ๋ฒŒ ์„œ๋น„์Šค๋ฅผ ์œ„ํ•œ ์„ฑ๋Šฅ๊ณผ ๋น„์šฉ ํšจ์œจ์„ฑ์„ ๋™์‹œ์— ์žก์„ ์ˆ˜ ์žˆ๋Š” ๊ฐ•๋ ฅํ•œ ์ „๋žต์ด์—์š”.
Node.js ๋Ÿฐํƒ€์ž„์˜ ํ•œ๊ณ„๋ฅผ ๊ทน๋ณตํ•˜๊ณ , ์‚ฌ์šฉ์ž์—๊ฒŒ ๋” ๋น ๋ฅด๊ณ  ์•ˆ์ •์ ์ธ ๊ฒฝํ—˜์„ ์ œ๊ณตํ•˜๋Š” ๋ฐ ํฐ ๋„์›€์ด ๋œ๋‹ต๋‹ˆ๋‹ค.

  • Edge Runtime์˜ ์žฅ์ : ๋‚ฎ์€ ์ฝœ๋“œ ์Šคํƒ€ํŠธ, ๊ธ€๋กœ๋ฒŒ ๋ถ„์‚ฐ ๋ฐฐ์น˜, ๋น„์šฉ ํšจ์œจ์„ฑ.
  • Edge Runtime์˜ ์ œํ•œ์‚ฌํ•ญ: Node.js API ์ œํ•œ, ๋ฒˆ๋“ค ํฌ๊ธฐ ์ œํ•œ, ์งง์€ ์‹คํ–‰ ์‹œ๊ฐ„.
  • ์ ์šฉ ๋ฐฉ๋ฒ•: export const runtime = 'edge'; ํ•œ ์ค„ ์ถ”๊ฐ€.
  • ํ™œ์šฉ ๋ถ„์•ผ: ๊ฐ€๋ฒผ์šด API, ์ธ์ฆ/์ธ๊ฐ€ ๋ฏธ๋“ค์›จ์–ด ๋“ฑ ๋น ๋ฅธ ์‘๋‹ต์ด ํ•„์š”ํ•œ ์ž‘์—….

1๏ธโƒฃ ๋‹ค์Œ ์•ก์…˜: ์—ฌ๋Ÿฌ๋ถ„์˜ ํ”„๋กœ์ ํŠธ์— ์ ์šฉํ•ด ๋ณด์„ธ์š”!

์ด์ œ Edge Runtime์˜ ๊ฐœ๋…๊ณผ ์ ์šฉ ๋ฐฉ๋ฒ•์„ ์ดํ•ดํ•˜์…จ์œผ๋‹ˆ, ์—ฌ๋Ÿฌ๋ถ„์˜ Next.js ํ”„๋กœ์ ํŠธ์—์„œ Route Handler์— Edge Runtime์„ ์ ์šฉํ•ด ๋ณด์„ธ์š”.
ํŠนํžˆ ์‚ฌ์šฉ์ž ์ˆ˜๊ฐ€ ๋งŽ๊ฑฐ๋‚˜ ๊ธ€๋กœ๋ฒŒ ์„œ๋น„์Šค๋ฅผ ๊ณ„ํšํ•˜๊ณ  ๊ณ„์‹ ๋‹ค๋ฉด, ์ดˆ๊ธฐ๋ถ€ํ„ฐ Edge Runtime์„ ๊ณ ๋ คํ•˜๋Š” ๊ฒƒ์ด ์žฅ๊ธฐ์ ์ธ ๊ด€์ ์—์„œ ๋งค์šฐ ์œ ๋ฆฌํ•  ๊ฑฐ์˜ˆ์š”.
์ œํ•œ์‚ฌํ•ญ์„ ์ถฉ๋ถ„ํžˆ ๊ณ ๋ คํ•˜์—ฌ Node.js ๋Ÿฐํƒ€์ž„๊ณผ Edge Runtime์„ ์ ์ ˆํžˆ ์กฐํ•ฉํ•ด์„œ ์‚ฌ์šฉํ•˜์‹œ๋ฉด ์ตœ์ ์˜ ์„ฑ๋Šฅ์„ ๋‹ฌ์„ฑํ•  ์ˆ˜ ์žˆ๋‹ต๋‹ˆ๋‹ค.
๊ถ๊ธˆํ•œ ์ ์ด ์žˆ๋‹ค๋ฉด ์–ธ์ œ๋“ ์ง€ ๋Œ“๊ธ€๋กœ ์งˆ๋ฌธํ•ด์ฃผ์„ธ์š”. ํ•จ๊ป˜ ์„ฑ์žฅํ•˜๋Š” ๊ฐœ๋ฐœ์ž ์ปค๋ฎค๋‹ˆํ‹ฐ๋ฅผ ๋งŒ๋“ค์–ด๊ฐ€์š”!

๐Ÿ“ฎ ์ฐธ๊ณ 

์—ฐ๊ด€๋œ ํฌ์ŠคํŠธ