✨ 주요 개선사항: - PDF API 500 에러 수정 (한글 파일명 UTF-8 인코딩 처리) - PDF 뷰어 기능 완전 구현 (PDF.js 통합, 네비게이션, 확대/축소) - 서적별 문서 그룹화 UI 데본씽크 스타일로 개선 - PDF Manager 페이지 서적별 보기 기능 추가 - Alpine.js 로드 순서 최적화로 JavaScript 에러 해결 🎨 UI/UX 개선: - 확장/축소 가능한 아코디언 스타일 서적 목록 - 간결하고 직관적인 데본씽크 스타일 인터페이스 - PDF 상태 표시 (HTML 연결, 서적 분류) - 반응형 디자인 및 부드러운 애니메이션 🔧 기술적 개선: - PDF.js 워커 설정 및 토큰 인증 처리 - 서적별 PDF 자동 그룹화 로직 - Alpine.js 컴포넌트 초기화 최적화
93 lines
2.8 KiB
JavaScript
93 lines
2.8 KiB
JavaScript
/**
|
|
* 인증 가드 - 모든 보호된 페이지에서 사용
|
|
* 로그인하지 않은 사용자를 자동으로 로그인 페이지로 리다이렉트
|
|
*/
|
|
|
|
(function() {
|
|
'use strict';
|
|
|
|
// 인증이 필요하지 않은 페이지들
|
|
const PUBLIC_PAGES = [
|
|
'login.html',
|
|
'setup.html'
|
|
];
|
|
|
|
// 현재 페이지가 공개 페이지인지 확인
|
|
function isPublicPage() {
|
|
const currentPath = window.location.pathname;
|
|
return PUBLIC_PAGES.some(page => currentPath.includes(page));
|
|
}
|
|
|
|
// 로그인 페이지로 리다이렉트
|
|
function redirectToLogin() {
|
|
const currentUrl = encodeURIComponent(window.location.href);
|
|
console.log('🔐 인증되지 않은 접근. 로그인 페이지로 이동합니다.');
|
|
window.location.href = `login.html?redirect=${currentUrl}`;
|
|
}
|
|
|
|
// 인증 체크 함수
|
|
async function checkAuthentication() {
|
|
// 공개 페이지는 체크하지 않음
|
|
if (isPublicPage()) {
|
|
return;
|
|
}
|
|
|
|
const token = localStorage.getItem('access_token');
|
|
|
|
// 토큰이 없으면 즉시 리다이렉트
|
|
if (!token) {
|
|
redirectToLogin();
|
|
return;
|
|
}
|
|
|
|
try {
|
|
// 토큰 유효성 검사
|
|
const response = await fetch('/api/auth/me', {
|
|
headers: {
|
|
'Authorization': `Bearer ${token}`,
|
|
'Content-Type': 'application/json'
|
|
}
|
|
});
|
|
|
|
if (!response.ok) {
|
|
console.log('🔐 토큰이 유효하지 않습니다. 상태:', response.status);
|
|
localStorage.removeItem('access_token');
|
|
redirectToLogin();
|
|
return;
|
|
}
|
|
|
|
// 인증 성공
|
|
const user = await response.json();
|
|
console.log('✅ 인증 성공:', user.email);
|
|
|
|
// 전역 사용자 정보 설정
|
|
window.currentUser = user;
|
|
|
|
// 헤더 사용자 메뉴 업데이트
|
|
if (typeof window.updateUserMenu === 'function') {
|
|
window.updateUserMenu(user);
|
|
}
|
|
|
|
} catch (error) {
|
|
console.error('🔐 인증 확인 중 오류:', error);
|
|
localStorage.removeItem('access_token');
|
|
redirectToLogin();
|
|
}
|
|
}
|
|
|
|
// DOM 로드 완료 전에 인증 체크 실행
|
|
if (document.readyState === 'loading') {
|
|
document.addEventListener('DOMContentLoaded', checkAuthentication);
|
|
} else {
|
|
checkAuthentication();
|
|
}
|
|
|
|
// 전역 함수로 노출
|
|
window.authGuard = {
|
|
checkAuthentication,
|
|
redirectToLogin,
|
|
isPublicPage
|
|
};
|
|
|
|
})();
|