리소스 보호
라우트를 보호하는 일반적인 방법은 세션을 확인하고, 활성 세션이 없을 때 사용자를 로그인 페이지로 리다이렉트하거나 401: Unauthenticated
응답을 반환하는 것입니다.
Pages
auth.ts
또는 auth.js
설정 파일에서 내보낸 NextAuth()
의 auth
함수를 사용하여 세션 객체를 가져올 수 있습니다.
import { auth } from "@/auth"
export default async function Page() {
const session = await auth()
if (!session) return <div>Not authenticated</div>
return (
<div>
<pre>{JSON.stringify(session, null, 2)}</pre>
</div>
)
}
API Routes
다양한 프레임워크에서 API 라우트를 보호하는 것도 auth
내보내기를 사용해 할 수 있습니다.
Next.js에서는 auth
함수를 사용해 API 라우트 핸들러를 감쌀 수 있습니다. 그러면 요청 매개변수에 auth
키가 생기고, 이를 통해 유효한 세션을 확인할 수 있습니다.
import { auth } from "@/auth"
import { NextResponse } from "next/server"
export const GET = auth(function GET(req) {
if (req.auth) return NextResponse.json(req.auth)
return NextResponse.json({ message: "Not authenticated" }, { status: 401 })
})
Next.js 미들웨어
Next.js 12 이상에서는 페이지를 보호하는 가장 쉬운 방법은 미들웨어 파일을 사용하는 것입니다. 루트 페이지 디렉토리에 middleware.ts
파일을 생성하고 다음과 같이 작성할 수 있습니다.
export { auth as middleware } from "@/auth"
그런 다음 auth.ts
파일에서 authorized
콜백을 정의합니다. 자세한 내용은 참조 문서를 확인하세요.
import NextAuth from "next-auth"
export const { auth, handlers } = NextAuth({
callbacks: {
authorized: async ({ auth }) => {
// 로그인한 사용자는 인증된 상태, 그렇지 않으면 로그인 페이지로 리다이렉트
return !!auth
},
},
})
미들웨어 내부에서 더 많은 로직을 구현하고 싶다면 auth
메서드를 래퍼로 사용할 수도 있습니다.
import { auth } from "@/auth"
export default auth((req) => {
if (!req.auth && req.nextUrl.pathname !== "/login") {
const newUrl = new URL("/login", req.nextUrl.origin)
return Response.redirect(newUrl)
}
})
여러 라우트를 매칭하기 위해 정규식을 사용하거나 특정 라우트를 제외하여 나머지 모든 라우트를 보호할 수도 있습니다. 다음 예제는 파비콘이나 정적 이미지와 같은 경로에서 미들웨어가 실행되지 않도록 합니다.
export const config = {
matcher: ["/((?!api|_next/static|_next/image|favicon.ico).*)"],
}
미들웨어는 matcher
설정에 따라 페이지를 보호합니다. 매처에 대한 자세한 내용은 Next.js 문서를 참조하세요.
권한 부여를 위해 미들웨어에만 의존해서는 안 됩니다. 항상 데이터를 가져오는 부분에서 세션을 검증하는 것이 중요합니다.