๐คทโ๏ธ ๋ณธ๋ก ์ ์์ ๋ฏธ๋ค์จ์ด ๊ธฐ๋ณธ๊ฐ๋
- ๋ฏธ๋ค์จ์ด๋ ์๋ฒ ์ธก์์ ์์ฒญ์ ์ฒ๋ฆฌํ๊ธฐ ์ ์ ์คํ๋๋ ํจ์์ด๋ฉฐ ๋ฏธ๋ค์จ์ด๋ฅผ ํตํด์ ์์ฒญ์๋ํ ์์ ์ ์ฌ์ ์ ์ํํ ์ ์๋๋ก ๋์ต๋๋ค.
- ๋ฏธ๋ค์จ์ด ํ์ผ์ middleware.ts ๋๋ middleware.js ํ์ผ๋ช ์ผ๋ก ./pages, ./app ํด๋์ ๊ฐ์ ๊ณ์ธต์ ์์นํด์ผ๋ฉ๋๋ค.
Next.js ๋ฒ์ ๋ง๋ค ๋ฃจํธ ๊ฒฝ๋ก์ /pages, /app ๋ค๋ฅผ์ ์์ง๋ง /pages, /app ํด๋์ ๊ฐ์ ๊ณ์ธต์ ๋ฏธ๋ค์จ์ด ํ์ผ์ ์์น์ํค๋ฉด ๋ฉ๋๋ค.
๋ฏธ๋ค์จ์ด ํ์ผ๋ช ๊ณผ ๊ฒฝ๋ก ๊ท์น์ ๊ผญ ์ค์ํ์ ์ผ ๋ฏธ๋ค์จ์ด ํจ์๊ฐ ๋์ํฉ๋๋ค.
๐คทโ๏ธ Middleware.ts ์ฌ์ฉ๋ฒ
๋ฏธ๋ค์จ์ด ์ฌ์ฉ๋ฐฉ๋ฒ
import { NextResponse } from 'next/server'
import type { NextRequest } from 'next/server'
// This function can be marked `async` if using `await` inside
export function middleware(request: NextRequest) {
return NextResponse.redirect(new URL('/home', request.url))
}
// matcher์ ๋งค์นญ๋๋ ๊ฒฝ๋ก๋ก ์ ๊ทผํ๋ ๊ฒฝ์ฐ middleware.ts ์คํ
export const config = {
matcher: '/about/:path*',
}
matcher ์ค์
ํน์ ๊ฒฝ๋ก ์ค์
export const config = {
matcher: '/about/:path*',
}
๋ฐฐ์ด ๊ตฌ๋ฌธ์ผ๋ก ์ฌ๋ฌ ๊ฒฝ๋ก ์ค์
export const config = {
matcher: ['/about/:path*', '/dashboard/:path*'],
}
matcher์ ๊ฒฝ๋ก ์ค์ ์ผ๋ก middleware๋ฅผ ์ฌ์ฉํ ์ ์์ต๋๋ค.
Next.js middleware ๊ณต์๋ฌธ์
https://nextjs.org/docs/app/building-your-application/routing/middleware
๐คทโ๏ธ Middleware๋ฅผ ํ์ฉํ ๋ก๊ทธ์ธ ํ์ด์ง ๋ฆฌ๋ค์ด๋ ์ ๋ฐฉ๋ฒ
์ค์ ์ ๊ฐ ์ด์์ค์ธ ์ผํ๋ชฐ ์ฝ๋์ ๋๋ค.
Next.js์ middleware ํจ์์์ ์์ฒญ ํค๋์ ์ฟ ํค์ ์ ๊ทผ์ด ๊ฐ๋ฅํ๋ฉฐ token์ ํ์ฉํด์ ๋ก๊ทธ์ธ ์ฌ๋ถ๋ฅผ ํ๋จํ์ฌ Redirection์ ๊ตฌํํ ์ ์์ต๋๋ค.
import { getToken } from 'next-auth/jwt';
import type { NextRequest } from 'next/server';
import { NextResponse } from 'next/server';
// ๋ฏธ๋ค์จ์ด์์ ์ฌ์ฉ๋ secret ์ค์
const secret = process.env.AUTH_SECRET;
export async function middleware(req: NextRequest) {
// ์ธ์
ํ ํฐ ํ์ธ (JWT ์ฌ์ฉ)
const token = await getToken({ req, secret });
// ์ธ์
์ด ์์ผ๋ฉด ๋ก๊ทธ์ธ ํ์ด์ง๋ก ๋ฆฌ๋ค์ด๋ ํธ
if (!token) {
const loginUrl = new URL('/login', req.url);
return NextResponse.redirect(loginUrl);
}
// ์ธ์
์ด ์์ผ๋ฉด ์์ฒญ์ ์ ์ ์ฒ๋ฆฌ
return NextResponse.next();
}
// ์ด ๋ฏธ๋ค์จ์ด๊ฐ ์ ์ฉ๋ ๊ฒฝ๋ก (๋ณดํธ๋ ๊ฒฝ๋ก ์ค์ )
export const config = {
matcher: [
'/cart',
'/cart/:path*',
'/profile',
'/profile/:path*',
'/purchase-history',
'/purchase-history/:path*',
'/checkout',
'/checkout/:path*'
] // ๋ณดํธํ ๊ฒฝ๋ก๋ฅผ ์ค์ (์: /protected/*)
};
token์ด ์์ผ๋ฉด ๋ก๊ทธ์ธํ ์ ์ ๊ฐ ์๋๊ธฐ ๋๋ฌธ์ ๋ก๊ทธ์ธ ํ์ด์ง๋ก Redirection ์ํต๋๋ค.
Middleware ์ฌ์ฉํ๋ ์ด์
- ์ฑ๋ฅ ํฅ์: ์๋ฒ ์ธก์์ ์์ฒญ์ ๋ฏธ๋ฆฌ ์ฒ๋ฆฌํจ์ผ๋ก์จ ํด๋ผ์ด์ธํธ์ ๋ถํ๋ฅผ ์ค์ด๊ณ , ๋ ๋น ๋ฅธ ์๋ต์ ์ ๊ณตํ ์ ์์ต๋๋ค.
- ์ ์ฐ์ฑ: ๋ค์ํ ์กฐ๊ฑด์ ๋ฐ๋ผ ์์ฒญ์ ์ฒ๋ฆฌํ ์ ์์ด, ๋ณต์กํ ๋น์ฆ๋์ค ๋ก์ง์ ์ฝ๊ฒ ๊ตฌํํ ์ ์์ต๋๋ค.
- ๋ณด์ ๊ฐํ: ์ธ์ฆ ๋ฐ ๊ถํ ๊ด๋ฆฌ๋ฅผ ํตํด ์ ํ๋ฆฌ์ผ์ด์ ์ ๋ณด์์ ๊ฐํํ ์ ์์ต๋๋ค.
์ฌ๋ฐ๋ ์ค๋์ ๋ ๋ณ ์ด์ธ ๋ณด๊ณ ๊ฐ์ธ์!
https://cometruedream.tistory.com/247
https://cometruedream.tistory.com/243
https://cometruedream.tistory.com/242
https://cometruedream.tistory.com/241
https://cometruedream.tistory.com/244
'React' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
๊ด๋ฆฌ์๋จ ํ์ ๊ธฐ๋ฅ react-csv ํ์ฉํ CSV ํ์ผ ๋ค์ด๋ก๋ (1) | 2024.08.22 |
---|---|
NextJS์์ Prisma๋ฅผ ์ฌ์ฉํ Vercel์ ๋ฐฐํฌ ์ค๋ฅ ํด๊ฒฐ ๋ฐฉ๋ฒ (2) | 2024.08.09 |
React ๊ฐ๋ฐ์๋ฅผ ์ํ TypeScript์ Hooks ์ฌ์ฉ ํ ๋ฐ ์์ (1) | 2024.08.08 |
๋ฆฌ์กํธ ์ ์ด vs ๋น์ ์ด ์ปดํฌ๋ํธ ์์๋ณด๊ธฐ (0) | 2024.08.02 |
๋ฆฌ์กํธ useLayoutEffect ๊ฐ๋ ๋ฐ ์ฌ์ฉ๋ฒ (36) | 2024.07.31 |