Faying Protocol/1.0 — §10 Error Handling

프로토콜 본문 내비게이션: 장 목차 | 이전 장 §9 보안 고려사항 | 다음 장 §11 미해결 과제

§10 Error Handling

이 장은 §5.4의 오류 코드와 구체적인 실패 시나리오, 프로토콜 응답, 상태 전이, 복구 경로, 관측 가능성 제약을 한데 모아 다룬다. 모든 오류는 §5.2 인벨로프 아래의 ERROR 메시지로 회신하며, claims 본체는 { code, message, mandate_id?, recovery_hint? } 형태다. §5.4의 오류 코드 표 외에는 오류 처리에 관해 이 장의 네 절을 정본으로 한다.

EH.1 오류 시나리오와 프로토콜 응답

아래 표는 §5.4에 나열된 모든 오류 코드(1001–1014와 1099)의 전경 뷰를 제시하며, 각 행은 다음을 담는다: 트리거 시나리오, 프로토콜 응답, Revoke 트리거 여부, 강등 트리거 여부, 감사 체인 필수 기입 여부, HP 시야 통로 필수 기입 여부. 이 표는 §5.4 오류 코드 표와 일대일 대응한다.

Code명칭트리거 시나리오프로토콜 응답Revoke 트리거강등 트리거감사 기입HP 시야 기입
1001E_NO_MANDATE업무 요청이 Faying Protocol 헤더 / Mandate를 담지 않음RP 즉시 거부; audit 미수립✗✗✗✗
1002E_MANDATE_EXPIREDnow > Mandate.not_afterRP 거부 + MS가 그 Mandate의 Revoke 트리거✓✗✓✗
1003E_SCOPE_VIOLATION호출 동작 ∉ Mandate.scope.actionsRP 거부 + 의심 이벤트 기록; 의심 누적 횟수가 강등 트리거✗✓(누적)✓✗
1004E_GRADE_INSUFFICIENTRP가 요구하는 grade가 현재 Mandate.grade보다 강함RP 거부 + 승급 안내(승급 경로는 HP human_witness 필요)✗✗✓✗
1005E_PRESENCE_STALEpresence.last_freshness가 max_staleness_ms 또는 LivenessDetectionBudget 초과RP 거부; IF가 능동적으로 D 차원 중지, PRESENCE 보정 대기; 상태 기계 Active → Degraded✗✓✓✗
1006E_REVOKEDRR이 revoked로 표기RP 거부; 동일 체인 호출 연쇄 거부; IF 즉시 Rogue Fay로 복귀✓(이미 폐기됨)✗✓✓
1007E_ATTESTATION_INVALIDAttestation Chain 노드 서명 검증 실패 / 타임스탬프가 부모 노드 validity window 밖 / endorsement 하위 필드 변조됨RP 거부 + MS가 그 Mandate의 Revoke 트리거✓✗✓✓
1008E_RR_UNAVAILABLERR 질의 타임아웃 ≥ StaleBudgetRP가 Default-Deny에 따라 거부; IF가 모든 D 차원 일시 정지; 상태 기계 Active → Degraded✗✓✓✗
1009E_REPLAYnonce가 2 × max_message_lifetime 안에서 동일 subject에 대해 이미 관측됨RP 거부 + 보안 경보; IF 즉시 세션 키 rotate✗✗✓✓
1010E_HUMAN_WITNESS_REQUIREDgrade-up / FAYING_REQUEST 등 HP 입회가 필요한 시나리오에서 누락되거나 human_witness 검증 실패RP / MS 거부; HP 입회 후 재발기 대기✗✗✓✗
1011E_ROGUE_DETECTEDD 차원 위반 감지(ego-deviation / 행위 베이스라인 임곗값 초과 등)RP 거부 + 강제 Revoke; IF 즉시 Rogue Fay로 복귀✓✗✓✓
1012E_BUDGET_EXCEEDED호출 누적이 Scope.budget / ResourceBudget 초과RP 거부 + 강등 또는 (극단적 상황) Revoke 트리거✓(극단)✓✓✗
1013E_ENDORSEMENT_INVALIDendorsed_scope ⊄ scope / endorsed_grade.autonomy > grade.autonomy / endorsed_lifetime 누락 또는 과도하게 김 / endorsement 하위 필드 변조됨 / DELEGATE 자식 endorsement이 부모에 수렴하지 않음MS 발급 거부 + 그 Mandate의 Revoke 트리거; IF 즉시 모든 endorsed 행위 중지✓✗✓✓
1014E_FAYING_REQUEST_NOT_CONFIRMEDiFay가 능동 발기한 FAYING_REQUEST가 BootstrapTimeout 안에 HP의 명확한 승인을 얻지 못함MS가 FAYING_REQUEST_RESP { status="timeout" }으로 반환; 어떤 Faying 상태 변화도 발생하지 않음; 이벤트는 Attestation Chain에 기입✗✗✓✗
1099E_PROTOCOL버전 / 형식 / 필드 누락 / 파싱 불가 / DISCLOSURE mandatory_fields 누락 또는 파싱 불가 / 서명 입력 부적법 / §5.3 메시지 목록에 명시 나열되지 않은 msg_typeRP / MS 거부; DISCLOSURE 경로에서 트리거 시 추가로 HP 시야 push✗✗✓✗*(DISCLOSURE 경로 ✓)

