토큰 볼트(Token Vault): AI 에이전트를 위한 안전한 OAuth 위임 및 신원 관리
요약
본 글은 AI 에이전트가 외부 API에 접근할 때 발생하는 보안 문제를 다루며, 'Token Vault'라는 안전한 OAuth 위임 및 신원 관리 시스템을 제안합니다. 이 시스템은 LLM에게 실제 자격 증명을 노출하지 않고도 On-Behalf-Of (OBO) 위임을 가능하게 합니다.
핵심 포인트
- LLM 프롬프트에 원본 토큰을 넣는 것은 심각한 보안 위험입니다.
- Token Vault는 불투명 신원 참조를 사용하여 비밀 키를 격리합니다.
- 백엔드 도구 브로커가 핸들을 단기 토큰으로 교환하여 API 호출을 실행합니다.
- 자동 리프레시 관리와 엄격한 소유권 검사를 통해 보안과 편의성을 높였습니다.
기업용 AI 에이전트를 구축할 때, 여러분은 곧 치명적인 보안 딜레마에 직면하게 될 것입니다.
사용자가 에이전트에게 클라우드 스토리지 드라이브의 문서를 검사하고 프로젝트 관리 트래커의 이슈를 업데이트해달라고 요청한다고 가정해 봅시다. 이러한 작업을 수행하려면, 에이전트는 해당 특정 사용자를 대신하여 외부 API를 호출해야 합니다.
그렇다면 어떻게 에이전트에게 이러한 작업을 실행하는 데 필요한 인증 토큰을 제공할 수 있을까요?
초기 프로토타입에서 개발자들은 종종 사용자의 원본 Bearer 토큰을 LLM 시스템 프롬프트나 도구 인자에 직접 주입했습니다.
원본 자격 증명을 LLM 프롬프트나 도구 인자에 넣는 것은 용납할 수 없는 보안 위험입니다.
만약 공격자가 프롬프트 주입 공격(예: 공유 문서 내부에 모델에게 시스템 프롬프트를 출력하도록 지시하는 내용을 숨기는 경우)을 실행한다면, 모델은 사용자의 비밀 키를 채팅창에 유출할 수 있습니다. 게다가, 프롬프트와 완성 내용은 모니터링 도구 및 벡터 캐시에 기록되어 민감한 자격 증명이 평문으로 노출됩니다.
이 문제를 해결하기 위해, 저희는 Token Vault를 설계했습니다. 이는 에이전트가 사용자의 원본 비밀을 전혀 보지 않고도 도구를 실행할 수 있도록 안전한 On-Behalf-Of (OBO) 위임을 가능하게 합니다.
아이디어: 불투명 신원 참조(Opaque Identity References)
Token Vault의 핵심 아이디어는 에이전트의 추론 엔진과 자격 증명 계층을 분리하는 것입니다.
언어 모델에게 자격 증명을 제공하는 대신, 모든 비밀은 격리된 암호화 볼트 서비스 내에 존재합니다:
- 사용자 동의 및 볼트 저장소(User Consent & Vault Storage): 사용자가 통합 기능을 승인하면, 표준 OAuth 인증 코드 흐름이 사용자의 브라우저와 Token Vault 사이에서 발생합니다. 이 볼트는 액세스 토큰과 리프레시 토큰을 암호화하여 저장합니다.
- 불투명한 토큰 참조(Opaque Token References): 볼트는 활성 연결을 나타내는 무작위의 불투명한 참조 식별자(비민감한 핸들)를 생성합니다.
- 프롬프트 없는 실행(Prompt-Free Execution): 에이전트는 오직 이 불투명한 핸들만 보고 전달합니다. 에이전트가 도구(tool)를 호출할 때, 저희 백엔드 도구 브로커(tool broker)가 해당 호출을 가로채서 사용자 세션을 검증하고, 불투명한 핸들을 안전한 네트워크 경계 내부의 단기 토큰으로 교환하며, API 호출을 실행한 후 결과를 반환합니다.
언어 모델(language model), 프롬프트 컨텍스트(prompt context), 그리고 관찰 가능성 로그(observability logs)는 실제 비밀 키에 절대 접근하지 않습니다.
작동 방식이 뛰어난 이유 (How It Worked Well)
- 프롬프트 주입을 통한 자격 증명 유출 방지(Zero Credential Leakage via Prompt Injections): 공격자가 간접적인 프롬프트 주입을 통해 에이전트의 추론 체인(reasoning chain)을 완전히 손상시키더라도, 모델은 토큰을 가지고 있지 않기 때문에 누설할 수 없습니다. 모델은 인증된 세션 외부에서는 쓸모가 없는 불투명한 참조 핸들만 알고 있습니다.
- 자동 리프레시 관리(Automated Refresh Management): 타사 액세스 토큰은 일반적으로 한 시간 후에 만료됩니다. Token Vault가 OAuth 생명주기(lifecycle)를 관리하기 때문에, 사용자의 대화를 중단시키거나 재인증을 요구하지 않고도 저장된 리프레시 토큰을 사용하여 새로운 액세스 토큰을 자동으로 얻습니다.
- 엄격한 호출자 신원 바인딩(Strict Caller-Identity Binding): Token Vault는 암호화된 소유권 검사(cryptographic ownership checks)를 강제합니다. 만약 사용자 B가 에이전트의 세션을 조사하여 사용자 A의 참조 핸들을 사용해 도구를 호출하려고 시도하면, 볼트는 권한 오류와 함께 교환을 거부합니다.
- 깔끔한 관찰 가능성 준수(Clean Observability Compliance): OpenTelemetry 트레이스 및 감사 로그(audit logs)는 데이터 손실 방지 경보를 발생시키거나 텔레메트리 대시보드에 사용자 자격 증명을 노출하지 않으면서 전체 도구 실행 세부 정보를 포착합니다.
주의할 점 (What to Watch Out For)
- 세분화된 범위 제한(Granular Scope Containment): 사용자가 외부 계정을 연결할 때, 최소한으로 필요한 OAuth 범위를 요청해야 합니다. 에이전트가 문서를 읽는 것만 필요하다면, 쓰기 또는 관리자 권한을 절대 요청해서는 안 됩니다. 만약 에이전트가 쓰기 접근이 필요하다면, 사용자가 상향된 범위(elevated scope)를 명시적으로 승인하도록 단계적 확인(step-up confirmation)을 구현해야 합니다.
- 세션 및 토큰 무효화(Session and Token Revocation): 사용자가 귀사의 엔터프라이즈 플랫폼에서 로그아웃하거나 제3자 서비스를 연결 해제할 경우, 토큰 볼트(Token Vault)는 캐시된 자격 증명을 즉시 무효화하고 상위 OAuth 승인(upstream OAuth grant)을 철회해야 합니다. 하나의 도구를 연결 해제하는 것이 저장소에 고아가 된 활성 토큰(orphaned active tokens)을 남겨서는 안 됩니다.
- 새로고침 흐름의 속도 제한(Rate Limits on Refresh Flows): 제3자 신원 제공업체(identity providers)는 토큰 새로고침 엔드포인트에 속도 제한을 설정합니다. 수백 개의 동시 에이전트 실행이 동일한 사용자의 토큰을 동시에 새로고침하려고 시도할 경우, 공급업체의 스로틀링(throttling)을 유발할 수 있습니다. 분산 캐싱 및 잠금(distributed caching and locking)을 새로고침 토큰 교환 주변에 구현해야 합니다.
- 연결 해제 상태의 우아한 처리(Handling Disconnected State Gracefully): 상위 토큰이 만료되어 새로고침할 수 없는 경우(예를 들어, 사용자가 엔터프라이즈 비밀번호를 변경한 경우), 도구 브로커는 에이전트를 예외 처리되지 않은 예외(unhandled exception)로 충돌시키는 대신, 채팅 클라이언트에게 깨끗하고 구조화된 재인증 프롬프트(re-authentication prompt)를 반환해야 합니다.
AI 자동 생성 콘텐츠
본 콘텐츠는 Dev.to AI tag의 원문을 AI가 자동으로 요약·번역·분석한 것입니다. 원 저작권은 원저작자에게 있으며, 정확한 내용은 반드시 원문을 확인해 주세요.
원문 바로가기