검증 가능한 응답

relay가 모델을 바꿔치기했는지 확인하는 방법

Wokey의 원본 그대로 전달하는 경로에서는 공식 업스트림이 반환한 원본 바이트에 대해 AWS Nitro Enclave가 발급한 서명된 증명이 응답에 포함될 수 있습니다. Wokey를 신뢰할 필요 없이 오픈 소스 검증기로 직접 내 컴퓨터에서 확인할 수 있습니다.

응답 내용만으로는 아무것도 증명할 수 없습니다

relay는 JSON의 model 필드에 무엇이든 쓸 수 있고, 답변 품질도 주관적인 판단일 뿐입니다. 어떤 응답이 공식 업스트림이 반환한 것과 정확히 같다는 것을 보이려면 relay가 위조할 수 없고 사용자가 독립적으로 확인할 수 있는 서명이 필요합니다.

증명이 만들어지는 방식

공식 출구는 격리된 신뢰 실행 환경인 AWS Nitro Enclave 안에서 실행됩니다. Enclave는 요청마다 다음을 수행합니다.

  1. 1공식 업스트림과의 TLS 연결을 Enclave 안에서 종료하고, 이미지에 내장된 CA 번들로 업스트림 인증서를 검증합니다.
  2. 2응답을 스트리밍으로 전달하면서 해시를 계산하며, 전체 본문을 버퍼링하지 않습니다.
  3. 3부팅 시 생성되어 Enclave 밖으로 절대 나가지 않는 Ed25519 키로 명세서에 서명합니다. 명세서에는 업스트림 호스트, 경로, 메서드, 상태 코드, Content-Type, 그리고 요청 본문과 응답 본문 각각의 SHA-256이 담깁니다.
  4. 4서명 공개 키와 Enclave 이미지 측정값(PCR0)을 AWS Nitro 루트 인증서에 결합하는 AWS Nitro attestation을 첨부합니다.

로컬에서 확인할 수 있는 것

  • attestation이 AWS 문서에서 직접 고정한 Nitro 루트 인증서까지 체인으로 이어집니다.
  • PCR0가 오픈 소스 저장소에 공개되어 있고 직접 빌드해 재현할 수 있는 값과 일치합니다. 즉 Enclave는 그 공개 소스를 실행하고 있습니다.
  • 받은 바이트의 해시가 명세서의 response_body_sha256과 일치합니다. 즉 relay는 단 1바이트도 바꾸지 않았습니다.
  • 명세서의 업스트림 호스트가 공식 호스트입니다. 예를 들어 Claude 요청이라면 api.anthropic.com입니다. 응답의 model 필드는 공식 업스트림이 반환한 서명된 원본 바이트의 일부입니다.

증명이 포함되는 응답

조건: API 페이지에서 API 키의 “공식 검증”을 켜세요.

요청증명 전달 방식
Anthropic Messages 스트리밍(/v1/messages, stream: true)업스트림 SSE를 그대로 전달하고 끝에 event: tee.proof를 추가
OpenAI Responses 스트리밍(/v1/responses, 공식 Codex 경로)업스트림 SSE를 그대로 전달하고 끝에 event: tee.proof를 추가
비스트리밍 Messages / Responsesx-wokey-tee-proof-mode: multipart 헤더를 보내면 multipart/mixed가 반환됩니다. 첫 번째 파트는 업스트림 원본 바이트(Responses는 업스트림 SSE), 두 번째 파트는 증명입니다

증명이 포함되지 않는 응답

  • Chat Completions로 Claude를 호출하는 경우처럼 Wokey가 형식 호환을 위해 변환하거나 다시 직렬화한 응답. 변경된 바이트에 서명하면 오해를 부르므로 이런 응답에는 증명이 절대 포함되지 않습니다.
  • Studio를 포함한 이미지 생성과 이미지 편집은 항상 Enclave를 거치지 않으며 증명을 만들지 않습니다.
  • Enclave를 일시적으로 사용할 수 없으면 요청은 Enclave 없는 공식 출구로 전환되고, 그 응답에는 증명이 없습니다.
  • 응답을 그대로 전달할 수 없는 경로에서 multipart 증명을 요청하면 Wokey는 가짜 증명 대신 HTTP 422 tee_proof_multipart_requires_raw_passthrough를 반환합니다.

규칙은 하나입니다. tee.proof가 없는 응답은 모두 증명되지 않은 것으로 간주하세요.

증명이 보여 주지 않는 것

  • 증명하는 것은 무결성이지 기밀성이 아닙니다. Wokey relay는 전달 중에 평문을 다룹니다(저장하지는 않습니다). 운영자가 트래픽을 전혀 읽을 수 없어야 한다면 이 메커니즘은 그 경우를 다루지 않습니다.
  • 요청 본문 해시는 실제로 업스트림에 전송된 본문을 대상으로 합니다. 게이트웨이가 요청을 다시 쓰면(예: Responses 요청은 일부 필드가 채워짐) 로컬의 원래 본문과 일치하지 않으므로, 현재 Responses 증명은 응답만 증명합니다.
  • 재시도처럼 바이트 단위로 동일한 요청 사이에서는 오래된 응답이 재전송(리플레이)되었는지 검증기가 구분할 수 없습니다.
  • 신뢰의 기반은 AWS이며, Nitro attestation은 AWS가 서명합니다.

직접 검증해 보기

  1. 1

    키 검증 켜기

    API 페이지에서 API 키를 만들고 “공식 검증”을 켜세요.

  2. 2

    스트리밍 응답 저장하기

    스트리밍 Messages 요청을 보내고 curl -o로 전체 응답을 그대로 파일에 저장하세요. 파일은 event: tee.proof로 끝나야 합니다. Windows에서는 PowerShell의 > 리디렉션이나 메모장에서 다시 저장하는 대신 curl.exe -o를 사용하세요. 이런 방법은 줄 바꿈이나 인코딩을 바꿉니다.

    스트리밍 응답 저장하기
    curl -sN https://api.wokey.ai/v1/messages \
      -H "x-api-key: YOUR_API_KEY" \
      -H "anthropic-version: 2023-06-01" \
      -H "Content-Type: application/json" \
      -d '{"model":"claude-sonnet-5","max_tokens":256,"stream":true,"messages":[{"role":"user","content":"Hello"}]}' \
      -o captured-response
  3. 3

    오픈 소스 검증기로 확인하기

    <PCR0>를 저장소 README에 공개된 정식 PCR0로 바꾼 다음 검증기를 실행하세요. 파일 내용을 브라우저 검증기에 붙여 넣을 수도 있으며, 모든 확인은 로컬에서 실행됩니다.

    오픈 소스 검증기로 확인하기
    git clone https://github.com/focuxdot/proof-of-observation
    cd proof-of-observation/verifier
    npm install
    npx tsx tee-verify-stream.ts ../../captured-response --pcr0 <PCR0>