GitHub 트렌딩 딥다이브 · 2026-06-23

private-ai-gateway 딥다이브
— 내 프롬프트를 서버 주인조차 못 보게 하는 TEE 기밀 추론 게이트웨이

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 라이브 멘션 등재)

목차
  1. 프로젝트 한줄 요약
  2. 왜 주목받는가
  3. 기술 스택 전체 지도
  4. 아키텍처 심화 분석 (프롬프트가 금고를 거쳐 검증된 답이 되기까지)
  5. 디렉토리 구조 해부
  6. 학습 포인트 (기술별)
  7. 하드웨어 / 시스템 요구사항
  8. 직접 해볼 수 있는 실습 과제
  9. 관련 기술 심화 학습 로드맵
  10. 핵심 키워드 사전
  11. 참고 링크

1프로젝트 한줄 요약

"AI 추론을 하드웨어 금고 안에서 돌리고, 그게 진짜 금고였다는 영수증까지 끊어 준다."

한 줄로

private-ai-gateway는 LLM 추론을 TEE(하드웨어 금고) 안에서 처리하고, 그 사실을 사용자가 직접 검증할 수 있게 증명서를 붙여 주는 OpenAI 호환 보안 게이트웨이다.

보통 ChatGPT 같은 AI API에 질문을 보내면, 그 질문은 운영사의 서버 메모리를 거친다 — 우리는 "그들이 안 본다"는 약속을 믿을 수밖에 없다. 이 프로젝트는 그 믿음을 약속에서 증거로 바꾼다. 추론을 CPU 차원에서 봉인된 TEE 안에서 돌리고, "이 요청은 변조되지 않은 진짜 금고 안에서 실행됐다"를 증명하는 영수증(원격 증명 + 서명된 receipt)을 응답에 첨부한다.

용어
TEE (Trusted Execution Environment, 신뢰 실행 환경)
CPU 안에 만든 하드웨어로 봉인된 격리 구역. 그 안에서 도는 코드와 데이터는 같은 컴퓨터의 운영체제·관리자·심지어 서버 주인조차 들여다보거나 건드릴 수 없다. "은행 금고를 은행 직원도 못 여는 버전"이라고 보면 된다. 이 프로젝트는 인텔의 TDX라는 TEE 기술 위에서 도는 기밀 가상머신(confidential VM)을 쓴다. 메모리가 암호화돼 있어, 물리적으로 RAM을 들여다봐도 내용이 안 보인다.

구체적으로 이 저장소는 ACI(Attested Confidential Inference, 증명된 기밀 추론)라는 개념의 개발자 프리뷰(0.1.0)다. 언어는 Rust이고, 약 1.9만 줄 규모다. 자체적으로 모델을 돌리는 게 아니라, 이미 TEE 안에서 도는 여러 추론 백엔드(Tinfoil·NEAR AI·Chutes·Phala 등) 앞에 서는 게이트웨이(중간 관문) 역할을 한다. 사용자의 요청을 받아, 뒤쪽 추론 제공자가 정말 검증된 TEE인지 먼저 확인하고, 검증에 실패하면 프롬프트를 아예 보내지 않는다(fail-closed).

이 문서가 주목하는 건 "또 하나의 AI 프록시"가 아니라 그 안의 보안 설계다. "신뢰를 어떻게 코드와 하드웨어로 증명하는가", "원격 증명이라는 게 실제로 어떤 바이트를 주고받는가", "키는 어디서 나오고 누가 보증하는가" — 기밀 컴퓨팅이라는, 앞으로 AI 프라이버시의 핵심이 될 분야를 실물 코드로 들여다보는 살아있는 교재다.

2왜 주목받는가

"AI 프라이버시 약속을, 신뢰가 아니라 검증으로 바꾼다 — 그것도 OpenAI API 그대로."

AI에게 민감한 걸 묻기가 점점 꺼려진다. 의료·법률·기업 기밀을 클라우드 LLM에 보내면 그 데이터가 어디로 가는지 알 수 없기 때문이다. 이 프로젝트가 회자되는 이유는, 그 불안을 기술로 정면 돌파하기 때문이다.

