- 인증된 사용자용 대시보드 페이지 구현 ((protected) 라우트 그룹) - API 엔드포인트 추가 (인증, 사용자 관리) - 커스텀 훅 추가 (useAuth) - 미들웨어 인증 로직 강화 - 환경변수 예제 업데이트 - 기존 dashboard 페이지 제거 후 보호된 라우트로 이동 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <noreply@anthropic.com>
64 lines
1.6 KiB
TypeScript
64 lines
1.6 KiB
TypeScript
import { NextResponse } from 'next/server';
|
|
import type { NextRequest } from 'next/server';
|
|
|
|
/**
|
|
* Logout Proxy Route Handler
|
|
*
|
|
* Purpose:
|
|
* - Call PHP backend logout API
|
|
* - Clear HttpOnly cookie
|
|
* - Ensure complete session cleanup
|
|
*/
|
|
export async function POST(request: NextRequest) {
|
|
try {
|
|
// Get token from HttpOnly cookie
|
|
const token = request.cookies.get('user_token')?.value;
|
|
|
|
if (token) {
|
|
// Call PHP backend logout API
|
|
try {
|
|
await fetch(`${process.env.NEXT_PUBLIC_API_URL}/api/v1/logout`, {
|
|
method: 'POST',
|
|
headers: {
|
|
'Content-Type': 'application/json',
|
|
'Accept': 'application/json',
|
|
'Authorization': `Bearer ${token}`,
|
|
'X-API-KEY': process.env.NEXT_PUBLIC_API_KEY || '',
|
|
},
|
|
});
|
|
console.log('✅ Backend logout API called successfully');
|
|
} catch (error) {
|
|
console.warn('⚠️ Backend logout API failed (continuing with cookie deletion):', error);
|
|
}
|
|
}
|
|
|
|
// Clear HttpOnly cookie
|
|
const cookieOptions = [
|
|
'user_token=',
|
|
'HttpOnly',
|
|
'Secure',
|
|
'SameSite=Strict',
|
|
'Path=/',
|
|
'Max-Age=0', // Delete immediately
|
|
].join('; ');
|
|
|
|
console.log('✅ Logout complete - HttpOnly cookie cleared');
|
|
|
|
return NextResponse.json(
|
|
{ message: 'Logged out successfully' },
|
|
{
|
|
status: 200,
|
|
headers: {
|
|
'Set-Cookie': cookieOptions,
|
|
},
|
|
}
|
|
);
|
|
|
|
} catch (error) {
|
|
console.error('Logout proxy error:', error);
|
|
return NextResponse.json(
|
|
{ error: 'Internal server error' },
|
|
{ status: 500 }
|
|
);
|
|
}
|
|
} |