6. Stateful 기반 세션 관리
데이터베이스를 활용하여 상태를 유지하는 방식으로 세션을 관리하기 위해서는 다음의 단계를 따름
- 세션 정보를 저장하기 위한 DB 테이블 생성
- INSERT, UPDATE, DELETE 세션 기능 구현
- 세션 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