Dstack-TEE/private-ai-gateway. AI에게 질문을 보낼 때 그 프롬프트와 답변을 서버를 운영하는 회사조차 들여다볼 수 없게 만드는 게이트웨이다. 핵심 아이디어는 추론을 TEE(신뢰 실행 환경)라는 하드웨어 금고 안에서 돌리고, "내 요청이 정말 진짜 금고 안에서 처리됐다"를 사용자가 수학적으로 검증할 수 있게 증명서(원격 증명)를 붙여 주는 것. OpenAI와 똑같은 API를 쓰면서도 프라이버시·검증가능성을 얹은, dstack(Phala Network) TEE 스택 위에 Rust로 짜인 신생 보안 인프라 프로젝트다. (저장소: Dstack-TEE/private-ai-gateway · 언어 Rust · ★14 · 라이선스 Apache-2.0 · 버전 0.1.0 개발자 프리뷰 · TrendShift 라이브 멘션 등재)
"AI 추론을 하드웨어 금고 안에서 돌리고, 그게 진짜 금고였다는 영수증까지 끊어 준다."
보통 ChatGPT 같은 AI API에 질문을 보내면, 그 질문은 운영사의 서버 메모리를 거친다 — 우리는 "그들이 안 본다"는 약속을 믿을 수밖에 없다. 이 프로젝트는 그 믿음을 약속에서 증거로 바꾼다. 추론을 CPU 차원에서 봉인된 TEE 안에서 돌리고, "이 요청은 변조되지 않은 진짜 금고 안에서 실행됐다"를 증명하는 영수증(원격 증명 + 서명된 receipt)을 응답에 첨부한다.
구체적으로 이 저장소는 ACI(Attested Confidential Inference, 증명된 기밀 추론)라는 개념의 개발자 프리뷰(0.1.0)다. 언어는 Rust이고, 약 1.9만 줄 규모다. 자체적으로 모델을 돌리는 게 아니라, 이미 TEE 안에서 도는 여러 추론 백엔드(Tinfoil·NEAR AI·Chutes·Phala 등) 앞에 서는 게이트웨이(중간 관문) 역할을 한다. 사용자의 요청을 받아, 뒤쪽 추론 제공자가 정말 검증된 TEE인지 먼저 확인하고, 검증에 실패하면 프롬프트를 아예 보내지 않는다(fail-closed).
이 문서가 주목하는 건 "또 하나의 AI 프록시"가 아니라 그 안의 보안 설계다. "신뢰를 어떻게 코드와 하드웨어로 증명하는가", "원격 증명이라는 게 실제로 어떤 바이트를 주고받는가", "키는 어디서 나오고 누가 보증하는가" — 기밀 컴퓨팅이라는, 앞으로 AI 프라이버시의 핵심이 될 분야를 실물 코드로 들여다보는 살아있는 교재다.
"AI 프라이버시 약속을, 신뢰가 아니라 검증으로 바꾼다 — 그것도 OpenAI API 그대로."
AI에게 민감한 걸 묻기가 점점 꺼려진다. 의료·법률·기업 기밀을 클라우드 LLM에 보내면 그 데이터가 어디로 가는지 알 수 없기 때문이다. 이 프로젝트가 회자되는 이유는, 그 불안을 기술로 정면 돌파하기 때문이다.
대부분의 클라우드 AI는 "우리는 당신의 데이터를 학습에 쓰지 않습니다"라는 정책(약속)에 기댄다. 검증할 방법은 없다. 반면 이 게이트웨이는 GET /v1/attestation/report 한 번이면 "이 서버는 변조되지 않은 진짜 TEE이고, 응답에 서명한 키는 그 TEE가 보증한 것"임을 사용자가 직접 수학적으로 확인할 수 있다. 믿음의 자리에 증거가 들어선다.
완전히 새 SDK를 배울 필요가 없다. /v1/chat/completions·/v1/embeddings 등 OpenAI와 동일한 엔드포인트를 그대로 제공한다. 기존 앱은 주소(base URL)만 바꾸면 붙는다. 추가로 받는 건 응답 헤더의 x-receipt-id(영수증 번호) 하나뿐 — 검증을 원하는 사람만 그 영수증을 꺼내 보면 된다.
뒤쪽 추론 제공자가 검증되지 않거나 안전한 채널을 보장 못 하면, 게이트웨이는 프롬프트를 전송하지 않고 막아 버린다. "일단 보내고 보자"가 아니라 "확실하지 않으면 멈춘다"는 기본값이 안전(secure by default)인 설계다. 보안 시스템에서 가장 중요한 태도다.
이 저장소는 혼자 떠 있는 게 아니라 dstack(TEE 위에서 도커 앱을 안전하게 돌리는 오케스트레이션 스택)과 Phala Network(기밀 컴퓨팅 클라우드) 생태계의 일부다. ACI라는 표준 초안(dstack#694)의 레퍼런스 구현 격이라, 단순 토이가 아니라 표준을 끌고 가는 성격이 있다.
| 항목 | 일반 클라우드 추론 | 자체호스팅(온프렘) | TEE 기밀추론 (이 프로젝트) |
|---|---|---|---|
| 프라이버시 | 운영사를 믿어야 함 | 내가 다 통제(하지만 내가 다 책임) | 운영사조차 못 봄(하드웨어가 보장) |
| 신뢰 근거 | 약관·정책(말) | 내 인프라 통제 | 하드웨어 증명서(수학) |
| 검증가능성 | 불가능 | 스스로만 확인 | 제3자도 원격 검증 가능 |
| 운영 부담 | 거의 없음 | 매우 큼(GPU·모델·보안 전부) | 중간(TEE 하드웨어 필요) |
| API 호환 | 제각각 | 직접 구성 | OpenAI 호환 |
기존 AI 서비스의 프라이버시는 검증 불가능한 약속이었다. 이 게이트웨이는 원격 증명 + 서명된 영수증으로 "내 요청이 진짜 봉인된 환경에서 처리됐다"를 누구나 확인할 수 있게 만든다. 신뢰의 근거가 '회사의 평판'에서 '하드웨어와 암호학'으로 옮겨 간다.
README 스스로 "developer preview"라고 못 박는다. ★도 14개로 갓 시작한 단계다. 한계도 명시돼 있다 — ① 영수증은 아직 메모리에만 저장되고(서버 재시작 시 사라짐, TTL 설정형), 공개 투명성 로그는 미구현. ② 미들웨어를 켜면 그 구간에서는 평문을 본다(같은 증명 경계 안에 둬야 안전). ③ 로컬 개발 실행은 진짜 운영 배포와 동등하지 않다 — 진짜 보안 주장은 dstack 증명·KMS·소스 출처 고정이 다 갖춰져야 성립한다. "TEE면 무조건 안전"이 아니라, 검증해야 할 항목이 README의 '감사자 체크리스트'로 줄줄이 나온다.
"Rust 웹서버 한 채에, 암호학·하드웨어 증명·여러 추론 제공자 어댑터를 다 욱여넣었다."
이 게이트웨이는 순수 Rust 프로젝트다(약 1.9만 줄, 56개 소스 파일). 흔한 "프론트엔드/백엔드" 웹 구분과는 결이 다르다 — 한 Rust 바이너리 안에 HTTP 서버 · 암호학 · 하드웨어 증명 검증 · 제공자 어댑터가 레이어로 쌓여 있다. 아래는 그 레이어를 역할별로 정리한 지도다.
| 레이어 | 기술 | 역할 |
|---|---|---|
| 게이트웨이 런타임 | Rust 2021 · Axum · tokio · hyper | OpenAI 호환 HTTP 서버 본체. 비동기로 요청을 받고 위쪽 추론으로 중계 |
| TEE 하드웨어 | Intel TDX (기밀 VM) | 메모리 암호화된 격리 실행. 추론과 키 처리가 이 안에서 일어남 |
| TEE 오케스트레이션 | dstack v2 + dstack-sdk(Rust) | TEE 위에서 도커 앱을 안전히 띄우는 플랫폼. SDK로 키·증명을 받음 |
| 원격 증명 | TDX quote · DCAP (dcap-qvl) · RA-TLS 개념 | "진짜 TEE다"를 하드웨어가 서명한 증거. 게이트웨이와 상류 양쪽에서 검증 |
| 키 관리(KMS) | dstack KMS | 승인된 워크로드에만 안정적 키를 내주는 키-릴리스 서비스. 신원·영수증·E2EE 키 발급 |
| 암호학 | ed25519 · k256(secp256k1) · x25519 · ML-KEM · AES-GCM · ChaCha20-Poly1305 | 서명·키교환·E2EE 필드 암호화. 양자내성 ML-KEM까지 포함 |
| 추론 백엔드(상류) | OpenAI 호환 API · Tinfoil · NEAR AI · Chutes · PhalaDirect · ACI/DCAP | 실제 모델을 돌리는 곳. 게이트웨이가 검증 후 프롬프트를 전달 |
| 미들웨어(선택) | HTTP over Unix 도메인 소켓(UDS) | 인증·과금·라우팅 등 평문 비즈니스 로직. 검증 사실은 만들지 않음 |
| 컨테이너/배포 | Docker Compose · git-launcher · Phala Cloud | 고정 커밋을 받아 빌드·실행. compose 해시가 실행 정책 전체를 봉인 |
/v1/chat/completions 등)가 Axum 라우터로 정의돼 있다.| 크레이트 | 쓰임 |
|---|---|
| dstack-sdk | dstack KMS 키 발급 + TDX quote 발급. dstack과 대화하는 유일한 통로 |
| dcap-qvl | 상류 제공자의 TDX/DCAP 증명서를 검증(quote verification library) |
| ed25519-dalek · k256 | 영수증·신원 서명(Ed25519, secp256k1/이더리움식 복구 서명) |
| x25519-dalek · ml-kem · hkdf | E2EE 키 교환. ML-KEM은 양자컴퓨터 대비 격자기반 KEM |
| aes-gcm · chacha20poly1305 | 실제 페이로드 암복호화(인증 암호화) |
| reqwest (rustls-tls) | 상류로 프롬프트를 보내는 HTTP 클라이언트. OpenSSL 대신 순수 Rust TLS |
| x509-parser · rustls-pemfile | TLS 인증서 파싱 → SPKI 해시 계산(채널 바인딩 증거) |
| prometheus | 게이트웨이 자체 메트릭(/v1/metrics) |
"내가 질문을 보내면, 그 한 줄이 TEE 금고 안을 거쳐 '증명서 붙은 답'으로 돌아오기까지 무슨 일이 벌어지나."
이 게이트웨이를 이해하는 가장 좋은 방법은 요청 한 건이 흐르는 길을 끝까지 따라가는 것이다. 먼저 전체 그림을 한 장으로 보자. (아래 구조도는 README의 다이어그램과 docs/frontend-middleware-backend.md를 코드 기준으로 재구성한 것이다.)
핵심은 게이트웨이 자체가 모델을 돌리지 않는다는 점이다. 게이트웨이는 TEE 안에 사는 검증 관문이고, 진짜 추론은 또 다른 TEE(상류)에서 일어난다. 게이트웨이의 일은 "양쪽 모두 진짜 금고인지 확인하고, 그 사실을 영수증으로 남기는 것"이다.
이 프로젝트의 심장은 원격 증명(remote attestation)이다. 사용자가 GET /v1/attestation/report를 부르면, 게이트웨이는 인텔 CPU가 하드웨어로 서명한 증거(TDX quote)를 돌려준다. 이 증거에는 "지금 도는 코드의 측정값(해시)", "워크로드 신원", "이 TEE가 보증한 공개키 묶음(keyset)"이 담겨 있다. 사용자는 이걸 로컬에서 검증해, 자기가 대화하는 상대가 변조되지 않은 바로 그 코드임을 확인한다.
nonce(매번 다른 난수)가 영수증에 박혀 있어, 옛날 영수증을 재탕하는 것도 막는다.게이트웨이는 자기 키를 스스로 만들지 않는다. src/dstack.rs를 보면, dstack KMS에서 신원 키·영수증 서명 키·E2EE 키를 받아 온다. 중요한 건 KMS가 승인된 워크로드(검증된 코드)에만 키를 내준다는 것 — 즉 "이 키로 서명했다"는 곧 "승인된 TEE 안에서 서명했다"와 같은 뜻이 된다. 그래서 README가 "임시 키나 가짜 quote로 뜨는 모드는 아예 없다"고 강조한다. 모든 키와 증명서가 진짜 dstack 경로에서만 나온다.
한 게이트웨이 프로세스 안이 세 역할로 나뉜다(docs/frontend-middleware-backend.md 기준).
| 부분 | 책임 |
|---|---|
| Frontend | 공개 API·ACI 엔드포인트, 다운스트림 E2EE 복호, 외부 헤더 청소, 사용자측 해시 계산, 영수증 서명 |
| Middleware (선택) | 평문 비즈니스 로직(인증·과금·캐시·라우팅·재작성). 검증 사실은 절대 못 만듦 — 라우트만 고를 수 있음 |
| Backend | 라우트 검증, 상류 제공자 증명 확인(lease), TLS/E2EE 채널 바인딩 강제, 상류로 전달 |
왜 이렇게 갈랐나. 증명·검증 같은 신뢰의 핵심은 Frontend/Backend가 독점하고, 갈아끼우고 싶은 비즈니스 로직(과금·라우팅)은 Middleware로 빼서, 그 미들웨어가 검증을 위조하거나 우회할 수 없게 못 박은 것이다. Middleware는 평문을 보지만 "검증됐다"는 사실은 만들지 못한다 — 이 경계가 보안의 핵심이다.
위 부품들이 어떻게 맞물리는지, 미들웨어 없는 가장 단순한 경로('해피 패스')로 따라가 보자. (개념 단순화)
// "내 프롬프트가 검증된 TEE에서만 처리되게" 한 건의 내부 순서
① 사용자가 GET /v1/attestation/report?nonce=<난수> 호출
→ 게이트웨이가 TDX quote + keyset 반환 → 사용자가 로컬 검증
② 검증 통과 → POST /v1/chat/completions 전송 (TLS 또는 ACI E2EE)
③ Frontend: 외부 X-Private-AI-Gateway-* 헤더 제거, E2EE면 복호,
요청 해시 기록, request_id 생성
④ Backend: 대상 라우트(model) 검증 → 상류 제공자 증명 확인/갱신
⑤ 채널 바인딩 강제(상류 TLS SPKI 또는 제공자 E2EE 키가 증명과 일치?)
⑥ 일치하면 상류로 전달 / 불일치·검증실패면 → 전송 차단(fail-closed)
⑦ 상류 TEE에서 추론 → 응답이 같은 길로 되돌아옴
⑧ Frontend: 응답 해시까지 본 뒤 receipt(영수증)에 서명, x-receipt-id 반환
⑨ 사용자가 GET /v1/aci/receipts/{id} 로 영수증을 꺼내
"요청 해시·상류 검증·응답 해시·서명"을 최종 확인
여기서 배울 핵심은 "검증이 끝나야만 프롬프트가 흐른다"는 점이다. ⑥에서 보듯, 상류가 진짜 검증된 TEE라는 게 확인되지 않으면 프롬프트는 한 바이트도 나가지 않는다. 그리고 ⑧의 영수증은 요청·라우트·상류 검증·응답을 모두 해시로 묶어 서명하므로, 나중에 "내 요청이 정말 이 경로로 처리됐다"를 위조 불가능하게 증명한다.
전체를 외교 행낭(diplomatic pouch)으로 보면 쉽다. 사용자는 발송 전에 "이 운반 회사가 진짜 봉인 자격이 있는지" 공증서(원격 증명)부터 확인한다. 게이트웨이는 행낭을 받아, 다음 운반자(상류)도 같은 공증 자격이 있는지 확인한 뒤에만 넘긴다 — 자격 없으면 그 자리에서 멈춘다. 도착 후엔 "누가, 어떤 봉인으로, 어디를 거쳐 전달했는지" 적힌 공증 영수증(receipt)을 돌려준다. 내용물(프롬프트)은 그 누구도 중간에 못 열어 본다.
"폴더가 많아 보이지만, 사실 'src(엔진) + docs(설계·감사) + deploy(배포) + scripts(검증)'로 묶인다."
코드 대부분은 src/ 한 곳에 있고, 나머지는 문서·배포·테스트를 위한 보조 폴더다. README의 'Repository Map'을 코드 구조와 맞춰 풀면 이렇다.
| 경로 | 역할 |
|---|---|
| src/dstack.rs | TEE 세계와 닿는 유일한 지점 — KMS 키 발급과 TDX quote 발급을 전담 |
| src/aci/receipt.rs | 서명 영수증 구성·서명 수학. "요청→상류검증→응답"을 이벤트로 묶음 |
| src/aci/verifier/ | 상류 제공자가 진짜 검증된 TEE인지 확인(DCAP·dstack·제공자별) |
| src/aci/upstream/ | 제공자별 어댑터 — 각자 다른 증명·암호 방식을 통일된 형태로 감쌈 |
| src/aggregator/service/forward.rs | 실제 상류 전달 로직(fail-closed 판단이 여기 근처) |
| src/http/app/ | 모든 HTTP 엔드포인트(/v1/...)의 Axum 라우터 정의 |
| deploy/compose.yaml | git-launcher 핀 + 설정 + 상류 시드를 한 파일에 — compose 해시가 정책 전체를 봉인 |
| scripts/local_multi_upstream_smoke.sh | 모의 상류 2개 + 게이트웨이로 라우팅·영수증·검증 이벤트를 자동 점검 |
src/aci/와 src/dstack.rs에 모으고, 변할 수 있는 정책(어떤 제공자를 쓸지, 과금은 어떻게)은 docs/providers/ 리뷰와 런타임 설정·미들웨어로 뺀다. 감사자(보안 검토자)가 "신뢰의 핵심 코드"만 집중해 읽을 수 있도록 동선을 설계한 것 — 그래서 README가 제공자별 review.md와 audit-criteria.md를 따로 둔다."이 한 채에 '기밀 컴퓨팅·원격 증명·E2EE·AI 게이트웨이 설계·dstack 배포'가 다 들어 있다."
AI에 관심 없어도, 보안·시스템 개발자라면 배울 게 가득하다. 분야별로 무엇을 배울지 + 작게 실습할 아이디어를 정리했다.
배울 것: "운영체제와 관리자조차 못 보는 격리 구역"이라는 개념의 실체. Intel TDX 기밀 VM이 메모리를 암호화해 호스트로부터 워크로드를 가리는 원리, 그리고 그 위에서 도커 앱을 돌리는 dstack의 역할. 클라우드를 "믿지 않아도 되게" 만드는 새 패러다임.
실습: docs/attested-confidential-inference.md를 읽고 "검증이 증명하는 것 두 가지"(게이트웨이 증명 + 응답 영수증)를 한 문단으로 요약해 보기. "왜 TLS만으로는 부족한가"를 스스로 설명해 보면 기밀 컴퓨팅의 동기가 잡힌다.
배울 것: quote(하드웨어 서명 증거)와 keyset(TEE가 보증한 공개키 묶음)이 어떻게 "이 응답은 진짜 그 코드가 만든 것"을 보장하는지. nonce로 재전송(replay)을 막는 법, 코드 측정값(measurement)이 무엇인지. 신뢰의 근거를 '평판'에서 '암호학'으로 옮기는 사고방식.
실습: examples/verify_aci_artifacts.rs를 읽고 검증기가 무엇을 순서대로 확인하는지(증명 보고 → keyset → 영수증 서명 → 응답 해시 → 상류 검증 이벤트) 단계로 적어 보기. "어디 하나라도 어긋나면 왜 거부해야 하나"를 연결.
배울 것: "증명서가 말하는 TEE"와 "내가 실제로 접속한 서버"를 어떻게 하나로 묶는가(채널 바인딩). TLS 인증서의 SPKI 해시를 증명서 안에 박아 두는 기법, 그리고 ML-KEM·x25519·ChaCha20-Poly1305로 짠 필드 단위 E2EE가 TLS 위에 추가 보호를 얹는 방식.
실습: Cargo.toml의 암호 크레이트 목록을 보고 "서명용·키교환용·암호화용"으로 분류해 보기(예: ed25519=서명, x25519/ml-kem=키교환, aes-gcm/chacha=암호화). 각 단계가 흐름의 어디에 쓰이는지 4장 다이어그램과 대조.
배울 것: 여러 제공자(Tinfoil·Chutes·NEAR AI...)를 하나의 OpenAI 호환 표면으로 통일하는 어댑터 패턴. "사용자 모델 / 라우트 id / 상류 모델 id" 세 이름을 분리하는 라우팅 설계, 그리고 fail-closed·헤더 청소·스트리밍 중계 같은 게이트웨이 실전 기법.
실습: src/aci/upstream/에서 어댑터 하나(예: openai.rs)를 골라 "요청을 어떻게 상류 형태로 바꾸는지" 따라 읽기. README의 provider 표를 보며 제공자마다 검증·바인딩 방식이 어떻게 다른지 표로 정리.
배울 것: git-launcher가 고정 커밋을 받아 entrypoint.sh로 빌드·실행하고, 그 소스 출처가 증명 보고에 박히는 흐름. compose.yaml 한 파일이 핀·설정·상류 시드를 모두 담아 compose 해시로 실행 정책 전체를 봉인하는 아이디어 — "배포 자체가 감사 대상"이 되는 설계.
실습: deploy/compose.yaml과 entrypoint.sh를 같이 읽고 "왜 커밋 SHA를 고정하고, 왜 --locked로 빌드하나"를 한 문단으로 설명. "이게 없으면 증명서가 무엇을 증명하지 못하나"를 연결하면 재현 빌드의 의미가 잡힌다.
"진짜 보안 주장을 하려면 TEE 하드웨어가 꼭 필요하다 — 다만 코드 공부와 로컬 스모크는 평범한 PC로 충분하다."
이 프로젝트는 보안 주장의 뿌리가 하드웨어에 있어서, 요구사항이 일반 웹앱과 다르다. "진짜 운영 배포"와 "로컬 개발/공부"를 나눠서 봐야 한다.
| 항목 | 요구사항 |
|---|---|
| TEE 하드웨어 | Intel TDX를 지원하는 CPU(기밀 VM 가능). 이게 있어야 메모리 암호화·원격 증명이 실제로 작동한다 — 핵심 전제 |
| 오케스트레이션 | dstack v2 환경 + dstack KMS 접근. 키 발급·TDX quote가 여기서 나온다(기본 소켓 /var/run/dstack.sock) |
| 배포 경로 | Phala Cloud 등 dstack 호스팅, 또는 git-launcher + Docker Compose. 고정 커밋·소스 출처가 증명에 박힘 |
| 추론 백엔드 | 검증 가능한 상류 제공자(Tinfoil·NEAR AI·Chutes·PhalaDirect·ACI/DCAP 등). 게이트웨이는 모델을 직접 안 돌림 |
| 런타임 | Docker / docker compose, 그리고 빌드 시 Rust 툴체인(또는 Rust 포함 이미지) |
TEE 하드웨어가 없어도 코드를 읽고 빌드하고 모의 스모크를 돌릴 수 있다. 단, README가 강조하듯 이건 진짜 운영과 동등하지 않다 — 보안 주장은 못 하고, 동작과 흐름만 본다.
# 표준 로컬 점검 (Rust stable 툴체인 필요)
cargo test
cargo fmt --all -- --check
cargo clippy --all-targets -- -D warnings
# 신원만 띄우는 게이트웨이 (추론 라우트는 일부러 비움)
PRIVATE_AI_GATEWAY_CONFIG_PATH=/tmp/private-ai-gateway.config.json \
cargo run --release --bin private-ai-gateway
# 다른 터미널에서 신원 표면 확인
curl -sS 'http://127.0.0.1:8086/v1/attestation/report?nonce=test'
# 제공자 키 없이 추론 동작까지 보고 싶으면 — 모의 상류 2개로 스모크
scripts/local_multi_upstream_smoke.sh # 라우팅·영수증·검증 이벤트·메트릭 자동 점검
복사해서 그대로 쳐도 된다(설정 JSON은 README의 Quick Start에 전문이 있다). 핵심은 하드웨어 없이도 흐름을 학습할 수 있되, dstack SDK 엔드포인트가 필요하다는 점 — 로컬에선 포워딩한 dstack 소켓을 dstack_endpoint에 지정한다. 스모크 스크립트엔 docker compose·curl·jq·cargo 등이 있어야 한다.
"읽기만 하면 안 남는다 — 난이도별로 손을 움직여 보자. (대부분 TEE 하드웨어 없이 가능)"
Quick Start의 설정 JSON을 만들고 cargo run으로 게이트웨이를 띄운 뒤, curl로 /와 /v1/attestation/report?nonce=test를 호출해 본다. "추론 라우트 없이도 신원 표면은 증명된다"는 README의 말이 무슨 뜻인지, 반환된 JSON(workload id·keyset digest)을 보며 체감한다.
/v1/attestation/report가 돌려준 JSON을 jq로 펼쳐, workload id · keyset · evidence 필드가 각각 무엇인지 README의 '용어'·'감사자 체크리스트'와 대조한다. examples/dstack_kms_root_from_report.rs를 읽으면 "보고서에서 KMS 루트 키를 어떻게 끄집어내는지"의 감을 얻는다.
scripts/local_multi_upstream_smoke.sh로 모의 상류 2개 + 게이트웨이를 띄우고, 기존 OpenAI Python/JS SDK의 base URL만 바꿔 /v1/chat/completions를 호출해 본다. 응답 헤더의 x-receipt-id를 꺼내 /v1/aci/receipts/{id}로 영수증을 받아, "내 요청이 어떤 경로로 검증됐는지" 이벤트 로그를 읽는다.
저장한 report.json·receipt.json으로 cargo run --example verify_aci_artifacts -- --report ... --receipt ... --nonce ...를 실행한다. 검증기가 서명·해시·상류 검증 이벤트를 어떻게 로컬에서 확인하는지 따라 읽으며, "서버가 '검증됨'이라 말해도 믿지 않고 직접 확인한다"는 ACI 철학을 코드로 본다.
deploy/compose.yaml·entrypoint.sh·docs/providers/audit-criteria.md를 읽고, "무엇을 신뢰하고(하드웨어·인텔·dstack·고정 커밋), 무엇은 신뢰하지 않는가(호스트 OS·미들웨어 평문 구간)"를 한 장의 위협모델 표로 정리한다. README의 'Limits'와 '감사자 체크리스트'를 근거로, "이 시스템이 실제로 막아 주는 위협과 못 막는 위협"을 구분해 적으면 보안 분석 감각이 크게 는다.
"기밀 컴퓨팅은 처음엔 낯설다 — 개념 → 증명 → 암호 → 배포 순으로 4주 코스를 제안한다."
| 주차 | 주제 | 학습 자료 / 할 일 |
|---|---|---|
| 1주차 | 기밀 컴퓨팅·TEE 개념 | Intel TDX·TEE가 "무엇을 누구로부터 가리는지"를 정리. 이 저장소의 docs/attested-confidential-inference.md + Confidential Computing Consortium 입문 글. "TLS vs TEE" 차이를 한 문단으로. |
| 2주차 | 원격 증명 · DCAP | quote·measurement·nonce·keyset 용어 정복. examples/verify_aci_artifacts.rs 정독 + 인텔 TDX/DCAP 증명 문서. "검증기가 확인하는 순서"를 단계도로. |
| 3주차 | 응용 암호학 · E2EE | ed25519 서명, x25519 키교환, ML-KEM(양자내성), AES-GCM/ChaCha20 인증암호화. src/aci/e2ee.rs·keys.rs를 흐름과 대조하며 읽기. |
| 4주차 | dstack 배포 · 위협모델 | dstack/Phala 문서 + 이 저장소 deploy/·entrypoint.sh. git-launcher 고정 커밋·재현 빌드의 의미를 정리하고, 위협모델 표(신뢰 가정 vs 비신뢰)를 직접 작성. |
| 보너스 | Rust 비동기 웹 | Axum·tokio 기본기. 작은 OpenAI 호환 프록시를 직접 짜 보며 "스트리밍 중계·헤더 청소"를 흉내 내 보기. |
"이 분야의 영어·암호 용어를 한국어 뜻 + 일상 비유로 한 번에."
x-receipt-id로 번호가 오고, /v1/aci/receipts/{id}로 본문을 꺼내 검증한다.entrypoint.sh로 빌드·실행하고, 그 소스 출처를 증명에 박아 주는 배포 도우미."공식 저장소부터 TEE·dstack·Intel 문서까지 — 더 깊이 파고들 출발점."
github.com/Dstack-TEE/private-ai-gateway — 본 저장소(README + docs/ 설계 노트, 제공자 리뷰, 미들웨어 가이드, 로드맵)
Dstack-TEE/dstack#694 — 이 구현이 따르는 ACI(증명된 기밀 추론) 초안 PR
dstack-examples / git-launcher — 고정 커밋을 받아 빌드·실행하는 배포 도우미
github.com/Dstack-TEE/dstack — TEE 위 도커 오케스트레이션 스택(키·증명 관리)
phala.network — dstack 기반 기밀 컴퓨팅 클라우드(Phala Network / Phala Cloud)
Intel TDX 공식 개요 — 기밀 VM·원격 증명 하드웨어 기술
Confidential Computing Consortium — 기밀 컴퓨팅 개념 입문