구성도와 처리 흐름
이 데모가 무엇으로 이루어져 있고, 열람·인쇄·검증 때 요청과 응답이 어떻게 오가는지를 그림으로 둔 자리입니다. 현재 동작하는 흐름과 다음 판에서 바뀌는 흐름을 나눠 그렸습니다.
1. 구성
flowchart LR
subgraph demo["데모 서버"]
direction TB
NG["nginx 443"]
subgraph PROV["당사 판 (패키징 · 발급)"]
PK["Web-X 패키저
원본 PDF → .opens 컨테이너
열쇠 재료는 여기에만"]
LX["열람 라이선스 발급
만료 · 인쇄 · 워터마크"]
ST["지문 서명 · 인쇄용 사본"]
end
subgraph TEN["고객사 판 (자료실)"]
SH["회원 로그인 · 자료 목록"]
FI["컨테이너 배포 (누구나 받음, 열쇠 없음)"]
WV["웹뷰어 페이지"]
AD["관리 화면 · 진위 확인"]
end
NG --> TEN
NG --> PROV
TEN -- "발급 요청" --> LX
PK -. "컨테이너" .-> FI
end
BR["브라우저 웹뷰어
(pdf.js + client-js)"]
APP["앱뷰어 (Windows · macOS · Android · iOS)"]
SDK["오픈스 클라이언트 SDK"]
STRM["오픈스 서버
(EPUB 보관 · EPUB 라이선스)"]
BR --> NG
APP --> NG
APP --> SDK
APP -- "EPUB" --> STRM
컨테이너는 책 한 권에 하나, 라이선스는 열람하는 사람마다 열 때마다 발급됩니다. 컨테이너를 받아도 열쇠가 그 안에 없어 열리지 않습니다.
2. 패키징
sequenceDiagram participant T as 고객사 판 participant P as 당사 판 T->>P: 원본 PDF (contentId) P->>P: 표준 PDF 암호(AES-256)로 잠금, 열쇠 재료 보관 P->>P: 문서 지문 QR 찍기 (선택 · 원본 해시에 서명) P-->>T: .opens 컨테이너 T->>T: 자료실에 진열, 파일은 누구나 받을 수 있음
3. 웹뷰어 열람 현재
sequenceDiagram participant B as 브라우저 participant T as 고객사 판 participant P as 당사 판 B->>T: 자료 열기 (회원 ID) T->>P: 라이선스 발급 요청 (자료 · 회원 · 만료 · 인쇄 허용) P-->>T: 라이선스 (만료 시각 · 차단 옵션 · 워터마크 문구) T-->>B: 뷰어 페이지 (라이선스 포함) B->>B: 만료면 차단 화면, 아니면 우클릭 · 복사 · 저장 차단 B->>T: 암호화된 PDF 본문 (구간 요청) B->>B: 해제 · 렌더 · 워터마크 (회원 ID · 시각 · IP)
4. 인쇄 현재
sequenceDiagram
participant B as 브라우저
participant T as 고객사 판
participant P as 당사 판
B->>T: 인쇄 요청 (자료 · 회원)
T->>T: 자료 인쇄 허용? 회원 남은 횟수? 차감
alt 브라우저 인쇄
T->>P: 인쇄 허용 라이선스 발급
P-->>B: 인쇄 차단이 빠진 라이선스
B->>B: 새 창에서 인쇄
else 인쇄용 PDF
T->>P: 원본 + 회원 → 사본 만들기
P->>P: 발급 지문 QR (발급번호 · 회원 · 시각에 서명) + 열람자 표시
P-->>B: 사본 PDF (발급 대장에 사본 해시 기록)
end
횟수는 고객사 판이 세고, 인쇄할 때마다 라이선스를 새로 받습니다. 인쇄용 PDF 는 사본마다 다른 발급번호와 QR 이 찍힙니다.
5. 진위 확인
sequenceDiagram participant U as 확인하는 사람 participant T as 고객사 판 participant P as 당사 판 U->>T: QR 을 찍음 (발급번호 + 서명 / 문서 id + 해시 + 서명) T->>P: 서명 검증 · 발급 대장 조회 P-->>T: 유효 여부 · 자료 · 열람자 · 발급 시각 · 원본 해시 · 사본 해시 T-->>U: 결과 화면 U->>U: 받은 PDF 파일을 고르면 브라우저가 SHA-256 을 재어 사본 해시와 대조 (파일은 안 올라감)
문서 지문은 "우리가 패키징한 그 문서인가", 발급 지문은 "이 사본이 누구에게 언제 발급된 것인가" 에 답합니다. 서명은 당사 판의 키로만 만들 수 있고 공개키로 누구나 검증할 수 있습니다.
6. 앱뷰어 EPUB 현재
sequenceDiagram participant A as 앱뷰어 participant S as 오픈스 서버 participant K as 오픈스 SDK A->>K: 활성화 (기기 등록) A->>S: 책 받기 A->>S: 라이선스 요청 (기기 ID · 기기 인증서) S-->>A: 기기 라이선스 A->>K: 열기 (서명 · 체인 · 만료 · 기기 바인딩 검사) K-->>A: 만료면 "이용 기한이 지났습니다", 아니면 본문
7. 앱뷰어 PDF 현재 → 다음 판
sequenceDiagram participant A as 앱뷰어 participant T as 고객사 판 participant P as 당사 판 participant K as 오픈스 SDK Note over A,P: 현재 · 앱이 열쇠를 받아 자체 PDF 뷰어로 엶 (만료 자료는 서버가 열쇠를 안 줌) A->>T: 매니페스트 요청 (자료 · 회원) T->>P: 라이선스 발급 P-->>T: 라이선스 + 열쇠 T-->>A: 매니페스트 (본문 주소 · 열쇠) A->>A: 앱 안 PDF 뷰어가 해제 · 렌더 Note over A,K: 다음 판 · SDK 가 라이선스를 검사하고 해제 (앱은 열쇠를 모름) A->>T: .opens 컨테이너 받기 A->>P: 라이선스 요청 (기기 ID · 기기 인증서 · 회원) P-->>A: 기기 라이선스 (열쇠는 기기 공개키로 감쌈 · 만료 · 인쇄 권한) A->>K: 라이선스 넣기 → 열기 (서명 · 체인 · 만료 · 기기 바인딩) K-->>A: 구간 단위 본문 (앱은 열쇠도 평문 파일도 모름) A->>K: 인쇄 전 권한 확인