---
status: VERIFIED_WEB_SERVICE_FAILOVER_SELF_TESTED_DEFAULT_OFF_NOT_LIVE
candidate_version: 1.4.81-node-bound-distinct-upnp-port-default-off-locked
candidate_bytes: 481811
candidate_sha256: bbac9679202b815127ec270ea8646f56d1abb872ff6e652e3bfc9556f358ce96
production_enabled: false
router_mapping_performed: false
operator_signing_used: false
validator_signing_used: false
---

# Web/TWA 검증형 service failover staging

## 목적

기존 Web/TWA는 `https://aisfor.kr` 단일 origin에 의존하고 service worker도 모든 요청을 단순히 `fetch()`로 전달했다. 이번 단계에서는 이미 설치된 Web/TWA 클라이언트가 메인 origin에 접근하지 못할 때, 사전에 검증·저장한 peer service directory를 다시 검증하고 적격 PC의 읽기 전용 stateless service shell로 이동할 수 있는 default-OFF 기반을 추가했다.

## 브라우저 검증 규칙

- HTTPS bootstrap source 최소 3개와 서로 다른 source failure domain
- 동일 commitment·block number·block hash에 대한 source 2-of-3 합의
- 내장된 root node key 최소 3개
- WebCrypto Ed25519 manifest vote 3개 검증
- manifest payload hash와 canonical commitment 재계산
- lease, TTL, chain ID, sequence, previous commitment 검증
- HTTPS `service-read` endpoint 최소 3개와 최소 2개 failure domain
- rollback, 동일 sequence equivocation, 이전 commitment 불일치 거부
- HTTP canary bundle은 Web production verifier에서 거부

## service worker 동작

기능은 `PLAI_WEB_SERVICE_FAILOVER_ENABLED`가 true이고 유효한 source/root 설정이 있을 때만 페이지에 로드된다. 기본 환경에서는 스크립트와 설정 자체가 HTML에 포함되지 않는다.

활성화된 경우에도 페이지가 전달한 결과를 그대로 신뢰하지 않는다. service worker가 두 source bundle의 Ed25519 서명과 commitment를 다시 검증한 후 proof를 저장하며, navigation network failure 때에도 저장된 원본 bundle을 다시 검증한다. 검증된 endpoint를 결정적 순서로 배열한 뒤 각 endpoint의 signed directory에 포함된 health path를 짧은 제한시간으로 확인하므로 첫 PC가 응답하지 않으면 다음 독립 PC를 시도한다. GET navigation만 failover 대상으로 삼고 POST·로그인·결제·전송은 대체 노드로 전달하지 않는다.

## PC stateless service shell

PC Sync `1.4.81`에 `/gateway/service-shell`을 추가했다. 다음 잠금이 모두 열리고 요청 manifest가 로컬 verified directory와 일치할 때만 응답한다.

- `statelessServiceCapsuleEnabled`
- `signedManifestVoteExchangeEnabled`
- 로컬 node가 directory의 `service-read` endpoint로 admission됨
- query의 manifest commitment가 local bundle과 일치

shell은 health, RPC certificate, service directory만 제공하는 secret-free/read-only HTML이다. CSP로 script, form, frame을 차단하며 로그인·write·결제·외부 전송 기능이 없다.

## 자기시험

- 실제 WebCrypto Ed25519 3표 검증
- 3 source 중 2 source 및 2 source-domain 합의
- 서명 변조, unpinned root, 단일 source, 중복 source 거부
- rollback/equivocation/previous commitment 방어
- service worker proof 저장 전과 redirect 전 재검증
- 메인 navigation 실패 시 manifest가 묶인 `/gateway/service-shell` redirect
- 첫 번째 검증 노드의 health 실패 후 두 번째 검증 노드 선택
- HTML escaping 및 manifest 변조 거부
- production 설정 OFF, network/router/DB/validator/operator signing 미사용

증거: `evidence/verified-web-service-failover-self-test-redacted.json`

메인 서버·DB·DNS·외부 네트워크를 사용하지 않는 합성 통합 시험에서도 WebCrypto 검증, 2개 bootstrap source/2개 failure domain 합의, 3개 service endpoint 선택이 함께 통과했다. 증거: `evidence/main-outage-inmemory-integration-redacted.json`

## 제한

이 shell은 의도적으로 읽기 전용 stateless continuity 화면이다. 중앙 Mongo/Redis가 필요한 전체 AISFOR write 기능의 Active-Active 대체물이 아니다. 실제 continuity 판정에는 독립 HTTPS PC endpoint, 물리 Web/TWA 브라우저, signed bundle refresh 및 메인 outage 시험이 필요하다.
