Enterprise 에디션
Validation — 심층 참조
한눈에 보기
섹션 제목: “한눈에 보기”Validation 모듈은 원시 PDF 바이트에 대해 사전 구축된 읽기 전용 구조 규정 준수 정책을 실행합니다. Compliance::assess()는 정확히 하나의 CompliancePolicy를 적용하고 심각도별로 분할된 발견 사항과 필수 법적 고지를 담은 ComplianceReport를 반환합니다. PDF/A-4(및 e와 f 변형), PAdES 기준 구조, eIDAS 구조 프로파일, LTV/DSS 상태, ZUGFeRD / Factur-X, FDA 21 CFR Part 11, SEC Rule 17a-4 WORM 아카이빙에 대한 정책이 제공됩니다. 모든 정책은 순수 함수입니다. 바이트가 입력되면 발견 사항이 출력됩니다. Validation은 문서를 절대 변경하지 않으며 암호학적 검증을 절대 수행하지 않습니다.
제공 여부 및 라이선싱
섹션 제목: “제공 여부 및 라이선싱”이 기능은 NextPDF Enterprise(nextpdf/enterprise)에 포함되며 Enterprise 등급 라이선스 엔벨로프로 활성화됩니다. 해당 권한이 없는 배포에서는 이 기능의 클래스가 로드되지 않습니다. 에디션 비교 및 라이선스 받기.
Validation/Evidence 표면은 enterprise.compliance.evidence 역량으로 라이선스됩니다. 거부된 권한은 조용히 격하하지 않고 해당 기능을 거부합니다.
| 등급 | Validation 표면 |
|---|---|
| Core | 인프로세스 바이트 스트림 검증기와 문법 교차 검사. 발견 사항이 0건인 결과는 검사된 결과일 뿐 인증서가 아닙니다. |
| Pro | e-인보이스 계층에서 인프로세스 EN 16931 / Factur-X / ZUGFeRD 검증. 사전 구축된 PDF/A-4, PAdES, LTV, FDA, 또는 SEC 정책은 없습니다. |
| Enterprise | 통합 보고서를 갖춘 PDF/A-4, PAdES, LTV, ZUGFeRD, FDA Part 11, SEC 17a-4에 대한 사전 구축 구조 정책(이 모듈). |
Enterprise Compliance 외부 사이드카 게이트웨이는 별개의 구분되는 모듈입니다.
공개 API 표면
섹션 제목: “공개 API 표면”composer require nextpdf/enterprise:^3| 심볼 | 매개변수 | 기본 동작 | 반환 | 예외 또는 실패 | 비고 |
|---|---|---|---|---|---|
Compliance::__construct | ?ClockInterface $clock = null | 클록이 주입되지 않으면 시스템 클록 | — | — | DI 친화적 인스턴스 형태. 클록이 validatedAt를 각인 |
Compliance::run | string $pdfData, CompliancePolicy $policy, array $context = [] | 정확히 하나의 정책을 적용하고 실제 경과 시간을 측정 | ComplianceReport | 사용자 정의 정책 예외를 전파. 내장 정책은 예외를 던지는 대신 발견 사항을 수집 | 인스턴스 메서드 |
Compliance::assess (정적) | string $pdfData, CompliancePolicy $policy, array $context = [] | 기본 인스턴스를 생성하고 run()에 위임 | ComplianceReport | run()과 동일 | 무설정 빠른 경로 |
Policies::pdfA4 / ::pdfA4e / ::pdfA4f (정적) | — | ISO 19005-4:2020에 따른 PDF/A-4 구조 정책 | CompliancePolicy | — | e는 3D/리치 미디어 주석을 허용. f는 임베드 파일 관계 검사를 추가 |
Policies::padesBaseline (정적) | — | PAdES B-B 구조 검사 | CompliancePolicy | — | 구조 전용. 암호학적 검증 없음 |
Policies::eidasQualified (정적) | — | eIDAS 라벨이 붙은 프로파일 하의 PAdES 구조 검사 | CompliancePolicy | — | 적격성은 TSP와 적격 인증서에 따라 달라짐 |
Policies::ltvHealth (정적) | — | DSS 구조 상태 검사 | CompliancePolicy | — | 활성 객체 그래프에서 DSS 존재 여부를 해석, fail-closed |
Policies::zugferd (정적) | string $profile = 'BASIC' | 프로파일 별칭을 정규화하고 ZUGFeRD 검증기를 구축 | CompliancePolicy | \ValueError(알 수 없는 프로파일) | 프로파일: MINIMUM, BASIC, BASIC_WL, EN16931, EXTENDED |
Policies::fdaPart11 (정적) | — | FDA 21 CFR Part 11 구조 정책 | CompliancePolicy | — | 감사 추적 해시 체인 무결성을 포함한 7가지 구조 검사 |
Policies::sec17a4 / ::sec17a4Compatible / ::sec17a4Structural / ::sec17a4PreSign (정적) | — | 지정된 엄격도의 SEC 17a-4 WORM 정책 | CompliancePolicy | — | 엄격도는 WormComplianceLevel에 매핑 |
CompliancePolicy (인터페이스) | — | 하나의 표준을 위한 전략 계약 | — | — | getName(), getIdentifier(), getStandardReference(), validate(). 고객이 구현 가능 |
ComplianceReport | 읽기 전용 값 객체 | 생성 시 심각도별로 분할된 발견 사항 | — | — | passes(), fails(), totalFindings(), getDisclaimer(). 공개 findings, errors, warnings, infos, policyName, policyId, standard, validatedAt, durationMs |
ComplianceFinding | Severity $severity, string $ruleId, string $message, string $clause = '', string $suggestion = '' | 조항 참조와 개선 힌트를 담은 하나의 규칙 결과 | — | — | 정적 error() / warning() / info(). isError() |
Severity (enum) | 문자열 기반 케이스 3개 | Error, Warning, Info | — | — | Error만 보고서를 실패시킴 |
WormComplianceLevel (enum) | 문자열 기반 케이스 4개 | Full, Compatible, Structural, PreSign | — | — | requiresSignature(), requiresDocMdp(), requiresLtv(), maxDocMdpLevel() |
PdfAPolicy, PadesValidator, LtvHealthCheck, ZugferdValidator, Sec17a4WormPolicy, Fda\FdaPart11Policy | 클래스별 생성자 | 각각 하나의 표준에 대해 CompliancePolicy를 구현 | validate()에서 list<ComplianceFinding> | — | Policies를 통해 획득. Sec17a4WormPolicy::getLevel()이 구성된 엄격도를 노출 |
Fda\FdaSigningIntent (enum) | 문자열 기반 케이스 6개 | Authoring, Review, Approval, Certification, Verification, Rejection | — | — | toPdfReasonString()이 정규 /Reason 문자열을 산출 |
Fda\FdaAuditEvent::__construct | DateTimeImmutable $timestamp, string $actor, FdaSigningIntent $action, string $documentHash, string $certificateSerial, string $previousEventHash = '' | 생성 시 SHA-256 체인 해시를 계산 | — | InvalidArgumentException(타임스탬프가 UTC 아님) | 공개 eventHash. toXmpRdf()이 하나의 XMP 리스트 항목을 직렬화 |
Fda\FdaAuditTrail::addEvent | FdaAuditEvent $event | 체인 링크가 트레일 꼬리와 일치하면 이벤트를 추가 | self | InvalidArgumentException(해시 체인 손상) | 그 외 createEvent(), verifyChain(), getLastEventHash(), getEvents(), embedInMetadata() |
Fda\FdaSignatureEnforcer::configureSeedValue | FdaSigningIntent $intent, string $tsaUrl | FDA 제약 서명 시드 값 구성을 구축 | SeedValueConfig | — | FDA reason 세트, 타임스탬프, SHA-256 이상의 다이제스트를 요구 |
Fda\FdaSignatureEnforcer::applyTo | SequentialSigner $signer, SigningStrategy $strategy, string $signerName, FdaSigningIntent $intent, string $tsaUrl, string $fieldName = '', ?string $reason = null | Pro SequentialSigner에 FDA 제약 서명자를 추가 | SequentialSigner | — | 제약 조건을 생성된 서명 필드로 직렬화 |
namespace NextPDF\Enterprise\Validation;
final readonly class Compliance{ public function __construct(?ClockInterface $clock = null);
/** @param array<string, mixed> $context */ public function run(string $pdfData, CompliancePolicy $policy, array $context = []): ComplianceReport;
/** @param array<string, mixed> $context */ public static function assess(string $pdfData, CompliancePolicy $policy, array $context = []): ComplianceReport;}final class Policies{ public static function pdfA4(): CompliancePolicy; // also pdfA4e(), pdfA4f() public static function padesBaseline(): CompliancePolicy; public static function eidasQualified(): CompliancePolicy; public static function ltvHealth(): CompliancePolicy; public static function zugferd(string $profile = 'BASIC'): CompliancePolicy; public static function fdaPart11(): CompliancePolicy; public static function sec17a4(): CompliancePolicy; // also sec17a4Compatible(), sec17a4Structural(), sec17a4PreSign()}interface CompliancePolicy{ public function getName(): string;
public function getIdentifier(): string;
public function getStandardReference(): string;
/** * @param array<string, mixed> $context * @return list<ComplianceFinding> */ public function validate(string $pdfData, array $context = []): array;}
final readonly class ComplianceReport{ public const string LEGAL_DISCLAIMER;
public function passes(): bool;
public function fails(): bool;
public function totalFindings(): int;
public function getDisclaimer(): string;}동작 계약
섹션 제목: “동작 계약”Compliance::assess()(정적)와 Compliance::run()(인스턴스, 주입 가능한 Psr\Clock\ClockInterface 포함)는 정확히 하나의 정책을 적용하고 ComplianceReport를 반환합니다. 외부에서 관찰 가능한 규칙:
- 순수 읽기 전용. 모든
CompliancePolicy::validate()는 순수 함수입니다. 바이트가 입력되면 발견 사항이 출력됩니다. 정책은 PDF 바이트를 절대 변경하지 않습니다. 이 아키텍처 불변식은 검증을 자동 수정 및 Evidence 모듈과 구분되게 유지합니다. - 심각도 게이트.
ComplianceReport::passes()는errors === []일 때만 true입니다. 경고와 정보는 보고서를 절대 실패시키지 않습니다.fails()는 그 보수입니다. - 필수 고지.
ComplianceReport::getDisclaimer()는 상수 법적 고지 텍스트를 반환합니다. 이를 사용자에게 표시되는 출력에 노출하는 것은 계약상 요구됩니다. - 보고서 출처. 보고서는 정책에서 가져온 정책 이름, 식별자, 표준 참조와, 주입된 또는 시스템 클록에서 가져온 검증 타임스탬프, 그리고 측정된 소요 시간(밀리초)을 담습니다.
- 중단하지 않고 수집. 내장 정책은 첫 번째 오류에서 멈추지 않고 적용 가능한 모든 검사를 실행하며 모든 발견 사항을 수집합니다.
- 카탈로그로 도달 가능한 DSS만.
LtvHealthCheck는 활성 객체 그래프에서 DSS 존재 여부를 해석합니다. 활성 트레일러, 그다음/Root카탈로그, 그다음/DSS와 그 하위 키 순입니다. 주석, 문자열, 고아 객체, 또는 대체된 리비전에 심어진 마커 바이트는 계산되지 않습니다. 파싱할 수 없는 입력은 DSS 없음으로 취급되므로 검사는 fail-closed입니다. 이 검사는 구조적이며, 임베드된 OCSP/CRL 데이터를 암호학적으로 검증하지 않습니다. - 구조 전용 서명 검사.
Policies::padesBaseline()와Policies::eidasQualified()는 PDF 수준에서만 PAdES 구조를 검증합니다. eIDAS 하의 적격성은 TSP와 적격 인증서에 따라 달라지며, 이는 이 모듈의 범위 밖입니다. - 규제 산업 정책은 구조적입니다.
FdaPart11Policy는 서명 존재,/Reason의도,/M서명 시간,/Name신원, JavaScript 없음, FDA 감사 추적 네임스페이스, 해시 체인 무결성을 검사합니다.Sec17a4WormPolicy는 최대 13개의 WORM 규칙을 검사하며,WormComplianceLevel이 엄격도를 선택합니다.Full은 DocMDP 레벨 1을 요구하고,Compatible은 레벨 2를 허용하며,Structural/PreSign은 서명, DocMDP, DSS 규칙을 건너뜁니다. 어느 정책도 법적 준수를 확립하지 않습니다. - ZUGFeRD 컨텍스트.
Policies::zugferd()는 항상 PDF 수준 요구 사항을 검사합니다. 호출자가$context에['xml' => $xmlData]를 전달할 때만 인보이스 XML을 검증하며, 그렇지 않으면 정보 발견 사항zugferd-xml-skipped를 방출합니다. - 변조 감지 감사 추적.
FdaAuditTrail은 추가 전용 SHA-256 해시 체인입니다.addEvent()는 손상된 링크를 거부하고,verifyChain()은 모든 해시를 재도출하며,embedInMetadata()는 PDF/A 확장 스키마와 함께http://ns.nextpdf.dev/fda/1.0/아래의 XMP에 트레일을 기록합니다.
엣지 케이스 및 실패 모드
섹션 제목: “엣지 케이스 및 실패 모드”- PDF가 아니거나 비어 있는 입력은 내장 정책에서 예외가 아니라 오류 발견 사항을 산출합니다. 항상
passes()를 확인하고 고지를 노출하십시오. Policies::zugferd()는 프로파일 별칭(BASIC_WL,EN16931,EN_16931)을 정규화합니다. 알 수 없는 프로파일은 어떤 검증이 실행되기 전에 팩토리 시점에\ValueError를 발생시킵니다.- CRL은 있으나 OCSP 응답이 없는 DSS는 폐지 자료 검사를 충족합니다. 발견 사항은 허용되는 대안을 명시합니다. 둘 다 존재하지 않는 것이 오류입니다.
/VRI딕셔너리나/Certs배열이 없으면 오류가 아니라 경고를 생성합니다. 보고서는 여전히 통과할 수 있습니다.FdaAuditEvent는 생성 시 UTC가 아닌 타임스탬프를InvalidArgumentException으로 거부합니다.FdaAuditTrail::verifyChain()은 변조되거나 순서가 바뀐 이벤트에 대해 false를 반환하며, 절대 예외를 던지지 않습니다.- 사용자 정의
CompliancePolicy구현은validate()에서 예외를 던질 수 있습니다.Compliance::run()은 이를 잡지 않으므로 그러한 예외는 호출자에게 전파됩니다.
FIPS 모드 동작
섹션 제목: “FIPS 모드 동작”이 모듈은 서명, 암호학적 검증, 키 보관을 수행하지 않습니다. FIPS 모드 알고리즘 정책은 Security 및 Signature 모듈이 관장합니다. FdaSignatureEnforcer 시드 값은 FDA 바인딩 서명 필드를 SHA-256, SHA-384, 또는 SHA-512 다이제스트 방식으로 제약합니다.
적합성
섹션 제목: “적합성”이 정책들은 명명된 표준을 기준으로 구조적 속성을 검사합니다. ISO/ETSI 프로파일에 대한 적합성 판정은 최종 파일과 외부 검증기의 속성으로 남습니다.
| 동작 | 참조 |
|---|---|
| 적합성은 생성자가 아니라 표준을 기준으로 판정됨 | ISO 19005-4:2020 §5.2 |
| 장기 검증을 위한 디지털 서명 딕셔너리 / DSS | ISO 32000-2:2020 §12.8 |
DSS는 문서 카탈로그의 DSS 키가 보유한 딕셔너리 | ISO 32000-2:2020 §12.8.4.3 |
| PAdES 기준 서명 레벨 | ETSI EN 319 142-1 §5.4.3 |
| EN 16931 프로파일 시맨틱 모델(보조 참조) | Factur-X 1.08 (EN 16931) |
FDA 21 CFR Part 11 및 SEC 17a-4 정책은 구조적 속성만 검사합니다. 해당 규정은 검증 코퍼스 밖에 있으며 검증된 적합성 주장을 수반하지 않습니다. FDA 발견 사항 내부의 조항 문자열(예: §11.50, §11.10(e))은 제품이 방출하는 규칙 참조입니다. EN 16931 행은 검색 임계값 아래의 보조 참조이며, 엄격한 적합성 주장이 아닙니다. 표준 지원은 표준 적합성이 아니며, 적합성은 인증이 아닙니다 — NextPDF는 어떤 인증도 보유하지 않으며 어떤 인증도 부여하지 않습니다. 이 참조는 법률 의견이 아닙니다. 법적 충족성에 대해서는 규정 준수 팀에 문의하십시오.
개발 참고 사항
섹션 제목: “개발 참고 사항”- Validation은 네트워크 I/O 없이 인프로세스에서 로컬로 실행됩니다. 정책은 입력을 변경할 수 없습니다.
- 신뢰할 수 없는 출처의 PDF 바이트를 적대적인 것으로 취급하십시오. 내장 정책은 임의의 바이트에 대해 전역적이며 구조를 해석할 수 없는 경우 fail-closed됩니다.
- 보고서의 모든 사용자 대상 렌더링에서
ComplianceReport::getDisclaimer()를 노출하십시오. - 보고서와 발견 사항은 서명된 문서와 감사 추적 메타데이터에서 비롯된 개인 데이터(서명자 이름, 인증서 일련번호)를 포함할 수 있습니다. 운영자가 보존 및 최소화 통제를 소유합니다.
- 사용자 정의 정책은
CompliancePolicy를 구현합니다. 직렬화와 캐싱을 위해 모든 정책에서getIdentifier()를 고유하게 유지하십시오. - 이 모듈은 암호학적 기능과 관련됩니다. 자체 검토에서 이를 보안 민감 요소로 취급하십시오.
- 내부 메커니즘 세부 정보는 소스 저장소의 내부 문서에 남으며 이 매뉴얼의 범위 밖입니다.
게시 경계
섹션 제목: “게시 경계”이 페이지는 외부에서 관찰 가능한 동작과 지원되는 공개 API 표면만 문서화합니다. 내부 네임스페이스 경로, 헬퍼 클래스, 메커니즘 표, 런북 파일명, 티켓 접두사는 범위 밖입니다.