This commit is contained in:
2026-07-15 18:33:33 +09:00
parent 6b1583103f
commit f533082537
201 changed files with 19776 additions and 563 deletions
@@ -0,0 +1,77 @@
---
status: stable
page_id: A09_Security
related_pages: ["[[A09_Security/A09_frontend]]", "[[A06_Login/A06_backend]]", "[[A07_Register/A07_backend]]", "[[auth_rbac]]"]
last_updated: 2026-07-12
---
# A09_Security — Backend
마스터(회사관리자)·시스템관리자 보안/조직 관리 API + 활동 로그 기록. prefix `/api/security`.
## 파일 구조
| 파일 | 위치 | 역할 |
|---|---|---|
| `A09_Security_Router.py` | `A09_Security/A09_Security_Router.py:1-123` | 마스터/시스템관리자/활동로그 API |
| `A09_Security_Schema.py` | `A09_Security/A09_Security_Schema.py:1-25` | 요청 검증 Pydantic 모델 3종 |
## API 엔드포인트
### 마스터(회사 관리자) 전용 — `require_master`
| 엔드포인트 | 위치 | 역할 |
|---|---|---|
| `GET /api/security/master/dashboard` | `A09_Security/A09_Security_Router.py:28` | 마스터 대시보드(회사 기준) |
| `GET /api/security/master/members` | `A09_Security/A09_Security_Router.py:33` | 회사 팀원 목록 |
| `GET /api/security/master/join-requests` | `A09_Security/A09_Security_Router.py:38` | 가입 요청 목록 |
| `POST /api/security/master/join-requests/{id}/decision` | `A09_Security/A09_Security_Router.py:43` | 가입 승인/거부 + 결과 메일 발송 |
| `POST /api/security/master/members/{id}/remove` | `A09_Security/A09_Security_Router.py:59` | 팀원 비활성화(내보내기) |
### 시스템 관리자 전용 — `require_system_admin`
| 엔드포인트 | 위치 | 역할 |
|---|---|---|
| `GET /api/security/admin/dashboard` | `A09_Security/A09_Security_Router.py:86` | 시스템 대시보드 + psutil 리소스(cpu/memory/disk/process) |
| `GET /api/security/admin/{collection}` | `A09_Security/A09_Security_Router.py:101` | 컬렉션 목록(companies/users/support) |
| `PATCH /api/security/admin/{entity}/{id}/status` | `A09_Security/A09_Security_Router.py:110` | 엔티티 상태 변경(company/user/support) |
### 인증 사용자 공통 — `verify_session`
| 엔드포인트 | 위치 | 역할 |
|---|---|---|
| `POST /api/security/activity` | `A09_Security/A09_Security_Router.py:66` | 활동 로그 기록(202), `activity_logs` INSERT |
## 요청 스키마 (Pydantic)
| 모델 | 위치 | 필드 |
|---|---|---|
| `JoinDecisionRequest` | `A09_Security/A09_Security_Schema.py:8` | approved(bool), comment?(≤1000) |
| `AdminStatusRequest` | `A09_Security/A09_Security_Schema.py:13` | status(3~20), reason(1~500) |
| `ActivityLogRequest` | `A09_Security/A09_Security_Schema.py:18` | action_type(Literal 5종), resource_id?, status(SUCCESS/FAILURE), details(dict) |
- `action_type` Literal: FILE_UPLOAD, FILE_DOWNLOAD, PROJECT_SAVE, DATA_PROCESS, PAGE_VIEW
## DB 저장 (activity_logs)
`POST /activity`가 INSERT하는 컬럼: `user_id, action_type, resource_id, status, details(JSON)`
→ 테이블 정의 → [[db_schema/logs_monitoring]]
## 권한 헬퍼
- `require_master` — 회사 마스터(is_master) 권한
- `require_system_admin` — SYSTEM_ADMIN 역할
- `verify_session` — 로그인 세션
- 권한 체계 상세 → [[auth_rbac]]
## 의존성 (공통 유틸)
- [[common_util]] — `common_util_auth`(권한 데코레이터), `common_util_auth_repository`(마스터/관리자 조회·처리), `common_util_email`(가입 결과 메일)
- 외부 라이브러리: `psutil`(관리자 대시보드 리소스 계측) → [[dependencies]]
- DB → [[db_schema/logs_monitoring]](activity_logs), [[db_schema/users_auth]](join_requests/companies)
## 참고
- 이 백엔드 API는 마스터/시스템관리자용이나, **프론트(`A09_Security_UI_Page.ts`)는 약관 열람만 하고 이 API를 사용하지 않음**.
API 클라이언트(`A09_Security_Api_Fetch.ts`)는 정의만 되고 미연동 상태 → [[A09_Security/A09_frontend]] 참고
- B01_Dashboard의 관리자 기능과 역할이 겹칠 수 있음 (마스터 대시보드/멤버관리) — 향후 연동처 확인 필요
@@ -0,0 +1,78 @@
---
status: stable
page_id: A09_Security
related_pages: ["[[A09_Security/A09_backend]]", "[[A06_Login/A06_frontend]]", "[[auth_rbac]]"]
last_updated: 2026-07-12
---
# A09_Security — Frontend
보안·약관 열람 페이지. 이용약관/개인정보/세션 보안정책 텍스트를 버전과 함께 표시.
## 파일 구조
| 파일 | 위치 | 역할 |
|---|---|---|
| `A09_Security_UI_Page.ts` | `A09_Security/A09_Security_UI_Page.ts:1-30` | **실사용** 약관 열람 페이지 렌더링 |
| `A09_Security_Terms.ts` | `A09_Security/A09_Security_Terms.ts:1-16` | 약관 텍스트 데이터(한/영), 버전 상수 |
| `A09_Security_UI_Style.css` | `A09_Security/A09_Security_UI_Style.css:1-14` | 스타일 (theme.css 변수만 사용) |
| `A09_Security_Api_Fetch.ts` | `A09_Security/A09_Security_Api_Fetch.ts:1-61` | ⚠️ API 클라이언트 (정의만, **미사용** — 아래 참고) |
> ⚠️ **프론트/백엔드 기능 불일치**: `A09_Security_UI_Page.ts`는 약관 텍스트 열람만 하며
> `A09_Security_Api_Fetch.ts`를 import하지 않는다. API 클라이언트(마스터/관리자 8함수)는 정의만 되고
> 어디서도 사용되지 않음(grep 확인). 백엔드 API(`/api/security`)는 완비돼 있으나 프론트 연동 미완.
## 컴포넌트 / 함수
| 함수 | 위치 | 역할 |
|---|---|---|
| `renderA09Security(root)` | `A09_Security/A09_Security_UI_Page.ts:7` | 제목+버전+3개 약관 섹션 렌더 |
## 약관 데이터 (A09_Security_Terms.ts)
| 항목 | 위치 | 내용 |
|---|---|---|
| `SECURITY_TERMS_VERSION` | `A09_Security/A09_Security_Terms.ts:1` | 약관 버전 상수 `"1.0"` |
| `securityTerms.terms` | `A09_Security/A09_Security_Terms.ts:4` | 이용약관(한/영) |
| `securityTerms.privacy` | `A09_Security/A09_Security_Terms.ts:8` | 개인정보(한/영, "IP 미수집" 명시) |
| `securityTerms.security` | `A09_Security/A09_Security_Terms.ts:12` | 세션 보안정책(한/영) |
## API 클라이언트 함수 (⚠️ 미사용, 정의만)
| 함수 | 위치 | 대응 API |
|---|---|---|
| `getMasterDashboard()` | `A09_Security/A09_Security_Api_Fetch.ts:14` | `GET /security/master/dashboard` |
| `getMembers()` | `A09_Security/A09_Security_Api_Fetch.ts:18` | `GET /security/master/members` |
| `getJoinRequests()` | `A09_Security/A09_Security_Api_Fetch.ts:22` | `GET /security/master/join-requests` |
| `decideJoinRequest(id, approved, comment?)` | `A09_Security/A09_Security_Api_Fetch.ts:26` | `POST .../join-requests/{id}/decision` |
| `removeMember(userId)` | `A09_Security/A09_Security_Api_Fetch.ts:37` | `POST .../members/{id}/remove` |
| `getAdminDashboard()` | `A09_Security/A09_Security_Api_Fetch.ts:41` | `GET /security/admin/dashboard` |
| `getAdminCollection(collection)` | `A09_Security/A09_Security_Api_Fetch.ts:45` | `GET /security/admin/{collection}` |
| `updateAdminStatus(entity, id, status, reason)` | `A09_Security/A09_Security_Api_Fetch.ts:51` | `PATCH /security/admin/{entity}/{id}/status` |
## 로컬라이제이션
모든 텍스트는 [[ui_templates]]에서 로드. 하드코딩 금지.
| UI 요소 | 로케일 키 |
|---|---|
| 제목/버전 | `A09_Security_Title`, `A09_Security_Version` |
| 섹션 제목 | `A09_Security_Terms`, `A09_Security_Privacy`, `A09_Security_Policy` |
- 약관 본문은 로케일이 아닌 `A09_Security_Terms.ts`에 한/영 배열로 별도 관리(`[currentLanguageIndex]`로 선택)
## 스타일 (CSS)
- `.a09-security` — 문서 컨테이너(max-width 800px, surface 배경, border)
- `.a09-security section` — 섹션 간격(margin-top: spacing-32)
## ⚠️ 약관 텍스트와 실 코드 불일치
`securityTerms.security`는 "세션 12시간 또는 4시간 비활동 후 만료"로 안내하나,
A06 실 코드는 `auth_expires_at = NOW() + 3개월` 방식 → [[A06_Login/A06_backend]] 참고.
약관 텍스트도 [[auth_rbac]] 계획서 기준으로 작성됨 (실 정책 검증 후 갱신 필요).
## 의존성
- [[ui_templates]] — `ui_locales`, `currentLanguageIndex` (다국어)
- 백엔드 API(미연동) → [[A09_Security/A09_backend]]