fix: TKQC 인증 흐름 무한루프 방지 및 스크립트 로드 순서 정리

- api.js 401 핸들러: window.location.href 리다이렉트 제거, throw Error로 변경 (auth-manager가 처리)
- auth-manager.js refreshAuth(): throw error → return null (무한 리다이렉트 방지)
- auth-manager.js setupTokenExpiryCheck(): catch→logout 대신 then으로 변경 (이중 리다이렉트 방지)
- 모든 HTML: api.js를 auth-manager.js보다 먼저 로드하도록 순서 수정
- 누락 페이지(archive, issue-view)에 api.js + auth-manager.js 추가
- 전체 HTML 캐시 버스팅 버전 v=20260308로 통일

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
Hyungi Ahn
2026-03-08 13:11:40 +09:00
parent 9647ae0d56
commit 81478dc6ac
15 changed files with 112 additions and 124 deletions

View File

@@ -106,11 +106,10 @@ async function apiRequest(endpoint, options = {}) {
const response = await fetch(`${API_BASE_URL}${endpoint}`, config);
if (response.status === 401) {
// 인증 실패 시 중앙 로그인 페이지로
// 인증 실패 — 토큰만 정리하고 에러 throw (리다이렉트는 auth-manager가 처리)
TokenManager.removeToken();
TokenManager.removeUser();
window.location.href = _getLoginUrl();
return;
throw new Error('인증이 만료되었습니다.');
}
if (!response.ok) {
@@ -266,41 +265,21 @@ const ReportsAPI = {
}
};
// 권한 체크
// 권한 체크 — authManager.checkAuth()로 통일 권장
// 레거시 호환용으로 유지 (localStorage만 체크, API 호출 없음)
function checkAuth() {
const user = TokenManager.getUser();
if (!user) {
window.location.href = _getLoginUrl();
return null;
}
if (!user) return null;
return user;
}
function checkAdminAuth() {
const user = checkAuth();
if (user && user.role !== 'admin') {
alert('관리자 권한이 필요합니다.');
window.location.href = _getLoginUrl();
return null;
}
return user;
}
// 페이지 접근 권한 체크 함수
function checkPageAccess(pageName) {
const user = checkAuth();
if (!user) return null;
// admin은 모든 페이지 접근 가능
if (user.role === 'admin') return user;
// 페이지별 권한 체크는 pagePermissionManager에서 처리
if (window.pagePermissionManager && !window.pagePermissionManager.canAccessPage(pageName)) {
alert('이 페이지에 접근할 권한이 없습니다.');
window.location.href = _getLoginUrl();
return null;
}
return user;
}