① 신뢰를 "검증 가능한 증거"로 바꾼다

대부분의 클라우드 AI는 "우리는 당신의 데이터를 학습에 쓰지 않습니다"라는 정책(약속)에 기댄다. 검증할 방법은 없다. 반면 이 게이트웨이는 GET /v1/attestation/report 한 번이면 "이 서버는 변조되지 않은 진짜 TEE이고, 응답에 서명한 키는 그 TEE가 보증한 것"임을 사용자가 직접 수학적으로 확인할 수 있다. 믿음의 자리에 증거가 들어선다.

② OpenAI 호환 — 갈아끼우기가 쉽다

완전히 새 SDK를 배울 필요가 없다. /v1/chat/completions·/v1/embeddings 등 OpenAI와 동일한 엔드포인트를 그대로 제공한다. 기존 앱은 주소(base URL)만 바꾸면 붙는다. 추가로 받는 건 응답 헤더의 x-receipt-id(영수증 번호) 하나뿐 — 검증을 원하는 사람만 그 영수증을 꺼내 보면 된다.

③ Fail-closed — 검증 안 되면 아예 안 보낸다

뒤쪽 추론 제공자가 검증되지 않거나 안전한 채널을 보장 못 하면, 게이트웨이는 프롬프트를 전송하지 않고 막아 버린다. "일단 보내고 보자"가 아니라 "확실하지 않으면 멈춘다"는 기본값이 안전(secure by default)인 설계다. 보안 시스템에서 가장 중요한 태도다.

④ 거물들의 생태계 — dstack / Phala

