공유 접두사 캐시의 타이밍 유출
접두사 캐시의 적중 여부는 첫 토큰 응답 시간에 드러날 수 있습니다. 신뢰 그룹별 격리와 PrefixWall의 선택적 격리, 보호 범위의 차이를 살펴봅니다.
사용자 사이에서 공유하는 캐시는 계산을 줄이지만, 적중에 따른 시간 차이가 다른 요청의 입력을 추측하는 단서가 될 수 있습니다.
응답 시간에 남는 입력 흔적
대규모 언어 모델(Large Language Model, LLM)은 프리필 단계에서 입력 토큰의 어텐션 Key와 Value(KV)를 계산합니다. 접두사 캐시는 이전 입력과 앞부분이 일치할 때 이 값을 재사용합니다. 남은 프리필 계산량이 줄면 첫 토큰까지 걸리는 시간인 Time to First Token(TTFT)도 달라질 수 있습니다.
공격자는 추측한 입력으로 요청을 보내고 이 시간 차이를 관측할 수 있습니다. 여러 사용자가 같은 캐시를 쓰면, 추측한 접두사가 다른 사용자의 요청과 일치하는지 판단할 단서가 생깁니다. 응답 본문에서 비밀을 출력하지 않아도 실행 시간으로 정보가 새는 타이밍 부채널입니다.
이 경로는 PrefixWall 논문의 위협 모델을 재구성한 것입니다. 이 글은 2026-09 기준으로 2026-05-20의 arXiv v2와 vLLM v0.15.0 설계 문서를 확인합니다. 캐시 설정에 관한 설명은 확인한 문서 버전에 한정합니다.
캐시 키와 신뢰 그룹
vLLM v0.15.0의 설계 문서는 블록 해시에 부모 블록의 해시와 현재 토큰, 추가 키를 반영한다고 설명합니다. 앞선 입력이 달라지면 뒤 블록의 재사용 조건도 달라지는 구조입니다. 요청에 지정한 cache_salt는 첫 블록 해시에 포함되므로 이후 블록에도 영향을 줍니다.
같은 salt를 사용하는 요청끼리만 KV 블록을 공유할 수 있습니다. 다만 이 필드가 사용자 신원이나 조직 경계를 자동으로 판정하지는 않습니다. 서비스가 어떤 요청을 같은 신뢰 그룹으로 묶을지 정해야 합니다.
| 제어 | 결정하는 것 | 자동으로 해결하지 않는 것 |
|---|---|---|
| 토큰과 부모 블록 해시 | 입력 접두사의 일치 여부 | 서로 다른 사용자의 신뢰 관계 |
| cache_salt | KV 재사용을 허용할 요청 집합 | 사용자 인증과 그룹 배정 |
| 입력 내용의 분리 | 공통 입력과 사용자별 입력의 배치 | 서로 다른 그룹의 캐시 격리 |
같은 공개 지시문을 공유할 수 있다는 판단과 개인 입력을 공유해도 된다는 판단은 다릅니다. 캐시 키를 설계하기 전에 공유할 내용과 공유를 허용할 요청 집합을 함께 정해야 합니다. KV 캐시의 성능 측면은 기존 LLM 서빙 글에서 다룹니다.
소유권에 따른 선택적 격리
캐시 엔트리는 소유권을 추적하는 저장 항목입니다. PrefixWall은 엔트리를 처음 만든 사용자를 OwnerID로 기록합니다.
AttackFlag는 여러 사용자가 그 엔트리를 재사용한 이력을 표시합니다. 소유권과 표시를 함께 사용해 후속 캐시 재사용을 제한하는 방식입니다.
논문 §3.2에서 미표시 엔트리에 다른 사용자가 적중하면, 현재 엔트리를 재사용하면서 표시를 남깁니다. 그 첫 적중을 즉시 거부하는 동작은 아닙니다. 표시된 엔트리에 비소유자가 접근하면 다음 엔트리의 소유권도 확인합니다.
| 상황 | 동작 | 이후 판단에 남는 정보 |
|---|---|---|
| 캐시 미적중으로 엔트리 생성 | 요청자를 소유자로 기록 | 격리 표시는 해제 상태로 시작 |
| 미표시 엔트리에 다른 사용자가 적중 | 현재 엔트리를 재사용하고 표시 | 여러 사용자 간 재사용 이력 |
| 표시된 엔트리의 비소유자가 다음 엔트리를 소유 | 다음 엔트리로 계속 진행 | 소유권 조건을 만족 |
| 표시된 엔트리의 비소유자가 다음 엔트리도 소유하지 않음 | 후속 재사용을 중단하고 재계산 | 이후 구간의 적중 신호를 제한 |
마지막 행에서 재계산하는 것은 뒤에 이어지는 구간입니다. 현재 엔트리에 표시가 있다는 이유만으로 모든 사용자의 캐시 적중을 없애는 정책으로 이해하면 동작을 잘못 옮기게 됩니다. 선택적 격리의 보호 범위도 이 재사용 이력에 의존합니다.
격리 활성화 조건
논문은 재사용 경로를 제한하는 Detector와, 제한을 켜거나 끄는 Activator를 구분합니다. Activator는 최근 TTFT를 적중·미적중으로 나누어 시간 분포를 비교합니다. 두 분포가 충분히 겹치지 않으면 시간으로 구분하기 쉽다고 보고 격리를 활성화합니다.
논문 §3.3은 커널 밀도 추정(Kernel Density Estimation, KDE)으로 이 분포의 겹침을 계산합니다. 겹침이 임계값보다 크면 격리를 끄고, 작으면 켭니다. 격리가 꺼져 있어도 소유권과 표시를 위한 메타데이터 갱신은 계속합니다.
| 구분 | 판단·동작 | 주의할 범위 |
|---|---|---|
| Detector | 소유권과 표시를 바탕으로 후속 재사용 제한 | 보호 예외가 존재 |
| Activator | 적중·미적중 시간 분포로 격리 전환 | 임계값과 측정 구간에 의존 |
| 격리 비활성 상태 | 격리를 해제하고 메타데이터는 갱신 | 이후 활성화에 필요한 이력 유지 |
임계값을 낮추면 구분 가능한 시간 차이가 남아 있어도 격리를 끌 수 있습니다. 부하가 시간 분포를 바꾸는 상황도 검토해야 하므로, 임계값을 캐시 효율만으로 결정하기 어렵습니다. 논문 §4도 이러한 조건을 보호 보장과 함께 설명합니다.
보호 범위와 성능 비교
PrefixWall은 모든 입력 추측을 차단한다고 보장하지 않습니다. 논문 §4의 보장은 알려진 비어 있지 않은 접두사를 전제로 합니다. 접두사에 이미 표시가 있거나 첫 추측이 비밀과 달랐다는 조건도 필요합니다.
| 공격 조건 | 논문의 보호 범위 |
|---|---|
| 첫 캐시 엔트리를 대상으로 한 공격 | 보호 범위에서 제외 |
| 미표시 접두사에서 첫 시도로 정답을 추측 | 보호 범위에서 제외 |
| 알려진 접두사가 있고 기존 표시 또는 첫 오답 조건을 만족 | 명시된 위협 모델 안에서 후속 추측 신호를 제한 |
성능 수치를 읽을 때도 적용한 방어 상태를 구분해야 합니다. 논문 §5.1~5.2의 주평가는 Detector를 상시 활성화한 조건입니다. 그 결과를 Activator가 매번 격리를 전환한 결과로 설명할 수는 없습니다.
| 평가 항목 | 논문 보고 조건·값 | 비교할 때의 제한 |
|---|---|---|
| 서빙 환경 | vLLM 0.8.5의 V1, A100 40GB | 이 글에서 확인한 v0.15.0 문서와 구분 |
| 주평가 요청률 | 초당 1개 요청 | Detector 상시 활성 |
| 캐시 재사용 | 사용자별 격리 대비 최대 70% 증가 | 평균이나 70%p 증가로 해석하지 않음 |
| 지연 | 사용자별 격리 대비 최대 30% 감소 | 모든 부하의 보장값으로 해석하지 않음 |
표의 수치는 논문 보고값이며 이 글에서 재현한 결과가 아닙니다. 비교군은 사용자마다 고유 토큰을 앞에 붙이는 격리 방식이므로, vLLM의 cache_salt와 직접 비교한 측정치로 바꿀 수도 없습니다. Activator 임계값의 영향은 별도 민감도 실험인 §5.3에서 다룹니다.
운영에서 정할 공유 경계
운영에서는 캐시에 넣을 입력과 같은 캐시를 사용할 요청 집합을 먼저 정해야 합니다. 이후 성능 이득을 평가해야 어떤 공유를 유지하려는지와 어떤 정보 노출을 줄이려는지가 분명해집니다. 다음 표는 문서와 논문의 보호 범위를 바탕으로 정리한 검토 항목입니다.
| 검토 항목 | 확인할 내용 |
|---|---|
| 공유할 입력 | 공통 지시문에 사용자별 정보가 섞이는지 확인합니다. |
| 요청의 신뢰 그룹 | 인증된 주체와 salt 배정 규칙을 연결합니다. |
| 응답 시간의 관측 범위 | 다른 사용자가 반복 질의로 적중 차이를 비교할 수 있는지 확인합니다. |
| 보호 제외 조건 | 첫 엔트리·첫 정답 추측 예외가 보호 대상과 겹치는지 확인합니다. |
| 성능 검증 조건 | 격리 방식, 요청률, Detector·Activator 상태를 함께 기록합니다. |
Salt 기반 격리는 공유를 허용할 집합을 미리 나눕니다. PrefixWall은 재사용 이력을 보며 격리를 선택하므로, 도입 시점의 질문과 보호의 전제가 다릅니다. 논문에서 캐시 재사용을 더 유지했다는 결과만으로 서비스의 기밀성 요구를 충족했다고 판단하지 않아야 합니다.
정리
공유 접두사 캐시는 적중으로 줄어든 계산량을 응답 시간 차이로 드러낼 수 있습니다. Salt는 공유할 요청 집합을 나누고, PrefixWall은 소유권과 재사용 이력으로 후속 캐시 접근을 제한합니다. 선택적 격리는 첫 엔트리 공격이나 미표시 접두사에서 첫 시도로 정답을 맞히는 경우를 보호하지 못합니다. 운영에서는 공유 경계와 보호 예외를 먼저 정하고, 같은 방어 상태에서 성능을 비교해야 합니다.