Phase 1 CRITICAL XSS: - marked.parse() → DOMPurify.sanitize() (system3 ai-assistant, issues-management) - toast innerHTML에 escapeHtml 적용 (system1 api-base, system3 common-header) - onclick 핸들러 → data 속성 + addEventListener (system2 issue-detail) Phase 2 HIGH 인가: - getUserBalance 본인확인 추가 (tksupport vacationController) Phase 3 HIGH 토큰+CSP: - localStorage 토큰 저장 제거 — 쿠키 전용 (7개 서비스) - unsafe-eval CSP 제거 (system1 security.js) Phase 4 MEDIUM: - nginx 보안 헤더 추가 (8개 서비스) - 500 에러 메시지 마스킹 (5개 API) - path traversal 방지 (system3 file_service.py) - cookie fallback 데드코드 제거 (4개 auth.js) - /login/form rate limiting 추가 (sso-auth) Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
30 lines
1.3 KiB
HTML
30 lines
1.3 KiB
HTML
<!DOCTYPE html>
|
|
<html lang="ko">
|
|
<head>
|
|
<meta charset="UTF-8" />
|
|
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
|
<title>(주)테크니컬코리아 생산팀 포털</title>
|
|
<link rel="icon" type="image/png" href="/img/favicon.png">
|
|
<!-- SW 캐시 강제 해제 (Chrome 대응) -->
|
|
<script>
|
|
if('serviceWorker' in navigator){navigator.serviceWorker.getRegistrations().then(function(r){r.forEach(function(reg){reg.unregister()});})}
|
|
if('caches' in window){caches.keys().then(function(k){k.forEach(function(key){caches.delete(key)})})}
|
|
</script>
|
|
<script src="/js/api-base.js?v=20260313"></script>
|
|
<script>
|
|
// SSO 토큰 확인
|
|
var token = window.getSSOToken ? window.getSSOToken() : (localStorage.getItem('sso_token') || localStorage.getItem('token'));
|
|
if (token && token !== 'undefined' && token !== 'null') {
|
|
// 이미 로그인된 경우 대시보드로 이동
|
|
window.location.replace('/pages/dashboard-new.html');
|
|
} else {
|
|
// SSO 로그인 페이지로 리다이렉트 (gateway의 /login)
|
|
window.location.replace('/login?redirect=' + encodeURIComponent('/pages/dashboard-new.html'));
|
|
}
|
|
</script>
|
|
</head>
|
|
<body>
|
|
<!-- SSO 로그인 페이지로 자동 리다이렉트됩니다 -->
|
|
</body>
|
|
</html>
|