# 개인정보 노출진단 보고서 시스템

## 파일 구조

```
c:/server/apache24/htdocs/
├── mysql_compat.php              # mysql_* → mysqli_* 호환 래퍼 (PHP 7/8 대응)
└── views/
    └── report/
        ├── report.php            # 메인 보고서 페이지 ★
        ├── report-agent.php      # 에이전트 보고서
        ├── report-pc-scan.php    # PC 스캔 보고서
        ├── report-server-scan.php# 서버 스캔 보고서
        ├── config.php            # DB 접속 정보 및 서버 설정
        ├── db_conn.php           # DB 연결 (mysql_compat.php 사용)
        ├── db_character_set.php  # MySQL UTF-8 문자셋 설정
        ├── controller/
        │   └── ReportController.js   # AngularJS 컨트롤러
        ├── service/
        │   └── ReportService.js      # AngularJS 서비스 (API 호출)
        ├── css/
        │   └── style.css             # (구버전 절대좌표 스타일, 현재 미사용)
        └── images/
            ├── print.png             # 프린트 버튼 아이콘
            ├── logo.png              # 표지 로고 ★ (없으면 숨김 처리됨)
            ├── l9_icon.png           # 제품 아이콘
            ├── e2em_icon*.png        # 제품 아이콘 (16/32/192px)
            ├── mag_ux_icon*.png      # 제품 아이콘 (16/32/192px)
            ├── loading.gif           # 로딩 애니메이션
            ├── calendar.png          # 날짜 선택 아이콘
            ├── next/prev*.png        # 페이지 이동 아이콘
            └── good/bad_*.png        # 증감 상태 아이콘
```

---

## 실행 환경

| 항목 | 내용 |
|------|------|
| 웹서버 | Apache 2.4 |
| 언어 | PHP 8.x |
| DB | MySQL (proshield 데이터베이스) |
| 프론트엔드 | AngularJS 1.7.8 + DevExtreme |
| OS | Windows (개발), Linux (운영 가능) |

---

## DB 연결 구조

```
report.php
  └─ mysql_compat.php   ← mysql_connect() 등 구버전 함수 → mysqli_* 로 변환
```

**접속 정보** (`config.php` / 각 함수 내 직접 설정):
```
host     : localhost
database : proshield
user     : root
password : admin01
```

**주요 테이블:**
| 테이블 | 용도 |
|--------|------|
| `T_CLIENT` | 클라이언트(에이전트) 목록, 전체 스캔 수 |
| `checktable` | 개인정보 검출 결과 (ssn, acn, brn, hpn 등) |

---

## report.php 구조

### PHP 섹션 (줄 1~394)

| 함수/변수 | 설명 |
|-----------|------|
| `$totalScannedCount` | T_CLIENT 전체 검사 파일 수 |
| `$totalFilteredCount` | checktable 검출 파일 수 |
| `$totalFilteredPercent` | 검출률 (%) |
| `$beginDate` / `$endDate` | 검사 기간 |
| `$k_o` | 날짜 선택 URL 파라미터 |
| `makeNewPage()` | (구버전 함수, 현재 미호출) |
| `getAllSystem()` | (구버전 함수, 현재 미호출) |
| `getTop10System("756")` | **Top 10 도메인 테이블 출력** ★ |
| `getTodayDate()` | 오늘 날짜 출력 (yyyy년 mm월 dd일) |
| `getReportStartDate()` | 검사 시작일 출력 |
| `getReportEndDate()` | 검사 종료일 출력 |

### getTop10System() 출력 컬럼 (13열)

| 열 | DB 컬럼 | 설명 |
|----|---------|------|
| 1 | domain | 도메인/IP (@ 앞 부분만) |
| 2 | ssn | 주민등록번호 |
| 3 | brn | 사업자번호 |
| 4 | acn | 계좌번호 |
| 5 | hpn | 건강보험번호 |
| 6 | sid | SID |
| 7 | cdn | 신용카드번호 |
| 8 | email | 이메일 |
| 9 | xwd | 운전면허 |
| 10 | yuri | 여권 |
| 11 | mailto | Mailto |
| 12 | pwd | 비밀번호 |
| 13 | ret | 합계 |

**부수 효과 (전역변수 세팅):**
- `$total_mail_users` : 검출된 도메인 수
- `$top1_ip` : 1위 도메인
- `$top1_ssn` / `$top1_xwd` / `$top1_yuri` : 1위 주민번호/운전면허/여권 수
- `$top5_ip` : 상위 5개 도메인 목록
- `$top6_ip` : 6위 이하 도메인 목록

