당신의 AI 에이전트가 '느낌(vibes)'으로 권한을 부여받고 있다면: 해결 방법
요약
AI 에이전트의 보안 문제를 해결하기 위해 단순 메모리 검색이 아닌 암호학적으로 강제된 권한 부여(Authorization) 게이트의 필요성을 강조합니다. 인증서(Certificate) 모델을 도입하여 에이전트의 도구 호출 시 권한을 검증하고 변조를 방지하는 구체적인 아키텍처를 제안합니다.
핵심 포인트
- 메모리 검색(Retrieval)과 권한 부여(Authorization)는 별개의 문제임
- 단순 메타데이터가 아닌 암호학적으로 서명된 인증서 기반의 게이트가 필요함
- 인증서를 통해 에이전트의 권한 범위를 정의하고 오프라인에서 즉시 검증 가능
- ML-DSA-65 서명을 사용하여 권한 격상 및 데이터 변조를 방지
AI 에이전트 보안 커뮤니티가 하나의 문제로 수렴하고 있습니다. 최근 한 연구자가 실험을 진행했습니다. 메모리 검색 프레임워크 (memory-retrieval framework)에 서명 (signing), 발급 (issuing), 취소 (revoking), 위임 (delegating)을 포함한 인증서 작업 관련 10가지 시나리오를 입력했습니다. 시스템은 10번 중 8번은 올바른 메모리를 검색했습니다. 외부 권한 부여 게이트 (authorization gate)와 일치한 경우는 10번 중 7번이었습니다.
결론은 이렇습니다: 항목별 메타데이터 (metadata)만으로는 충분하지 않습니다. 제안된 작업에 대해 별도의 권한 부여 게이트 (authorization gate)가 필요합니다.
그 결론은 옳습니다. 하지만 저는 그 게이트를 실제로 구축할 때 어떤 모습인지 보여드리고 싶습니다. 왜냐하면 그 기본 요소 (primitive)는 이미 존재하며, LLM (Large Language Models)보다 더 오래되었기 때문입니다.
문제는 검색 (retrieval)이 아니라 권한 부여 (authorization)입니다
오늘날 대부분의 에이전트 프레임워크 (agent frameworks)는 메모리 (memory)와 관찰 가능성 (observability)에 투자합니다. 에이전트는 이전에 무엇을 했는지 기억해낼 수 있습니다. 에이전트가 어떤 도구 (tools)를 호출했는지 볼 수 있습니다. 로그 (logs), 트레이스 (traces), 대시보드 (dashboards)를 통해서 말이죠.
하지만 그들에게 없는 것은 다음과 같은 질문에 대한 암호학적으로 강제된 (cryptographically enforced) 답변입니다: 이 에이전트가 이 작업을 수행하기 전에, 이를 수행할 권한을 부여받았는가?
이것들은 서로 다른 문제입니다. 검색 (Retrieval)은 에이전트가 자신의 권한에 대해 무엇을 기억하고 있는지를 알려줍니다. 권한 부여 (Authorization)는 실행 시점에 서명되고 변조가 불가능한 (tamper-proof) 상태로 실제로 무엇을 허가받았는지를 알려줍니다.
메모리에서 "나는 취소 권한이 있다"를 검색한 뒤, 건드려서는 안 될 인증서를 취소해 버리는 에이전트는 검색 계층 (retrieval layer)에서의 권한 부여 실패가 아닙니다. 그것은 게이트 계층 (gate layer)에서의 권한 부여 실패입니다. 왜냐하면 게이트가 없었기 때문입니다.
인증서 (Certificates)가 바로 그 게이트입니다
인증서 (certificate)는 엔티티 (entity)가 무엇을 할 수 있도록 권한을 부여받았는지에 대한 서명된 선언 (signed declaration)입니다. 한 번 발급되면 약 1ms 내에 오프라인에서 검증 가능하며, 즉시 취소할 수 있습니다. 우리는 TLS, IoT 기기, 코드 서명 (code signing)을 위해 인증서를 사용해 왔습니다. 동일한 기본 요소 (primitive)가 에이전트에게도 작동합니다.
모델은 간단합니다:
- Orchestrator (오케스트레이터)가 배포 시점에 인증서를 발급합니다.
- 인증서는
meta에 에이전트의 신원(identity)과 정확한 권한 범위(scope)를 포함합니다. - 모든 도구 호출(tool call)은 인증서를 오프라인으로 검증하는 게이트(gate)를 통과해야 합니다.
- 완료 — 또는 중단, 혹은 타임아웃 — 시 오케스트레이터가 이를 폐기(revoke)합니다.
// Orchestrator — dispatch
const { certificate, meta } = await pq.ca.issue({
subject: `agent_payment_processor_run_${runId}`,
...
인증서는 ML-DSA-65로 서명됩니다. 발급 후 meta를 수정하려는 모든 시도는 서명을 무효화합니다. 에이전트는 자신의 권한 범위(scope)를 스스로 격상(promote)할 수 없습니다.
게이트 — 오프라인, 0개의 토큰, 약 1ms
function verifyAgentScope(certificate, requiredScope) {
// Signature + expiry — offline, no API call
const { valid, error, cert } = pq.ca.verifyCert(certificate, rootCert)
...
실행 전, 모든 도구 호출(tool call):
async function processPendingPayments(certificate) {
verifyAgentScope(certificate, {
action: "execute",
...
인증서가 이 동작을 허용하지 않는다면, 게이트는 외부 호출이 이루어지기 전에 오류를 발생시킵니다. 호출된 후에가 아닙니다. 로그에 남기 전에도 아닙니다.
폐기(Revocation)를 통한 윈도우 차단
수명이 짧은 인증서는 정상적인 경로(happy path)를 처리합니다. 즉각적인 폐기(eager revocation)는 그 외의 모든 상황을 처리합니다.
async function runAgent(task, scope) {
const { certificate, certId } = await dispatchAgent(task, scope)
...
finally 블록은 선택 사항이 아닙니다. 실행 도중 에이전트가 침해(compromised)당할 경우, 오케스트레이터는 즉시 revokeCert()를 호출할 수 있으며 — 침해된 에이전트에 대한 다음 게이트 검사는 즉시 실패합니다.
이것이 바로 메모리 검색(memory-retrieval) 방식이 할 수 없는 일입니다. 검색된 메모리를 소급하여 검색되지 않은 상태로 되돌릴 수는 없습니다. 하지만 인증서는 폐기할 수 있습니다.
패킷 실험(packet experiment)에서 해결되는 문제
이 포스트를 시작하게 만든 실험으로 돌아가 보겠습니다 — 외부 게이트와 일치하지 않았던 4가지 사례들:
과도한 권한 위임 (Excessive delegation) — meta 내의 delegate_depth 필드를 사용하여, 하위 에이전트(sub-agent)가 이슈를 발생시킬 때마다 값을 1씩 감소시킵니다. 이 값이 0에 도달하면 게이트(gate)가 권한 위임을 차단합니다. 에이전트는 자신에게 부여된 것보다 더 깊은 수준의 권한 위임을 스스로 부여할 수 없습니다.
검증 없는 이슈 (Issue without verification) — meta 내의 verification_required: true 설정입니다. 게이트는 사람이 승인할 때까지 실행을 차단합니다. 승인 요청에는 인증서 ID, 범위(scope), 만료 시간 등 정보에 기반한 결정을 내리는 데 필요한 모든 정보가 포함됩니다.
모호한 배치 (Ambiguous batch) — 게이트는 배치(batch)당 한 번이 아니라, 작업(operation)당 한 번 실행됩니다. 배치의 각 항목은 동일한 게이트를 통과합니다. 따라서 범위(scope)가 "일부 항목"을 포함하는지 아니면 "모든 항목"을 포함하는지에 대한 모호함이 없습니다.
프로젝트별 권한 취소 (Revocation by project) — resource_scope: "certs:own" 대 "certs:*"의 차이입니다. 게이트는 범위(scope) 문자열을 확인합니다. certs:own 권한을 가진 에이전트는 메모리에서 무엇을 검색하든 상관없이, 자신이 발행하지 않은 인증서를 취소할 수 없습니다.
모든 경우에서 해결책은 동일합니다: 검색 계층(retrieval layer)이 아닌 게이트(gate)에서 강제해야 합니다.
양자 내성(Post-quantum) 관점
여기서는 서명 인프라가 중요합니다. 만약 이를 RSA나 ECDSA 기반으로 구축한다면, 양자 컴퓨터가 깨뜨릴 수 있는 알고리즘 위에 구축하는 셈입니다. NIST는 2024년 8월에 ML-DSA-65 (FIPS 204)를 확정했으며, 위의 예시들에 사용된 인증서 서명은 해당 표준을 사용합니다.
지금 권한 부여 계층(authorization layer)을 구축한다는 것은, 위협이 현실화되었을 때도 견딜 수 있는 알고리즘 위에 구축함을 의미합니다. 나중에 마이그레이션하는 비용은 오늘 제대로 구축하는 비용보다 훨씬 더 높습니다.
FIPSign은 이를 위해 제가 구축한 API로, 양자 내성 인증서, 서명 및 권한 취소를 서비스 형태로 제공합니다. Private CA 기능이 위에서 설명한 에이전트 권한 부여 모델을 구동합니다. JS/TS 및 Python SDK를 사용할 수 있습니다. 게이트 자체는 토큰 비용이 들지 않으며, 발행(issuance)과 취소(revocation)에 대해서만 비용이 청구됩니다.
에이전트 시스템의 권한 부여 격차(authorization gap)는 기존의 프리미티브(primitives)로 해결 가능한 문제입니다. 에이전트 보안을 연구하고 있으며 아키텍처, 특히 권한 위임 체인(delegation chain) 문제에 대해 논의하고 싶다면 댓글을 남겨주세요.
AI 자동 생성 콘텐츠
본 콘텐츠는 Dev.to AI tag의 원문을 AI가 자동으로 요약·번역·분석한 것입니다. 원 저작권은 원저작자에게 있으며, 정확한 내용은 반드시 원문을 확인해 주세요.
원문 바로가기