docs:E-Sign 기술 스택 문서 업데이트 (실제 구현 반영)
- FPDI/FPDF → FPDI/TCPDF (PDF 서명 합성, MNG PdfSignatureService) - DOCX→PDF 변환 추가 (LibreOffice headless, MNG DocxToPdfConverter) - GD 확장, 나눔 폰트, Lucide 아이콘 등 실제 사용 기술 반영 - 4개 문서 일괄 업데이트 (technical-design, implementation-guide, operations-guide, changelog) Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
@@ -18,7 +18,8 @@ API 프로젝트에 백엔드 로직(모델, 서비스, 컨트롤러, 라우트)
|
||||
|------|------|
|
||||
| 데이터베이스 | 마이그레이션 4개 (esign_ 접두사 테이블) |
|
||||
| 모델 | 4개 (EsignContract, EsignSigner, EsignSignField, EsignAuditLog) |
|
||||
| 서비스 | 4개 (Contract, Sign, Pdf, Audit) |
|
||||
| API 서비스 | 4개 (Contract, Sign, Pdf, Audit) |
|
||||
| MNG 서비스 | 2개 (DocxToPdfConverter, PdfSignatureService) |
|
||||
| API 컨트롤러 | 2개 (Contract 10엔드포인트, Sign 6엔드포인트) |
|
||||
| FormRequest | 4개 (Store, FieldConfigure, SignSubmit, SignReject) |
|
||||
| 메일 | 1개 (EsignRequestMail) |
|
||||
@@ -86,6 +87,10 @@ app/Http/Controllers/ESign/
|
||||
├── EsignController.php # 인증 필요 (5개 메서드)
|
||||
└── EsignPublicController.php # 비인증 (3개 메서드)
|
||||
|
||||
app/Services/ESign/
|
||||
├── DocxToPdfConverter.php # DOCX→PDF 변환 (LibreOffice headless)
|
||||
└── PdfSignatureService.php # PDF 서명 합성 (FPDI/TCPDF)
|
||||
|
||||
resources/views/esign/
|
||||
├── dashboard.blade.php # 대시보드 (통계 + 목록)
|
||||
├── create.blade.php # 계약 생성 (PDF 업로드)
|
||||
@@ -349,16 +354,46 @@ signer() → BelongsTo(EsignSigner)
|
||||
- 최대 5회 시도 (`otp_attempts`)
|
||||
- 초과 시 토큰 무효화
|
||||
|
||||
### 5.3 EsignPdfService
|
||||
### 5.3 EsignPdfService (API)
|
||||
|
||||
**파일**: `app/Services/ESign/EsignPdfService.php`
|
||||
**파일**: `api/app/Services/ESign/EsignPdfService.php`
|
||||
|
||||
| 메서드 | 설명 | 상태 |
|
||||
|--------|------|------|
|
||||
| `generateHash(string $filePath)` | SHA-256 해시 생성 | 구현 완료 |
|
||||
| `verifyIntegrity(string $filePath, string $expectedHash)` | 해시 비교 검증 (hash_equals) | 구현 완료 |
|
||||
| `composeSigned(...)` | 원본 PDF + 서명 이미지 합성 | 스텁 (FPDI 추후) |
|
||||
| `addAuditPage(...)` | 감사 증적 페이지 추가 | 스텁 (FPDI 추후) |
|
||||
| `composeSigned(...)` | 원본 PDF + 서명 이미지 합성 | 스텁 (MNG로 이관) |
|
||||
| `addAuditPage(...)` | 감사 증적 페이지 추가 | 스텁 (추후) |
|
||||
|
||||
### 5.5 DocxToPdfConverter (MNG)
|
||||
|
||||
**파일**: `mng/app/Services/ESign/DocxToPdfConverter.php`
|
||||
**의존성**: LibreOffice (headless), 나눔 폰트
|
||||
|
||||
| 메서드 | 설명 | 상태 |
|
||||
|--------|------|------|
|
||||
| `convertAndStore(UploadedFile $file)` | DOCX/DOC 파일을 LibreOffice로 PDF 변환 후 저장 | 구현 완료 |
|
||||
|
||||
**동작 방식**:
|
||||
- Word 파일(.doc, .docx) 업로드 시 자동 감지
|
||||
- `libreoffice --headless --convert-to pdf` 명령으로 변환
|
||||
- 나눔 폰트로 한글 정상 렌더링 지원
|
||||
- 변환된 PDF를 `storage/app/private/esign/{tenant_id}/originals/` 에 저장
|
||||
|
||||
### 5.6 PdfSignatureService (MNG)
|
||||
|
||||
**파일**: `mng/app/Services/ESign/PdfSignatureService.php`
|
||||
**의존성**: FPDI, TCPDF, GD 확장
|
||||
|
||||
| 메서드 | 설명 | 상태 |
|
||||
|--------|------|------|
|
||||
| `mergeSignatures(EsignContract $contract)` | 원본 PDF에 모든 서명 이미지 오버레이 합성 | 구현 완료 |
|
||||
|
||||
**동작 방식**:
|
||||
- FPDI로 원본 PDF 임포트
|
||||
- 서명 필드를 페이지별로 그룹핑
|
||||
- 필드 타입별 렌더링: signature/stamp(이미지), date(텍스트), text(텍스트), checkbox(체크마크)
|
||||
- 서명된 PDF를 `storage/app/private/esign/{tenant_id}/signed/` 에 저장
|
||||
|
||||
### 5.4 EsignAuditService
|
||||
|
||||
@@ -691,6 +726,8 @@ NOTIFIED/AUTHENTICATED → REJECTED (거절)
|
||||
| React 하이브리드 | `views/finance/journal-entries.blade.php` | CDN React + Babel 패턴 참고 |
|
||||
| HX-Redirect | 컨트롤러 패턴 | HTMX 부분 로드 시 전체 리로드 |
|
||||
| SidebarMenu | `app/Services/SidebarMenuService.php` | DB 기반 메뉴 |
|
||||
| DOCX→PDF | `app/Services/ESign/DocxToPdfConverter.php` | LibreOffice headless 변환 |
|
||||
| PDF 서명 합성 | `app/Services/ESign/PdfSignatureService.php` | FPDI/TCPDF 서명 오버레이 |
|
||||
|
||||
---
|
||||
|
||||
@@ -698,13 +735,15 @@ NOTIFIED/AUTHENTICATED → REJECTED (거절)
|
||||
|
||||
| 항목 | 우선순위 | 설명 |
|
||||
|------|---------|------|
|
||||
| PDF 합성 (FPDI) | 높음 | 원본 PDF에 서명 이미지 오버레이 |
|
||||
| ~~PDF 합성 (FPDI)~~ | ~~높음~~ | ~~원본 PDF에 서명 이미지 오버레이~~ → **구현 완료** (MNG PdfSignatureService) |
|
||||
| ~~DOCX→PDF 변환~~ | ~~높음~~ | ~~Word 문서 지원~~ → **구현 완료** (MNG DocxToPdfConverter + LibreOffice) |
|
||||
| 감사 증적 페이지 | 높음 | 완료 PDF 마지막에 감사 정보 페이지 추가 |
|
||||
| 파일 암호화 (AES-256) | 중간 | 원본 PDF 암호화 저장 |
|
||||
| 만료 자동 처리 | 중간 | 스케줄러로 expires_at 초과 계약 expired 처리 |
|
||||
| 리마인더 자동 발송 | 낮음 | 만료 3일 전 자동 리마인드 |
|
||||
| SMS OTP | 낮음 | 이메일 외 SMS 인증 지원 |
|
||||
| OTP bcrypt 해싱 | 중간 | 현재 평문 저장 → bcrypt 해싱 |
|
||||
| PDF 서명 텍스트 한글 | 낮음 | TCPDF CJK 폰트 추가 (현재 helvetica만 사용) |
|
||||
|
||||
---
|
||||
|
||||
|
||||
Reference in New Issue
Block a user