크라우니엔터프라이즈 멀티테넌시 격리 강화 (2026-06-14)
개요
5000명 전사 배치 시 회사코드 누락 = 타사 데이터 조회 가능 취약점 차단.
서버.한선 + proxy.js 두 레이어에 회사코드 강제 격리 적용.
무엇을 했는지
서버.한선 변경사항
_토큰회사DB 맵 추가 — 토큰→회사코드 1:1 바인딩 저장소
토큰생성(사용자ID, 회사코드) — 회사코드를 토큰에 바인딩
토큰회사(토큰) 새 함수 — 토큰의 회사코드 반환
/api/auth/login — company 필드 필수화, 없으면 400
요청처리() 내 격리 가드 추가:
- 인증된 요청 +
/api/ 경로 → X-Company-Code 헤더 검증
- 토큰 회사코드 vs 요청 X-Company-Code 불일치 → 403 차단
- 쓰기(POST/PUT/DELETE)에서 X-Company-Code 누락 → 403 차단
proxy.js 변경사항
proxyToHanseon() — companyCode 파라미터 추가, X-Company-Code 헤더 주입
proxyWithRetry() — companyCode 전달
extractCompanyFromJwt() 새 함수 — JWT payload에서 company 추출
enforceCompanyIsolation() 새 함수 — ERP 라우트 감지 + 회사코드 불일치 403
- 메인 핸들러 — 프록시 전 격리 체크 + companyCode 주입
관련 파일
/Users/ef/crowny-enterprise/서버.한선 — 메인 한선씨 서버 (3159줄)
/Users/ef/crowny-enterprise/proxy.js — Node.js 프록시 (1641줄)
/Users/ef/crowny-enterprise/격리강화.한선 — RPN 정본 동반 파일
검증 결과 (포트 19701 테스트)
| 테스트 | 기대 | 결과 |
|---|
| company 없이 로그인 | 400 | 400 PASS |
| company 포함 로그인 | 200 + token | 200 PASS |
| 동일회사 GET | 200 | 200 PASS |
| 교차회사 GET (토큰A → 회사B) | 403 | 403 PASS |
| 쓰기 X-Company-Code 누락 | 403 | 403 PASS |
| 교차회사 쓰기 | 403 | 403 PASS |
잔여 이슈
- 실배포는 라이브 9701/9700 세션(게이트웨이 세션)이 담당
- 클라이언트(web/index.html)는 로그인 시 company 필드 주입 필요
- 기존
admin-demo-token은 company=crowny 바인딩됨 (데모용)
- 셀코어 init OOB 에러는 기존 pre-existing, 이번 작업 무관