Next.js ํ”„๋กœ์ ํŠธ์—์„œ Supabase์™€ App Router๋ฅผ ํ•จ๊ป˜ ์‚ฌ์šฉํ•  ๋•Œ ๋ณดํ˜ธ๋œ ํŽ˜์ด์ง€ ์ ‘๊ทผ ์ฒ˜๋ฆฌ๋ฅผ ์–ด๋–ป๊ฒŒ ํ•ด์•ผ ํ•˜๋Š”์ง€์— ๋Œ€ํ•ด ์ •๋ฆฌํ•ด๋ณด์•˜์Šต๋‹ˆ๋‹ค.


๐Ÿ”– ๊ฒฐ๋ก  ์š”์•ฝ

๋ฐฉ๋ฒ• ์‚ฌ์šฉ ์—ฌ๋ถ€ ์ถ”์ฒœ๋„
โœ… ์„œ๋ฒ„ ์ปดํฌ๋„ŒํŠธ์—์„œ ๋ฆฌ๋””๋ ‰์…˜(redirect()) โœ”๏ธ ์‚ฌ์šฉ ๊ฐ€๋Šฅ โœ… โœ… โœ… ๊ฐ•๋ ฅ ์ถ”์ฒœ
โ›” ๋ฏธ๋“ค์›จ์–ด(middleware.ts)์—์„œ Supabase ์ธ์ฆ ์ฒ˜๋ฆฌ โš ๏ธ ๊ฐ€๋Šฅํ•˜๋‚˜ ๋ณต์žก โŒ ๋น„์ถ”์ฒœ

๐Ÿง ๋ฏธ๋“ค์›จ์–ด ๋ฐฉ์‹์ด ๋น„์ถ”์ฒœ์ธ ์ด์œ 

Next.js์˜ ๋ฏธ๋“ค์›จ์–ด(middleware.ts)๋Š” Supabase ์ธ์ฆ๊ณผ ํ•จ๊ป˜ ์‚ฌ์šฉํ•  ๋•Œ ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์ œํ•œ์ด ์กด์žฌํ•ฉ๋‹ˆ๋‹ค:

  1. โŒ ์˜ค์ง cookies() ํ•จ์ˆ˜๋งŒ ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•˜๋ฉฐ Supabase ์„ธ์…˜ ๊ด€๋ฆฌ๊ฐ€ ๋ถˆ์•ˆ์ •ํ•ฉ๋‹ˆ๋‹ค.
  2. โŒ supabase.auth.getUser()๋Š” ๋ฏธ๋“ค์›จ์–ด ํ™˜๊ฒฝ์—์„œ ์‚ฌ์šฉ ๋ถˆ๊ฐ€ํ•ฉ๋‹ˆ๋‹ค.
  3. โŒ fetch ๋ฐ async/await ์‚ฌ์šฉ์ด ์ œํ•œ์ ์ด์–ด์„œ ๋ณต์žกํ•œ ์ธ์ฆ ๋กœ์ง์ด๋‚˜ ์—๋Ÿฌ ์ฒ˜๋ฆฌ๊ฐ€ ์–ด๋ ต์Šต๋‹ˆ๋‹ค.
  4. โŒ ์„œ๋ฒ„ ์ปดํฌ๋„ŒํŠธ์˜ redirect()์™€ ์ถฉ๋Œ ๊ฐ€๋Šฅ์„ฑ์ด ์žˆ์Šต๋‹ˆ๋‹ค.

โœ… ๊ถŒ์žฅํ•˜๋Š” ์‹ค์ „ ๋ฐฉ์‹

์„œ๋ฒ„ ์ปดํฌ๋„ŒํŠธ ๋‚ด๋ถ€์—์„œ ์ง์ ‘ Supabase ์ธ์ฆ ์„ธ์…˜์„ ํ™•์ธํ•˜๊ณ , ์—†์œผ๋ฉด ๋ฐ”๋กœ ๋ฆฌ๋””๋ ‰์…˜์„ ์ฒ˜๋ฆฌํ•˜๋Š” ๋ฐฉ์‹์ž…๋‹ˆ๋‹ค.

// app/mypage/page.tsx
import { createServerClient } from '@/lib/supabase'
import { redirect } from 'next/navigation'

export default async function MyPage() {
  const supabase = createServerClient()
  const { data: { user } } = await supabase.auth.getUser()

  if (!user) {
    redirect('/auth/login')
  }

  return <div>โœ… ๋กœ๊ทธ์ธํ•œ ์‚ฌ์šฉ์ž๋งŒ ๋ณผ ์ˆ˜ ์žˆ๋Š” ๋งˆ์ดํŽ˜์ด์ง€์ž…๋‹ˆ๋‹ค.</div>
}

โœ… Supabase ๊ณต์‹ ๋ฌธ์„œ์—์„œ๋„ ๊ถŒ์žฅํ•˜๋Š” ๊ฐ€์žฅ ์•ˆ์ „ํ•œ ๋ฐฉ๋ฒ•์ž…๋‹ˆ๋‹ค.


โš ๏ธ ๋ฏธ๋“ค์›จ์–ด๋กœ ๊ฐ€๋Šฅํ•œ ๋ฐฉ์‹(๋น„์ถ”์ฒœ)

// middleware.ts
import { NextResponse } from 'next/server'

export function middleware(request) {
  const isLoggedIn = request.cookies.has('sb-access-token')
  if (!isLoggedIn) {
    return NextResponse.redirect(new URL('/auth/login', request.url))
  }
  return NextResponse.next()
}

ํ•˜์ง€๋งŒ ์œ„ ๋ฐฉ๋ฒ•์€: