태그를 관리용/일반용으로 분리하고 관리자 드래그 정렬을 추가.
댓글/회원/관리자 인증·프로필 흐름 보완과 관련 마이그레이션 및 문서를 함께 반영해 운영 동선을 안정화. Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
@@ -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)
|
||||
|
||||
Reference in New Issue
Block a user