feat: SSO 쿠키 인증 통합 + 서브도메인 라우팅 아키텍처
- Path-based 라우팅을 서브도메인 기반으로 전환 (tkfb/tkreport/tkqc.technicalkorea.net) - 3개 시스템 프론트엔드에 SSO 쿠키 인증 통합 (domain=.technicalkorea.net, localStorage 폴백) - Gateway: 포털+로그인+System1 프록시, 쿠키 SSO 설정 - System 1: 토큰키 통일, nginx.conf 생성, 신고페이지 리다이렉트 - System 2: api-base.js/app-init.js 생성, getSSOToken() 통합 - System 3: TokenManager 쿠키 지원, 중앙 로그인 리다이렉트 - docker-compose.yml에 cloudflared 서비스 추가 - DEPLOY-GUIDE.md 배포 가이드 작성 Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
93
PROGRESS.md
93
PROGRESS.md
@@ -1,6 +1,6 @@
|
||||
# TK 공장관리 3-System 분리 및 통합 - 진행 상황
|
||||
|
||||
> 최종 업데이트: 2026-02-06
|
||||
> 최종 업데이트: 2026-02-09
|
||||
|
||||
---
|
||||
|
||||
@@ -86,8 +86,16 @@ TK-FB-Project(공장관리+신고)와 M-Project(부적합관리)를 **3개 독
|
||||
#### System 1 - 공장관리
|
||||
- [x] TK-FB-Project에서 복사 (api, web, fastapi-bridge)
|
||||
- [x] `config/routes.js`에서 workIssue 라우트 제거
|
||||
- [ ] **auth 미들웨어 → SSO JWT 시크릿으로 변경 미완료**
|
||||
- [ ] **신고 관련 프론트엔드 페이지 제거 미완료** (System 2로 리다이렉트 추가 필요)
|
||||
- [x] auth 미들웨어 SSO JWT 시크릿 연동 (백엔드: JWT_SECRET=SSO_JWT_SECRET 이미 설정)
|
||||
- [x] 프론트엔드 토큰 키 통일 (`token`/`user` → `sso_token`/`sso_user`, 52개 파일 변경)
|
||||
- [x] SSO 쿠키 기반 인증 통합 (api-base.js, app-init.js, auth-check.js, auth.js)
|
||||
- `window.getSSOToken()`, `window.getSSOUser()`, `window.getLoginUrl()` 글로벌 함수
|
||||
- 쿠키 `sso_token` 우선 → localStorage `sso_token` 폴백
|
||||
- [x] nginx.conf 생성 (API, uploads, FastAPI 프록시)
|
||||
- [x] 신고 관련 프론트엔드 페이지 → System 2로 서브도메인 리다이렉트
|
||||
- `issue-report.html`, `issue-detail.html`, `report-status.html` → 동적 서브도메인 리다이렉트
|
||||
- `sidebar-nav.html` 크로스시스템 링크 → `data-system` 속성 + JS 동적 해석
|
||||
- [x] 로그인 플로우: 인증 없으면 중앙 로그인 (`tkfb.technicalkorea.net/login`)으로 리다이렉트
|
||||
- [ ] **실제 테스트 미완료**
|
||||
|
||||
#### System 2 - 신고
|
||||
@@ -97,7 +105,10 @@ TK-FB-Project(공장관리+신고)와 M-Project(부적합관리)를 **3개 독
|
||||
- `imageUploadService.js`, `dateUtils.js`, `logger.js`, `errors.js`
|
||||
- [x] 독립 Express 서버 구성 (index.js, package.json, Dockerfile)
|
||||
- [x] 프론트엔드 페이지 복사 (issue-report, issue-detail, report-status)
|
||||
- [ ] **auth 미들웨어 → SSO JWT 시크릿으로 변경 미완료**
|
||||
- [x] auth 미들웨어 SSO JWT 시크릿 연동 (백엔드: JWT_SECRET=SSO_JWT_SECRET 이미 설정)
|
||||
- [x] 프론트엔드 인프라 구축: `api-base.js`, `app-init.js` 신규 생성
|
||||
- [x] SSO 쿠키 기반 인증 통합 (쿠키 우선, localStorage 폴백, 중앙 로그인 리다이렉트)
|
||||
- [x] 인라인 JS 토큰 읽기 → `window.getSSOToken()` 폴백 패턴 적용 (28곳)
|
||||
- [ ] **M-Project(TKQC) 연동 실제 테스트 미완료**
|
||||
- [ ] **실제 테스트 미완료**
|
||||
|
||||
@@ -105,16 +116,33 @@ TK-FB-Project(공장관리+신고)와 M-Project(부적합관리)를 **3개 독
|
||||
- [x] M-Project에서 복사 (api, web)
|
||||
- [x] `auth_service.py` → bcrypt + pbkdf2 이중 지원 코드 추가
|
||||
- [x] `requirements.txt`에 bcrypt 추가
|
||||
- [x] SSO JWT 연동: `verify_token()` 전체 payload 반환, DB에 없는 SSO 유저 임시 객체 생성
|
||||
- [x] SSO 쿠키 기반 인증 통합 (api.js, auth-manager.js, app.js, common-header.js)
|
||||
- `_cookieGet('sso_token')` 우선 → localStorage 폴백
|
||||
- 인증 실패 시 중앙 로그인 리다이렉트
|
||||
- [x] 인라인 JS `localStorage.getItem('access_token')` → `TokenManager.getToken()` 일괄 치환 (9개 HTML, 81곳)
|
||||
- [ ] **SSO JWT 시크릿 연동 실제 테스트 미완료**
|
||||
|
||||
### Phase 4: Gateway 포털 - 로컬 코드 작성 ✅ 완료
|
||||
### Phase 4: Gateway + 서브도메인 라우팅 ✅ 코드 완료
|
||||
|
||||
- [x] `gateway/nginx.conf` - Path-based 라우팅 설정
|
||||
- `/factory/` → System 1, `/report/` → System 2, `/nc/` → System 3
|
||||
- [x] `gateway/html/portal.html` - 통합 포털 메인 페이지
|
||||
- [x] `gateway/html/login.html` - SSO 로그인 페이지
|
||||
- [x] `gateway/html/shared/nav-header.js` - 시스템 간 공유 네비게이션
|
||||
> **아키텍처 변경**: Path-based(`/factory/`, `/report/`, `/nc/`) → **서브도메인 기반** 라우팅으로 전환.
|
||||
>
|
||||
> **이유**: 프론트엔드 JS가 root-relative URL (`/api/...`, `/pages/...`)을 사용하므로 경로 기반 라우팅이 근본적으로 불가능.
|
||||
>
|
||||
> **해결**: 각 시스템에 독립 서브도메인을 부여하고, SSO 쿠키(`domain=.technicalkorea.net`)로 인증 공유.
|
||||
|
||||
- [x] `gateway/nginx.conf` - **서브도메인 기반 라우팅**
|
||||
- `tkfb.technicalkorea.net` → Gateway (포털/로그인) + System 1 프록시
|
||||
- `tkreport.technicalkorea.net` → System 2 (Cloudflare Tunnel 직접)
|
||||
- `tkqc.technicalkorea.net` → System 3 (Cloudflare Tunnel 직접)
|
||||
- [x] `gateway/html/portal.html` - 서브도메인 기반 시스템 카드 링크
|
||||
- [x] `gateway/html/login.html` - SSO 쿠키 설정 (`domain=.technicalkorea.net`, 7일 만료)
|
||||
- 로그인 성공 → 쿠키 + localStorage 이중 저장, `?redirect=` 파라미터 지원
|
||||
- [x] `gateway/html/shared/nav-header.js` - SSOAuth 글로벌 객체 (쿠키 우선)
|
||||
- [x] `gateway/Dockerfile`
|
||||
- [x] `system1-factory/web/nginx.conf` 신규 생성 (API/uploads/FastAPI 프록시)
|
||||
- [x] `docker-compose.yml`에 cloudflared 서비스 추가
|
||||
- [ ] **Cloudflare Tunnel 서브도메인 설정** (사용자 대시보드 작업)
|
||||
- [ ] **실제 배포 및 테스트 미완료**
|
||||
|
||||
### Phase 5: 마이그레이션 스크립트 - 로컬 코드 작성 ✅ 완료
|
||||
@@ -129,11 +157,15 @@ TK-FB-Project(공장관리+신고)와 M-Project(부적합관리)를 **3개 독
|
||||
|
||||
- [ ] 전체 백업 (MariaDB, PostgreSQL, uploads, git)
|
||||
- [ ] tk-factory-services를 NAS로 전송
|
||||
- [ ] .env 파일 생성 (NAS 기존 DB 패스워드 등 수집)
|
||||
- [ ] 기존 TK-FB 중지 + TKQC 중지
|
||||
- [ ] 통합 docker-compose.yml로 전체 서비스 기동
|
||||
- [ ] SSO 유저 마이그레이션 실행
|
||||
- [ ] 전체 서비스 헬스체크
|
||||
- [ ] Cloudflare Tunnel 설정 업데이트 (포트 변경)
|
||||
- [ ] Cloudflare Tunnel 서브도메인 설정 업데이트:
|
||||
- `tkfb.technicalkorea.net` → `http://tk-gateway:80`
|
||||
- `tkreport.technicalkorea.net` → `http://tk-system2-web:80`
|
||||
- `tkqc.technicalkorea.net` → `http://tk-system3-web:80`
|
||||
|
||||
### Phase 7: 테스트 및 Go-Live ❌ 미착수
|
||||
|
||||
@@ -153,13 +185,13 @@ TK-FB-Project(공장관리+신고)와 M-Project(부적합관리)를 **3개 독
|
||||
| Phase 0: TKQC NAS 배포 | ✅ 거의 완료 | 95% (CF 대시보드 URL 변경만 남음) |
|
||||
| Phase 1: 디렉토리 구조 | ✅ 완료 | 100% |
|
||||
| Phase 2: SSO 코드 작성 | ✅ 코드 완료 | 70% (코드만 완료, 테스트/배포 미완) |
|
||||
| Phase 3: 시스템 분리 코드 | ✅ 코드 완료 | 60% (코드 완료, auth 연동/테스트 미완) |
|
||||
| Phase 4: Gateway 코드 | ✅ 코드 완료 | 70% (코드만 완료, 배포/테스트 미완) |
|
||||
| Phase 3: 시스템 분리 + SSO 쿠키 통합 | ✅ 코드 완료 | 80% (코드+프론트엔드 SSO 완료, 실제 테스트 미완) |
|
||||
| Phase 4: Gateway + 서브도메인 라우팅 | ✅ 코드 완료 | 80% (코드 완료, CF Tunnel 설정/테스트 미완) |
|
||||
| Phase 5: 스크립트 | ✅ 코드 완료 | 50% (코드만 완료, 실행 미완) |
|
||||
| Phase 6: NAS 통합 배포 | ❌ 미착수 | 0% |
|
||||
| Phase 7: 테스트/Go-Live | ❌ 미착수 | 0% |
|
||||
|
||||
**전체 진행률: 약 45%** (코드 작성 완료, 실제 통합/배포/테스트 남음)
|
||||
**전체 진행률: 약 55%** (코드 작성 + SSO 프론트엔드 통합 완료, NAS 배포/테스트 남음)
|
||||
|
||||
---
|
||||
|
||||
@@ -199,12 +231,33 @@ TK-FB-Project(공장관리+신고)와 M-Project(부적합관리)를 **3개 독
|
||||
|
||||
## 다음에 할 일 (우선순위)
|
||||
|
||||
1. **Cloudflare 대시보드에서 tkqc 서비스 URL 변경** (사용자 작업)
|
||||
- `http://m-project-nginx:80` → `http://tkqc-nginx:80`
|
||||
2. **tkqc.technicalkorea.net 접속 테스트**
|
||||
3. **Phase 3 마무리**: auth 미들웨어 SSO 연동 코드 완성
|
||||
4. **Phase 6**: NAS 통합 배포 시작
|
||||
5. **Phase 7**: 전체 테스트
|
||||
1. **NAS 접속 확인** (현재 LAN/Tailscale 모두 타임아웃)
|
||||
2. **.env 파일 생성** - NAS에서 기존 DB 패스워드 등 수집
|
||||
3. **Phase 6: NAS 통합 배포**
|
||||
- 전체 백업 → 프로젝트 전송 → docker-compose up
|
||||
4. **Cloudflare Tunnel 서브도메인 설정** (사용자 대시보드 작업)
|
||||
- `tkfb.technicalkorea.net` → `http://tk-gateway:80`
|
||||
- `tkreport.technicalkorea.net` → `http://tk-system2-web:80`
|
||||
- `tkqc.technicalkorea.net` → `http://tk-system3-web:80`
|
||||
5. **Phase 7**: 전체 SSO 로그인/시스템 간 이동 테스트
|
||||
|
||||
---
|
||||
|
||||
## 아키텍처 변경 이력
|
||||
|
||||
### 2026-02-09: Path-based → 서브도메인 기반 라우팅
|
||||
|
||||
**문제**: Gateway에서 `/factory/`, `/report/`, `/nc/` 경로 기반 라우팅 시, 프론트엔드 JS가 root-relative URL (`fetch('/api/...')`, `<a href="/pages/...">`)을 사용하여 경로 프리픽스 없이 요청 → 라우팅 불가.
|
||||
|
||||
**해결**: 서브도메인 기반 라우팅 + 쿠키 기반 SSO
|
||||
|
||||
| 서브도메인 | Cloudflare Tunnel 대상 | 시스템 |
|
||||
|-----------|----------------------|--------|
|
||||
| `tkfb.technicalkorea.net` | `http://tk-gateway:80` | 포털 + System 1 (프록시) |
|
||||
| `tkreport.technicalkorea.net` | `http://tk-system2-web:80` | System 2 |
|
||||
| `tkqc.technicalkorea.net` | `http://tk-system3-web:80` | System 3 |
|
||||
|
||||
**SSO 쿠키 전략**: `sso_token`, `sso_user` 쿠키를 `domain=.technicalkorea.net`으로 설정하여 서브도메인 간 공유. localStorage는 폴백용으로 유지 (개발 환경 및 하위호환).
|
||||
|
||||
---
|
||||
|
||||
|
||||
Reference in New Issue
Block a user