---

### HTML 섹션 (줄 395~끝) — 9페이지 구성

| 페이지 | 제목 | 주요 내용 |
|--------|------|-----------|
| 표지 | 개인정보 노출진단 보고서 | `getTodayDate()`, 로고 |
| 1 | 제1장 개요 | 점검일, 검사기간, 진단유형, `{{retTotal}}` |
| 2 | 제2절 진단 대상 서버 | `{{serverIp}}` 목록, 기대효과 |
| 3 | 제2장 진단 결과 | `itChart`, `gbdtChart` (DevExtreme) |
| 4 | 유형별 검출 현황 | `{{itCountList}}`, `{{ssnNumDomain}}`, `{{maxTypeName}}` |
| 5 | Top 10 서버 현황 | `gbdtChart2`, `getTop10System("756")` |
| 6 | 요약 통계 | `$total_mail_users`, `$top1_ip`, `$top1_ssn` 등 |
| 7 | 시간대별 분석 | `gbwaChart`, `{{gbwaSumText}}` 등 |
| 8 | 시간대별 차트 | `gbhcChart`, `{{gbhtSsnText}}` 등 |
| 9 | 총평 | `<?=$totalScannedCount?>`, `<?=$totalFilteredCount?>`, `{{retTotal}}` |

---

## 프론트엔드 의존성

### 외부 라이브러리 (서버 내 `/resources/`)

| 라이브러리 | 버전 | 용도 |
|------------|------|------|
| jQuery | 3.1.1 | DOM 조작, datepicker |
| jQuery UI | - | 날짜 선택기 |
| AngularJS | 1.7.8 | SPA 프레임워크 |
| ngStorage | - | localStorage 연동 |
| angular-sanitize | 1.7.8 | HTML 바인딩 |
| DevExtreme (dx.all.js) | - | 차트 (`dx-chart` 디렉티브) |
| Underscore.js | 1.8.3 | 유틸리티 |
| Moment.js | - | 날짜 처리 |

### 커스텀 파일

| 파일 | 역할 |
|------|------|
| `ReportController.js` | 스코프 변수 초기화, 차트 옵션 설정, API 데이터 바인딩 |
| `ReportService.js` | 백엔드 API 호출 래퍼 |
| `/resources/dist/js/angular/dev.js` | 앱 모듈 정의 (`angular.module('basic', ...)`) |
| `/resources/dist/js/basicCommon.js` | 공통 유틸 |
| `/resources/dist/js/angular/directive/basicCommon.js` | 공통 디렉티브 |

---

## API 엔드포인트 (ReportService.js)

| 함수 | URL | 설명 |
|------|-----|------|
| `gbdcStats` | `/api/ReportServiceImpl.php?flag=gbdcStats` | 진단 유형별 통계 |
| `gbhcStats` | `/api/ReportServiceImpl.php?flag=gbhcStats` | 시간대별 통계 |
| `gbwcStats` | `/api/ReportServiceImpl.php?flag=gbwcStats` | 요일/시간대별 통계 |
| `scanStats` | `/api/cc/gbsc/{beginDate}/{endDate}/{mode}` | 스캔 통계 |
| `resourceMonitor` | `/api/cs/ss/{hostname}/{linkParam}` | 리소스 모니터 |

---

## CSS / 프린트 설정

`report.php` 내 `<style>` 블록:

```css
@page { size: A4; margin: 15mm 15mm 20mm 15mm; }
.page { width: 180mm; min-height: 247mm; page-break-after: always; }
@media print { .no-print { display: none; } }
```

- 브라우저에서 열면 각 `.page` div가 스크롤로 이어서 보임
- 프린트(또는 PDF 저장) 시 A4 용지 기준 자동 페이지 분리

---

## 알려진 제약 사항

1. **mysql_compat.php 필수**: PHP 8에서 `mysql_*` 함수가 제거되었으므로 반드시 포함되어야 함
2. **logo.png 없을 경우**: 표지 로고 영역 자동 숨김 (`onerror="this.style.display='none'"`)
3. **`getAllSystem()` / `makeNewPage()` 함수**: 파일 내 존재하지만 현재 HTML에서 미호출 (구버전 절대좌표 방식 잔재)
4. **`$startDateTime` / `$endDateTime` 전역변수**: `getTop10System()` 내부에서 사용 — PHP 상단에서 반드시 설정되어야 함