* 비고: E_PROTOCOL은 기본적으로 감사 체인에만 기입된다. 다만 §5.3.7 DISCLOSURE의 mandatory_fields 누락 또는 파싱 불가 경로에서 트리거될 때, MS는 반드시 추가로 HP 시야 통로로 푸시해야 한다(§5.4 비고와 일치).

Trace: R2.1.1–R2.1.4(기본 거부), R3.2.1–R3.2.3(오류 이벤트의 감사·HP 시야 기입), R4.2.1–R4.2.3(폐기 가시성 예산과 도달성), R11.1.4(endorsement 변조가 E_ATTESTATION_INVALID + Revoke 트리거), R11.2.1–R11.2.3(endorsement 수렴 위반이 E_ENDORSEMENT_INVALID 트리거), R1.3.3(FAYING_REQUEST 타임아웃 미승인이 E_FAYING_REQUEST_NOT_CONFIRMED 트리거), R13.3.1(DISCLOSURE mandatory_fields 누락 또는 파싱 불가가 E_PROTOCOL 트리거).

EH.2 복구 경로

"Faying 상태를 다시 수립해야 하는지"에 따라 오류 코드를 세 종류의 복구 경로로 나눈다. 모든 복구 경로는 반드시 EH.4 Default-Deny 수렴 안에서 실행되어야 하며, 낙관적 통과의 중간 창은 존재하지 않는다.

EH.2.1 복구 가능 오류(BOOTSTRAP 재실행 불필요)

Code명칭복구 동작
1004E_GRADE_INSUFFICIENTGRADE_SWITCH-up 트리거(반드시 HP human_witness 휴대, §7.4 참조); 입회를 건너뛴 복구 불허
1005E_PRESENCE_STALEPRESENCE 메시지 재전송으로 last_freshness 회복; 여전히 실패하면 LivenessDetectionBudget에 따라 Degraded → Suspended로 수렴
1008E_RR_UNAVAILABLEDefault-Deny 창 안에서 retry-with-backoff(StaleBudget 초과 금지); 초과하면 Degraded로 진입하여 RR 회복 후 재연결 대기
1012E_BUDGET_EXCEEDEDGRADE_SWITCH-down 트리거 또는 예산 창 갱신 대기; "예산 무시"를 통한 복구 불허

EH.2.2 HP 재입회가 필요한 복구(반드시 BOOTSTRAP 재실행)

Code명칭복구 동작
1002E_MANDATE_EXPIREDBOOTSTRAP 재실행; 새 mandate_id는 반드시 옛 mandate_id와 같지 않음(P10 폐기 불가역과 일치)
1006E_REVOKED복구 불가; HP가 능동적으로 새로운 한 차례의 BOOTSTRAP을 발기해야만 하며, 새 mandate_id는 반드시 옛 mandate_id와 같지 않음
1007E_ATTESTATION_INVALID위와 동일; 그 Mandate의 강제 Revoke를 트리거한 후에야 새 BOOTSTRAP을 허용
1011E_ROGUE_DETECTED위와 동일; 보통 HP의 직접 개입과 ego-deviation 감사를 동반
1013E_ENDORSEMENT_INVALID위와 동일; 그 Mandate의 Revoke를 트리거한 후 반드시 HP가 새로운 한 차례의 BOOTSTRAP을 발기해야 함(합법적인 endorsement 필드 포함)

EH.2.3 Faying 상태 변화를 구성하지 않음(복구 수요 없음)

Code명칭처리
1001E_NO_MANDATE호출 측은 먼저 Mandate를 획득한 후 호출을 발기해야 함; 본 프로토콜 계층에는 "Mandate 없는 임시 통과" 경로가 존재하지 않음
1003E_SCOPE_VIOLATION호출 측은 action을 조정하여 Mandate.scope.actions 안에 떨어지게 해야 함; 의심 누적은 강등을 트리거
1009E_REPLAY호출 측은 새 nonce를 사용하여 재발기해야 함; 공격 행위인 경우 이미 보안 경보와 HP 시야에 기입됨
1010E_HUMAN_WITNESS_REQUIREDHP 입회 후 재발기; IF / MS / SA가 입회를 대체하는 것은 불허
1014E_FAYING_REQUEST_NOT_CONFIRMEDiFay는 합법적인 속도 내에서 FAYING_REQUEST를 재발기할 수 있으나, 이를 빌려 확인 홍수를 실시해서는 안 됨(§9.10.7, 부록 B ConfirmationRateLimit 참조)
1099E_PROTOCOL호출 측은 메시지 구조를 수정한 후 재발기해야 함

