태그를 관리용/일반용으로 분리하고 관리자 드래그 정렬을 추가.

댓글/회원/관리자 인증·프로필 흐름 보완과 관련 마이그레이션 및 문서를 함께 반영해 운영 동선을 안정화.

Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
2026-05-11 18:34:23 +09:00
parent b18aca4dcc
commit cdc16c72b2
35 changed files with 1721 additions and 138 deletions

View File

@@ -49,12 +49,14 @@ const signPayload = (payload) => createHmac('sha256', getSessionSecret())
/**
* 관리자 세션 토큰 생성
* @param {string} email - 관리자 이메일
* @param {{ userId: string, email: string }} adminUser - 관리자 사용자 정보
* @returns {string} 세션 토큰
*/
export const createAdminSessionToken = (email) => {
export const createAdminSessionToken = (adminUser) => {
const payload = Buffer.from(JSON.stringify({
email,
userId: adminUser.userId,
email: adminUser.email,
role: 'admin',
expiresAt: Date.now() + sessionMaxAge * 1000
})).toString('base64url')
@@ -64,7 +66,7 @@ export const createAdminSessionToken = (email) => {
/**
* 관리자 세션 토큰 검증
* @param {string | undefined} token - 세션 토큰
* @returns {{ email: string } | null} 세션 정보
* @returns {{ userId: string, email: string, role: 'admin' } | null} 세션 정보
*/
export const verifyAdminSessionToken = (token) => {
if (!token) {
@@ -85,23 +87,25 @@ export const verifyAdminSessionToken = (token) => {
return null
}
if (!session.email || !session.expiresAt || session.expiresAt < Date.now()) {
if (!session.userId || !session.email || session.role !== 'admin' || !session.expiresAt || session.expiresAt < Date.now()) {
return null
}
return {
email: session.email
userId: session.userId,
email: session.email,
role: 'admin'
}
}
/**
* 관리자 세션 쿠키 설정
* @param {import('h3').H3Event} event - 요청 이벤트
* @param {string} email - 관리자 이메일
* @param {{ userId: string, email: string }} adminUser - 관리자 사용자 정보
* @returns {void}
*/
export const setAdminSession = (event, email) => {
setCookie(event, adminSessionCookieName, createAdminSessionToken(email), {
export const setAdminSession = (event, adminUser) => {
setCookie(event, adminSessionCookieName, createAdminSessionToken(adminUser), {
httpOnly: true,
sameSite: 'lax',
secure: process.env.NODE_ENV === 'production',
@@ -124,14 +128,14 @@ export const clearAdminSession = (event) => {
/**
* 관리자 세션 조회
* @param {import('h3').H3Event} event - 요청 이벤트
* @returns {{ email: string } | null} 세션 정보
* @returns {{ userId: string, email: string, role: 'admin' } | null} 세션 정보
*/
export const getAdminSession = (event) => verifyAdminSessionToken(getCookie(event, adminSessionCookieName))
/**
* 관리자 세션 필수 확인
* @param {import('h3').H3Event} event - 요청 이벤트
* @returns {{ email: string }} 세션 정보
* @returns {{ userId: string, email: string, role: 'admin' }} 세션 정보
*/
export const requireAdminSession = (event) => {
const session = getAdminSession(event)