Skip to Content
Suffering builds character
아카이브9.Next.js특징인증6. Stateful 기반 세션 관리

6. Stateful 기반 세션 관리

데이터베이스를 활용하여 상태를 유지하는 방식으로 세션을 관리하기 위해서는 다음의 단계를 따름

  1. 세션 정보를 저장하기 위한 DB 테이블 생성
  2. INSERT, UPDATE, DELETE 세션 기능 구현
  3. 세션 ID를 사용자의 브라우저에 저장하기 전에 암호화 수행

데이터베이스와 쿠키가 동기화 상태를 유지하도록 해야 함
(이는 선택 사항이지만, 미들웨어에서 낙관적인 인증 확인을 위해 권장됨)

app/lib/session.js
import cookies from 'next/headers' import { db } from '@/app/lib/db' import { encrypt } from '@/app/lib/session' export async function createSession(id) { const expiresAt = new Date(Date.now() + 7 * 24 * 60 * 60 * 1000) // 1. DB INSERT 쿼리를 통해 세션 정보 생성 const data = await db .insert(sessions) .values({ userId: id, expiresAt, }) // 생성된 세션 ID값을 반환받음 .returning({ id: sessions.id }) const sessionId = data[0].id // 2. 세션 ID를 암호화 const session = await encrypt({ sessionId, expiresAt }) // 3. 인증 정보 검증(Optimistic)을 위해 세션 정보를 브라우저 쿠키에 저장 const cookieStore = await cookies() cookieStore.set('session', session, { httpOnly: true, secure: true, expires: expiresAt, sameSite: 'lax', path: '/', }) }

세션 관리 이후에는 인가 프로세스를 통해 사용자가 특정 페이지에 접근할 수 있는 권한이 있는지 확인하여 접근 여부를 허가/제한하는 처리가 필요함

Last updated on