공통 하드 제약: 복구 경로는 §EH.4 Default-Deny 수렴을 우회해서는 안 된다. "확실하지 않지만 일단 통과시킨다"는 낙관적 복구 경로는 프로토콜 계층에 일절 존재하지 않는다.

EH.3 오류 응답의 관측 가능성 제약

모든 ERROR 메시지는 다음 네 가지 강제약을 만족해야 한다:

  1. 감사 5요소: E_NO_MANDATE(Mandate 컨텍스트 없음)를 제외한 모든 오류 코드는 반드시 (error_code, mandate_id, ts, RP_id, reason) 5요소로 Attestation Chain / audit-log에 기입되어야 한다. 이 5요소는 §3.2, §EH.1 "감사 기입" 열과 일치한다.
  2. HP 시야 통로 필달: 오류 코드 집합 {E_REVOKED (1006), E_ATTESTATION_INVALID (1007), E_REPLAY (1009), E_ROGUE_DETECTED (1011), E_ENDORSEMENT_INVALID (1013)}은 반드시 HP 시야 통로로 push되어야 한다. DISCLOSURE 경로에서 트리거된 E_PROTOCOL (1099)도 마찬가지로 필달이다. RP는 조용히 삼켜서는 안 된다.
  3. 민감 정보 누출 금지: 오류 응답에 MS 내부 상태, Mandate 개인키 지문, 다른 HP 식별자, IF 내부 상태 기계 변수 등 민감 정보를 담는 것을 금지한다. message와 recovery_hint 필드는 반드시 프로토콜 계층의 공개 의미론이어야 하며 구현 세부를 새어 나가게 해서는 안 된다.
  4. 감사 체인 독립 검증 가능: Attestation Chain에 기입되는 오류 이벤트는 반드시 §3.3 I-AC-1 / I-AC-2가 요구하는 서명 노드를 담아, 제3자가 MS 개인키를 보유하지 않은 전제에서 잎에서 뿌리까지의 체인 검증을 완료할 수 있게 해야 한다(§6.3 참조).

Trace: R3.2.1(오류 코드 5요소를 audit-log에 기입), R3.2.2(오류 응답은 민감 정보를 담아서는 안 됨), R3.2.3(지정 오류 코드는 HP 시야 필달), R3.1.4(감사 체인 추적 가능 필드).

EH.4 Default-Deny의 통일 수렴

명확히 분류할 수 없는 어떤 오류든, 파싱 불가한 어떤 필드든, RR 도달 불가 기간의 어떤 호출이든, 프로토콜 계층은 일률적으로 E_PROTOCOL 또는 E_RR_UNAVAILABLE로 거부한다. "확실하지 않지만 일단 통과시킨다"는 합법 경로는 존재하지 않으며, "더 느슨한 상태로 처리하는" 낙관적 복구 경로도 존재하지 않는다(실제로 온라인이지만 실연으로 감지된 창 B 포함, §9.9 참조).

수렴 규칙의 네 가지 등가 표현:

  1. 상태 기계 계층: §4.3 Mandate 상태 기계 / §8.1 Lifecycle 상태 기계에 명시 나열되지 않은 전이는 일률적으로 거부한다.
  2. 메시지 계층: §5.3 메시지 목록에 명시 나열되지 않은 msg_type, 또는 인벨로프 필드 누락 / 타입 오류는 일률적으로 E_PROTOCOL로 거부한다.
  3. 오류 코드 계층: §5.4 / §EH.1에 명시 나열되지 않은 실패 원인은 일률적으로 E_PROTOCOL로 분류하여 거부한다.
  4. 결정 계층: 프로토콜 계층은 오직 Perceived-Disconnected만을 결정 근거로 삼는다. 창 A(실제로 실연되었으나 온라인으로 감지됨) / 창 B(실제로 온라인이지만 실연으로 감지됨)의 낙관적 통과 경로는 프로토콜 계층에 존재하지 않는다(§9.9 비관적 추정 원칙, P17.1 / P17.2 참조).

Trace: R2.1.1–R2.1.4(기본 거부), R12.1.1–R12.1.3(이중 의미론 Perceived-only 결정), R12.2.1–R12.2.3(비관적 추정 / 감지된 실연 기간 거부).