이 저장소는 혼자 떠 있는 게 아니라 dstack(TEE 위에서 도커 앱을 안전하게 돌리는 오케스트레이션 스택)과 Phala Network(기밀 컴퓨팅 클라우드) 생태계의 일부다. ACI라는 표준 초안(dstack#694)의 레퍼런스 구현 격이라, 단순 토이가 아니라 표준을 끌고 가는 성격이 있다.

경쟁 구도 한눈에

항목일반 클라우드 추론자체호스팅(온프렘)TEE 기밀추론 (이 프로젝트)
프라이버시운영사를 믿어야 함내가 다 통제(하지만 내가 다 책임)운영사조차 못 봄(하드웨어가 보장)
신뢰 근거약관·정책(말)내 인프라 통제하드웨어 증명서(수학)
검증가능성불가능스스로만 확인제3자도 원격 검증 가능
운영 부담거의 없음매우 큼(GPU·모델·보안 전부)중간(TEE 하드웨어 필요)
API 호환제각각직접 구성OpenAI 호환
해결
"믿어 달라"를 "확인해 보라"로

기존 AI 서비스의 프라이버시는 검증 불가능한 약속이었다. 이 게이트웨이는 원격 증명 + 서명된 영수증으로 "내 요청이 진짜 봉인된 환경에서 처리됐다"를 누구나 확인할 수 있게 만든다. 신뢰의 근거가 '회사의 평판'에서 '하드웨어와 암호학'으로 옮겨 간다.

균형 잡기
아직 0.1.0 — 과대평가 금지

README 스스로 "developer preview"라고 못 박는다. ★도 14개로 갓 시작한 단계다. 한계도 명시돼 있다 — ① 영수증은 아직 메모리에만 저장되고(서버 재시작 시 사라짐, TTL 설정형), 공개 투명성 로그는 미구현. ② 미들웨어를 켜면 그 구간에서는 평문을 본다(같은 증명 경계 안에 둬야 안전). ③ 로컬 개발 실행은 진짜 운영 배포와 동등하지 않다 — 진짜 보안 주장은 dstack 증명·KMS·소스 출처 고정이 다 갖춰져야 성립한다. "TEE면 무조건 안전"이 아니라, 검증해야 할 항목이 README의 '감사자 체크리스트'로 줄줄이 나온다.

3기술 스택 전체 지도

"Rust 웹서버 한 채에, 암호학·하드웨어 증명·여러 추론 제공자 어댑터를 다 욱여넣었다."

이 게이트웨이는 순수 Rust 프로젝트다(약 1.9만 줄, 56개 소스 파일). 흔한 "프론트엔드/백엔드" 웹 구분과는 결이 다르다 — 한 Rust 바이너리 안에 HTTP 서버 · 암호학 · 하드웨어 증명 검증 · 제공자 어댑터가 레이어로 쌓여 있다. 아래는 그 레이어를 역할별로 정리한 지도다.

용어
왜 Rust인가
Rust는 메모리 안전성을 컴파일 단계에서 강제하는 시스템 언어다. 보안·암호 인프라에서 인기인 이유는, C/C++에서 악명 높은 메모리 버그(버퍼 오버플로 등)를 언어 차원에서 막아 주기 때문이다. 키와 평문 프롬프트를 다루는 TEE 안의 프로그램이라면, 이런 종류의 취약점 하나가 곧 프라이버시 붕괴다 — 그래서 Rust 선택은 우연이 아니다.

레이어별 기술 지도

레이어기술역할
게이트웨이 런타임Rust 2021 · Axum · tokio · hyperOpenAI 호환 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 해시가 실행 정책 전체를 봉인
용어
Axum / tokio
tokio는 Rust의 대표 비동기 런타임(수많은 요청을 적은 스레드로 처리하는 엔진)이고, Axum은 그 위에서 도는 인기 웹 프레임워크다. 다른 언어로 치면 Node.js의 Express, 파이썬의 FastAPI에 해당. 이 게이트웨이의 모든 HTTP 엔드포인트(/v1/chat/completions 등)가 Axum 라우터로 정의돼 있다.

주요 의존성(Cargo.toml에서 직접 확인)

크레이트쓰임
dstack-sdkdstack KMS 키 발급 + TDX quote 발급. dstack과 대화하는 유일한 통로
dcap-qvl상류 제공자의 TDX/DCAP 증명서를 검증(quote verification library)
ed25519-dalek · k256영수증·신원 서명(Ed25519, secp256k1/이더리움식 복구 서명)
x25519-dalek · ml-kem · hkdfE2EE 키 교환. ML-KEM은 양자컴퓨터 대비 격자기반 KEM
aes-gcm · chacha20poly1305실제 페이로드 암복호화(인증 암호화)
reqwest (rustls-tls)상류로 프롬프트를 보내는 HTTP 클라이언트. OpenSSL 대신 순수 Rust TLS
x509-parser · rustls-pemfileTLS 인증서 파싱 → SPKI 해시 계산(채널 바인딩 증거)
prometheus게이트웨이 자체 메트릭(/v1/metrics)

4아키텍처 심화 분석 — 프롬프트가 금고를 거쳐 검증된 답이 되기까지

"내가 질문을 보내면, 그 한 줄이 TEE 금고 안을 거쳐 '증명서 붙은 답'으로 돌아오기까지 무슨 일이 벌어지나."

이 게이트웨이를 이해하는 가장 좋은 방법은 요청 한 건이 흐르는 길을 끝까지 따라가는 것이다. 먼저 전체 그림을 한 장으로 보자. (아래 구조도는 README의 다이어그램과 docs/frontend-middleware-backend.md를 코드 기준으로 재구성한 것이다.)

┌─────────────────────────────────────────────────────────────────┐ │ 사용자 (OpenAI SDK 그대로) │ │ ① 먼저 증명서 확인: GET /v1/attestation/report?nonce=... │ │ ② 요청 전송: POST /v1/chat/completions (TLS 또는 ACI E2EE) │ └───────────────┬─────────────────────────────────────────────────┘ │ "attested session" (검증된 채널) ▼ ╔═══════════════ TEE 금고 (Intel TDX · dstack v2 기밀 VM) ═══════════╗ ║ ║ ║ [ Frontend ] 공개 엔드포인트 · E2EE 복호 · 헤더 청소 · 영수증 서명 ║ ║ │ UDS ▲ ║ ║ ▼ (미들웨어 켠 경우만) │ 응답은 같은 길로 되돌아옴 ║ ║ [ Middleware ] 선택 · 평문 · 인증/과금/라우팅 (검증사실 못 만듦) ║ ║ │ target route ║ ║ ▼ ║ ║ [ Backend ] 라우트 검증 · 상류 증명 확인 · 채널 바인딩 강제 · 전달 ║ ║ ▲ ║ ║ [ dstack KMS ] 신원·영수증·E2EE 키 발급 [ TDX Quoter ] 증명서 발급 ║ ╚════════╪══════════════════════════════════════════════════════════╝ │ "attested session" (상류도 검증된 TEE인지 확인 후) ▼ ┌─────────────────────────────────────────────────────────────────┐ │ 상류 추론 제공자 (Tinfoil · NEAR AI · Chutes · PhalaDirect · ...) │ │ → 실제 LLM 모델이 도는 곳. 검증 통과해야만 프롬프트가 도착함 │ └─────────────────────────────────────────────────────────────────┘

핵심은 게이트웨이 자체가 모델을 돌리지 않는다는 점이다. 게이트웨이는 TEE 안에 사는 검증 관문이고, 진짜 추론은 또 다른 TEE(상류)에서 일어난다. 게이트웨이의 일은 "양쪽 모두 진짜 금고인지 확인하고, 그 사실을 영수증으로 남기는 것"이다.

핵심 설계 1 — 원격 증명: "진짜 금고였다"를 증명하는 봉인 영수증

이 프로젝트의 심장은 원격 증명(remote attestation)이다. 사용자가 GET /v1/attestation/report를 부르면, 게이트웨이는 인텔 CPU가 하드웨어로 서명한 증거(TDX quote)를 돌려준다. 이 증거에는 "지금 도는 코드의 측정값(해시)", "워크로드 신원", "이 TEE가 보증한 공개키 묶음(keyset)"이 담겨 있다. 사용자는 이걸 로컬에서 검증해, 자기가 대화하는 상대가 변조되지 않은 바로 그 코드임을 확인한다.

용어
원격 증명(remote attestation) · quote
원격 증명은 멀리 있는 컴퓨터가 "나는 지금 이런 코드를, 진짜 안전한 하드웨어에서 돌리고 있어"를 증명하는 절차다. quote(쿼트)는 그 증명서 자체 — CPU 제조사(인텔)의 키로 서명된 데이터 덩어리다. 일상 비유로는 공증받은 봉인 영수증이다. 식당이 "신선한 재료만 썼다"고 말로 하는 대신, 위조 불가능한 공증 도장이 찍힌 영수증을 내미는 것. 사용자가 보낸 nonce(매번 다른 난수)가 영수증에 박혀 있어, 옛날 영수증을 재탕하는 것도 막는다.

핵심 설계 2 — 키는 dstack KMS에서, 신원에 묶인다

게이트웨이는 자기 키를 스스로 만들지 않는다. src/dstack.rs를 보면, dstack KMS에서 신원 키·영수증 서명 키·E2EE 키를 받아 온다. 중요한 건 KMS가 승인된 워크로드(검증된 코드)에만 키를 내준다는 것 — 즉 "이 키로 서명했다"는 곧 "승인된 TEE 안에서 서명했다"와 같은 뜻이 된다. 그래서 README가 "임시 키나 가짜 quote로 뜨는 모드는 아예 없다"고 강조한다. 모든 키와 증명서가 진짜 dstack 경로에서만 나온다.

용어
KMS(키 관리 서비스) · keyset · SPKI 다이제스트
KMS는 키를 안전하게 보관·발급하는 금고지기다. dstack KMS는 "검증된 코드"라는 조건을 만족할 때만 키를 푼다. keyset은 그 TEE가 "이 키들은 내 거야"라고 증명서 안에 적어 둔 공개키 묶음 — 사용자는 응답 서명이 이 묶음 안의 키로 됐는지 확인한다. SPKI 다이제스트는 TLS 인증서 공개키의 SHA-256 지문으로, "내가 접속한 그 서버가 증명서가 말하는 그 TEE"임을 묶어 주는 채널 바인딩 증거다. 비유하면 "전화 건 상대가 진짜 그 사람인지, 미리 공증된 목소리 지문과 대조하는" 것.

핵심 설계 3 — Frontend / Middleware / Backend 삼분할

한 게이트웨이 프로세스 안이 세 역할로 나뉜다(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)을 돌려준다. 내용물(프롬프트)은 그 누구도 중간에 못 열어 본다.

5디렉토리 구조 해부

"폴더가 많아 보이지만, 사실 'src(엔진) + docs(설계·감사) + deploy(배포) + scripts(검증)'로 묶인다."

코드 대부분은 src/ 한 곳에 있고, 나머지는 문서·배포·테스트를 위한 보조 폴더다. README의 'Repository Map'을 코드 구조와 맞춰 풀면 이렇다.

private-ai-gateway/ ├── Cargo.toml 🗺️ Rust 의존성·빌드 정의 (단일 바이너리) ├── entrypoint.sh 🚀 git-launcher가 부르는 진입점 (cargo build --locked) ├── Dockerfile.smoke 🐳 smoke 테스트용 이미지(소스 출처를 conf에 박음) ├── src/ │ ├── main.rs ⚙️ 바이너리 진입점 + 정적 설정 로딩 │ ├── lib.rs 📚 라이브러리 루트 │ ├── dstack.rs 🔑 dstack KMS 키 발급 + TDX quote 발급 (유일한 dstack 통로) │ ├── aci/ 🧩 ACI 프로토콜의 심장 │ │ ├── canonical.rs 정규화 JSON(바이트 보존 해시의 근거) │ │ ├── identity.rs·keys.rs 워크로드 신원·keyset·서명 검증 │ │ ├── receipt.rs 서명 영수증(요청·라우트·검증·응답 이벤트) │ │ ├── e2ee.rs 필드 단위 종단간 암호화 │ │ ├── upstream/ 제공자 어댑터(chutes·openai·tls·router) │ │ └── verifier/ 상류 증명 검증(dcap·dstack·providers) │ ├── aggregator/ 🛠️ 서비스 본체(증명 보고·전달·영수증 마감) │ │ ├── service/ forward·e2ee·receipts·streaming·middleware │ │ ├── upstream_config/ 런타임 상류 설정 + 어댑터 빌더·검증 │ │ ├── session.rs attested-session(검증된 세션 감사 기록) │ │ └── metrics.rs Prometheus 메트릭 │ └── http/app/ 🌐 Axum 라우터 + 미들웨어/백엔드 배선 ├── docs/ 📖 ACI 설계·제공자 리뷰·미들웨어 가이드·로드맵 │ └── providers/ tinfoil·near-ai·chutes·phala-direct 검증/감사 ├── deploy/ 📦 git-launcher · dstack compose 예시 · upstreams 예시 ├── scripts/ ✅ 로컬/Phala smoke 테스트 + 검증기 ├── examples/ 🔬 verify_aci_artifacts 등 검증 예제 바이너리 └── tests/ 🧪 단위·통합 테스트

주요 경로 한눈에

경로역할
src/dstack.rsTEE 세계와 닿는 유일한 지점 — 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.yamlgit-launcher 핀 + 설정 + 상류 시드를 한 파일에 — compose 해시가 정책 전체를 봉인
scripts/local_multi_upstream_smoke.sh모의 상류 2개 + 게이트웨이로 라우팅·영수증·검증 이벤트를 자동 점검
용어
왜 폴더를 이렇게 나눴나?
신뢰 경계를 코드로 못 박기 위해서다. 증명·키 같은 신뢰의 핵심은 src/aci/src/dstack.rs에 모으고, 변할 수 있는 정책(어떤 제공자를 쓸지, 과금은 어떻게)은 docs/providers/ 리뷰와 런타임 설정·미들웨어로 뺀다. 감사자(보안 검토자)가 "신뢰의 핵심 코드"만 집중해 읽을 수 있도록 동선을 설계한 것 — 그래서 README가 제공자별 review.mdaudit-criteria.md를 따로 둔다.

6학습 포인트 (기술별)

"이 한 채에 '기밀 컴퓨팅·원격 증명·E2EE·AI 게이트웨이 설계·dstack 배포'가 다 들어 있다."

AI에 관심 없어도, 보안·시스템 개발자라면 배울 게 가득하다. 분야별로 무엇을 배울지 + 작게 실습할 아이디어를 정리했다.

기술 ①

TEE / 기밀 컴퓨팅 기초

배울 것: "운영체제와 관리자조차 못 보는 격리 구역"이라는 개념의 실체. Intel TDX 기밀 VM이 메모리를 암호화해 호스트로부터 워크로드를 가리는 원리, 그리고 그 위에서 도커 앱을 돌리는 dstack의 역할. 클라우드를 "믿지 않아도 되게" 만드는 새 패러다임.

실습: docs/attested-confidential-inference.md를 읽고 "검증이 증명하는 것 두 가지"(게이트웨이 증명 + 응답 영수증)를 한 문단으로 요약해 보기. "왜 TLS만으로는 부족한가"를 스스로 설명해 보면 기밀 컴퓨팅의 동기가 잡힌다.

기술 ②

원격 증명 — "신뢰를 어떻게 증명하나"

배울 것: quote(하드웨어 서명 증거)와 keyset(TEE가 보증한 공개키 묶음)이 어떻게 "이 응답은 진짜 그 코드가 만든 것"을 보장하는지. nonce로 재전송(replay)을 막는 법, 코드 측정값(measurement)이 무엇인지. 신뢰의 근거를 '평판'에서 '암호학'으로 옮기는 사고방식.

실습: examples/verify_aci_artifacts.rs를 읽고 검증기가 무엇을 순서대로 확인하는지(증명 보고 → keyset → 영수증 서명 → 응답 해시 → 상류 검증 이벤트) 단계로 적어 보기. "어디 하나라도 어긋나면 왜 거부해야 하나"를 연결.

기술 ③

RA-TLS / 암호화 채널 · 채널 바인딩

배울 것: "증명서가 말하는 TEE"와 "내가 실제로 접속한 서버"를 어떻게 하나로 묶는가(채널 바인딩). TLS 인증서의 SPKI 해시를 증명서 안에 박아 두는 기법, 그리고 ML-KEM·x25519·ChaCha20-Poly1305로 짠 필드 단위 E2EE가 TLS 위에 추가 보호를 얹는 방식.

실습: Cargo.toml의 암호 크레이트 목록을 보고 "서명용·키교환용·암호화용"으로 분류해 보기(예: ed25519=서명, x25519/ml-kem=키교환, aes-gcm/chacha=암호화). 각 단계가 흐름의 어디에 쓰이는지 4장 다이어그램과 대조.

기술 ④

AI 추론 게이트웨이 / 프록시 설계

배울 것: 여러 제공자(Tinfoil·Chutes·NEAR AI...)를 하나의 OpenAI 호환 표면으로 통일하는 어댑터 패턴. "사용자 모델 / 라우트 id / 상류 모델 id" 세 이름을 분리하는 라우팅 설계, 그리고 fail-closed·헤더 청소·스트리밍 중계 같은 게이트웨이 실전 기법.

실습: src/aci/upstream/에서 어댑터 하나(예: openai.rs)를 골라 "요청을 어떻게 상류 형태로 바꾸는지" 따라 읽기. README의 provider 표를 보며 제공자마다 검증·바인딩 방식이 어떻게 다른지 표로 정리.

기술 ⑤

dstack / Phala로 배포 — 재현 가능한 신뢰

배울 것: git-launcher고정 커밋을 받아 entrypoint.sh로 빌드·실행하고, 그 소스 출처가 증명 보고에 박히는 흐름. compose.yaml 한 파일이 핀·설정·상류 시드를 모두 담아 compose 해시로 실행 정책 전체를 봉인하는 아이디어 — "배포 자체가 감사 대상"이 되는 설계.

실습: deploy/compose.yamlentrypoint.sh를 같이 읽고 "왜 커밋 SHA를 고정하고, 왜 --locked로 빌드하나"를 한 문단으로 설명. "이게 없으면 증명서가 무엇을 증명하지 못하나"를 연결하면 재현 빌드의 의미가 잡힌다.

7하드웨어 / 시스템 요구사항

"진짜 보안 주장을 하려면 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 등이 있어야 한다.

8직접 해볼 수 있는 실습 과제

"읽기만 하면 안 남는다 — 난이도별로 손을 움직여 보자. (대부분 TEE 하드웨어 없이 가능)"

난이도 ★☆☆ — 입문

1. README대로 신원 게이트웨이 띄우기

Quick Start의 설정 JSON을 만들고 cargo run으로 게이트웨이를 띄운 뒤, curl//v1/attestation/report?nonce=test를 호출해 본다. "추론 라우트 없이도 신원 표면은 증명된다"는 README의 말이 무슨 뜻인지, 반환된 JSON(workload id·keyset digest)을 보며 체감한다.

난이도 ★☆☆ — 입문

2. 증명서(quote) 구조 들여다보기

/v1/attestation/report가 돌려준 JSON을 jq로 펼쳐, workload id · keyset · evidence 필드가 각각 무엇인지 README의 '용어'·'감사자 체크리스트'와 대조한다. examples/dstack_kms_root_from_report.rs를 읽으면 "보고서에서 KMS 루트 키를 어떻게 끄집어내는지"의 감을 얻는다.

난이도 ★★☆ — 초중급

3. OpenAI 호환 호출 붙여 보기 (모의 스모크)

scripts/local_multi_upstream_smoke.sh로 모의 상류 2개 + 게이트웨이를 띄우고, 기존 OpenAI Python/JS SDK의 base URL만 바꿔 /v1/chat/completions를 호출해 본다. 응답 헤더의 x-receipt-id를 꺼내 /v1/aci/receipts/{id}로 영수증을 받아, "내 요청이 어떤 경로로 검증됐는지" 이벤트 로그를 읽는다.

난이도 ★★☆ — 초중급

4. 영수증 검증기 직접 돌려 보기

저장한 report.json·receipt.json으로 cargo run --example verify_aci_artifacts -- --report ... --receipt ... --nonce ...를 실행한다. 검증기가 서명·해시·상류 검증 이벤트를 어떻게 로컬에서 확인하는지 따라 읽으며, "서버가 '검증됨'이라 말해도 믿지 않고 직접 확인한다"는 ACI 철학을 코드로 본다.

난이도 ★★★ — 고급

5. dstack 배포 읽기 + 위협모델 한 장 정리

deploy/compose.yaml·entrypoint.sh·docs/providers/audit-criteria.md를 읽고, "무엇을 신뢰하고(하드웨어·인텔·dstack·고정 커밋), 무엇은 신뢰하지 않는가(호스트 OS·미들웨어 평문 구간)"를 한 장의 위협모델 표로 정리한다. README의 'Limits'와 '감사자 체크리스트'를 근거로, "이 시스템이 실제로 막아 주는 위협과 못 막는 위협"을 구분해 적으면 보안 분석 감각이 크게 는다.

9관련 기술 심화 학습 로드맵

"기밀 컴퓨팅은 처음엔 낯설다 — 개념 → 증명 → 암호 → 배포 순으로 4주 코스를 제안한다."

주차주제학습 자료 / 할 일
1주차기밀 컴퓨팅·TEE 개념Intel TDX·TEE가 "무엇을 누구로부터 가리는지"를 정리. 이 저장소의 docs/attested-confidential-inference.md + Confidential Computing Consortium 입문 글. "TLS vs TEE" 차이를 한 문단으로.
2주차원격 증명 · DCAPquote·measurement·nonce·keyset 용어 정복. examples/verify_aci_artifacts.rs 정독 + 인텔 TDX/DCAP 증명 문서. "검증기가 확인하는 순서"를 단계도로.
3주차응용 암호학 · E2EEed25519 서명, 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 호환 프록시를 직접 짜 보며 "스트리밍 중계·헤더 청소"를 흉내 내 보기.

10핵심 키워드 사전

"이 분야의 영어·암호 용어를 한국어 뜻 + 일상 비유로 한 번에."

용어
TEE (신뢰 실행 환경)
CPU 안의 하드웨어 봉인 격리 구역. 같은 컴퓨터의 관리자·OS도 못 들여다본다. "직원도 못 여는 은행 금고".
용어
Intel TDX (Trust Domain Extensions)
인텔이 만든 TEE 기술. 가상머신 전체를 메모리 암호화로 봉인하는 '기밀 VM'을 가능케 한다. 이 프로젝트가 기대는 하드웨어 토대.
용어
enclave (엔클레이브)
TEE가 만든 그 격리 구역 자체를 부르는 말. "금고 안의 밀실". 그 안의 코드·데이터는 바깥에서 안 보인다.
용어
remote attestation (원격 증명)
멀리 있는 컴퓨터가 "나는 변조되지 않은 이 코드를, 진짜 TEE에서 돌린다"를 증명하는 절차. "공증받은 봉인 영수증을 원격으로 제시".
용어
quote (쿼트)
원격 증명의 증명서 그 자체 — CPU 제조사 키로 서명된 데이터. 코드 측정값·신원·공개키가 담긴 위조 불가 영수증.
용어
RA-TLS (Remote-Attested TLS)
원격 증명을 TLS 연결에 녹여, "내가 연결한 그 서버가 곧 증명된 TEE"임을 한 번에 보장하는 기법. 이 저장소는 SPKI 해시를 증명서에 박는 채널 바인딩으로 같은 목적을 달성한다.
용어
confidential computing (기밀 컴퓨팅)
"사용 중인 데이터(in-use)"까지 암호화로 보호하는 분야. 저장 중·전송 중 암호화를 넘어, 연산하는 순간에도 평문을 가린다.
용어
dstack
TEE 위에서 도커 컨테이너 앱을 안전하게 띄우고 키·증명을 관리해 주는 오케스트레이션 스택(Phala 생태계). 이 게이트웨이가 그 위에서 돈다.
용어
KMS (Key Management Service) · dstack KMS
키를 안전히 발급·보관하는 금고지기. dstack KMS는 승인된(검증된) 워크로드에만 키를 풀어, "이 키 서명 = 승인된 TEE 안에서 서명"을 보장한다.
용어
E2EE (종단간 암호화) · ML-KEM
클라이언트와 검증된 TEE 사이에서 필드 단위로 거는 추가 암호화(TLS 위의 한 겹 더). 키 교환에 ML-KEM(양자컴퓨터에도 견디는 격자기반 방식)을 함께 쓴다.
용어
receipt (영수증) · x-receipt-id
요청·라우트·상류 검증·응답을 모두 해시로 묶어 서명한 per-request 증거 로그. 응답 헤더 x-receipt-id로 번호가 오고, /v1/aci/receipts/{id}로 본문을 꺼내 검증한다.
용어
fail-closed (실패 시 차단)
"확실하지 않으면 멈춘다"는 안전 기본값. 상류 검증이 안 되면 프롬프트를 아예 전송하지 않는다. 반대말 fail-open("일단 통과")은 보안에서 금기.
용어
Phala (Network) · git-launcher
Phala는 dstack 기반 기밀 컴퓨팅 클라우드. git-launcher는 고정 커밋의 저장소를 받아 entrypoint.sh로 빌드·실행하고, 그 소스 출처를 증명에 박아 주는 배포 도우미.

11참고 링크

"공식 저장소부터 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 — 기밀 컴퓨팅 개념 입문