# 배포 보안과 품질 승인 신뢰 경계 ## 범위와 현재 상태 현재 코어의 SHA-256 fingerprint는 초안, 공고, 분석, 근거 매핑, 콘텐츠 계획, 설정, 평가 정책이 바뀌었는데 과거 평가를 재사용하는 오류를 막습니다. 그러나 fingerprint는 비밀키가 없는 무결성 표식이므로 품질 보고서의 발급자나 `category_scores`·`findings`의 위변조를 인증하지 않습니다. 따라서 현재 `resume-harness render`는 사용자가 입력 파일과 품질 보고서를 모두 관리하는 **단일 사용자 로컬 도구**의 신뢰 경계입니다. 지원자와 보고서 제출자가 분리되는 웹 서비스, 사내 승인 서비스, 다중 사용자 API에서는 아래 서명 계층을 구현하기 전까지 이 CLI 경로를 그대로 외부에 노출하면 안 됩니다. | 배포 형태 | 품질 보고서 신뢰 | 허용 정책 | |---|---|---| | 단일 사용자 로컬 | 동일 사용자가 입력·평가 파일을 관리 | 현재 fingerprint와 로컬 하드 게이트 사용, 보안 인증으로 오해하지 않음 | | 다중 사용자/원격 서비스 | 요청자가 보고서를 바꿀 수 있음 | 서명된 attestation 필수, unsigned 보고서 fail-closed | ## 프로덕션 `QualityAttestation` 계약 프로덕션 승인 서비스는 독립 평가와 모든 결정적 게이트가 끝난 뒤 다음 envelope를 Ed25519로 서명해야 합니다. 실제 `QualityReport` 전체를 envelope 안에 넣어 점수와 finding도 서명 범위에 포함합니다. ```text schema_version attestation_id issuer audience key_id issued_at expires_at validator_version evaluation_policy_fingerprint evaluator.provider / evaluator.model / evaluator.version quality_report # 전체 QualityReport signature_algorithm = Ed25519 signature ``` 서명 payload는 `signature` 필드만 제외한 envelope 전체를 RFC 8785(JCS) 고정 canonical JSON 규칙으로 직렬화하고, 다른 토큰과 혼동되지 않도록 `resume-harness-quality-attestation-v1\0` 도메인 구분자를 앞에 붙입니다. envelope가 가져온 공개키를 신뢰하지 않으며, 운영자가 관리하는 읽기 전용 trust store에서 `issuer + key_id`로 공개키를 선택합니다. 렌더 서비스는 다음 순서로 검증하고 어느 단계에서든 실패하면 출력하지 않습니다. 1. 스키마, 알고리즘, `issuer`, `audience`, `key_id` 허용 목록 2. Ed25519 서명과 발급·만료 시간(허용 clock skew 포함) 3. evaluator·validator·평가 정책 버전 허용 목록 4. 현재 아티팩트에 대한 draft/evaluation fingerprint 재계산 5. evidence/requirement coverage와 가중 총점 재계산 6. 개인정보·근거·공고 출력 제약의 로컬 결정적 검사 재실행 7. blocking finding, 총점, 영역별 임계값 확인 후 렌더 서명 성공은 이력서 내용이 사실이라는 외부 증명이 아닙니다. 지정된 평가 서비스가 특정 입력과 정책으로 해당 보고서를 발급했다는 사실만 인증합니다. 근거 원장의 진위는 `verification_status`와 별도의 증빙 검토 문제입니다. ## 키와 운영 정책 - 서명 개인키는 평가 worker 또는 KMS/HSM만 사용하고 렌더러·요청자에게 주지 않음 - 렌더러에는 공개키와 issuer/policy allowlist만 읽기 전용으로 배포 - 키 회전 시 `key_id`, 활성 시작일, 폐기일을 기록하고 만료된 보고서를 재평가 - unsigned 우회 옵션은 로컬 개발 명령에만 둘 수 있으며 서버 API·사용자 설정에는 노출하지 않음 - 검증 실패 로그에는 원문 이력서, 연락처, 서명 payload 전체를 남기지 않고 attestation ID, 비식별 fingerprint, 오류 코드만 기록 - 재생 방지가 필요한 제출 시스템은 `audience`, 짧은 만료 시간, 제출별 nonce를 함께 검증 ## 필수 보안 회귀 테스트 - 점수, finding, 임계값, evaluator 정보 중 한 바이트만 바꿔도 서명 실패 - 다른 초안·공고·매핑·계획·설정의 정상 서명을 재사용해도 fingerprint 실패 - self-signed 공개키, 알 수 없는 issuer/key, 잘못된 audience, 만료·미래 발급 거부 - 폐기된 키와 허용되지 않은 평가 정책·모델 버전 거부 - 동일 JSON의 필드 순서·Unicode 정규화 차이를 canonicalization 규칙으로 고정 - 서명이 유효해도 로컬 개인정보·근거·출력 제약이 실패하면 렌더 거부 Ed25519 서명과 trust store는 현재 저장소에 구현된 기능이 아니라 다중 사용자 배포의 필수 확장 계약입니다. 구현 전에는 현재 CLI를 신뢰 경계 밖의 승인 서비스로 간주하지 않습니다.