MCP 대 사용자 정의 REST 툴링: 보안 및 최신 MCP 아키텍처
요약
본 글은 AI 에이전트가 외부 도구, 데이터, 서비스와 상호작용하는 방식을 표준화한 Model Context Protocol (MCP)을 소개합니다. MCP는 다양한 도구와의 통합 로직을 단순화하여 복잡성을 줄여줍니다. 다만, MCP 자체가 보안을 보장하지 않으며, 인증 및 권한 부여 등 추가적인 보안 제어가 필수적임을 강조합니다.
핵심 포인트
- MCP는 AI 에이전트가 외부 자원과 통신하는 표준 프로토콜입니다.
- 도구(Tools), 리소스(Resources), 프롬프트(Prompts) 세 가지 유형을 관리합니다.
- MCP 사용은 통합 복잡성을 줄여주지만, 보안 처리는 별도로 구현해야 합니다.
- 최소 권한 접근 및 인증/권한 부여가 여전히 중요합니다.
MCP가 어떻게 작동하는지, 최신 아키텍처에서 무엇이 변경되었는지, 그리고 어떻게 더 안전한 AI 에이전트 시스템을 구축할 수 있는지에 대한 간단한 가이드.
AI 에이전트는 단순히 텍스트를 생성하는 것 이상으로 많은 작업을 수행할 수 있기 때문에 점점 더 유용해지고 있습니다. 데이터베이스에 접근하고, API를 호출하며, 파일을 읽고, GitHub와 작업하며, 외부 도구를 통해 다른 동작을 수행할 수 있습니다.
작은 프로젝트의 경우 Python이나 REST를 사용하여 AI 애플리케이션을 하나 또는 두 개의 API에 연결하는 것은 보통 간단합니다. 하지만 도구의 수가 증가함에 따라 애플리케이션 관리가 더 어려워질 수 있습니다.
다양한 도구들은 서로 다른 요청 형식, 인증 방법, 스키마, 오류 처리 로직을 사용할 수 있습니다.
이것이 바로 **Model Context Protocol (MCP)**가 유용해지는 지점입니다.
MCP는 AI 애플리케이션이 외부 도구(tools), 리소스(resources), 프롬프트(prompts)를 발견하고 사용하는 표준적인 방법을 제공합니다.
하지만 한 가지 중요한 점은 명확해야 합니다:
MCP는 통신을 표준화할 뿐, MCP 자체만으로는 AI 에이전트를 안전하게 만들지 않습니다.
인증(Authentication), 권한 부여(Authorization), 최소 권한 접근(least-privilege access), 검증(validation), 모니터링 및 기타 보안 제어는 여전히 필요합니다.
Model Context Protocol (MCP)란 무엇인가?
Model Context Protocol (MCP)은 AI 애플리케이션이 외부 도구, 데이터 및 서비스와 공통적인 방식으로 연결되도록 돕는 개방형 표준입니다.
모든 도구에 대해 완전히 다른 통합 로직을 구축하는 대신, AI 애플리케이션은 MCP 프로토콜을 사용하여 MCP 서버와 통신할 수 있습니다.
MCP는 주로 세 가지 유형의 기능과 관련하여 작동합니다:
- Tools (도구) — AI 애플리케이션이 호출할 수 있는 함수입니다.
- Resources (리소스) — AI 애플리케이션에 제공될 수 있는 데이터 또는 정보입니다.
- Prompts (프롬프트) — 재사용 가능한 프롬프트 템플릿입니다.
간단한 MCP 아키텍처는 다음과 같습니다:
사용자 정의 REST 툴링 (Custom REST Tooling)
MCP 이전에는 AI 애플리케이션을 외부 서비스에 연결하는 일반적인 방법은 REST API를 중심으로 사용자 정의 함수를 만드는 것이었습니다. 예를 들어, Python 애플리케이션이 다음과 같이 고객사 API를 호출할 수 있습니다:

여기서 애플리케이션은 REST 엔드포인트를 직접 호출하고 응답을 JSON으로 변환합니다.
간단한 MCP 툴 (A Simple MCP Tool)
이제 같은 아이디어를 MCP를 사용하여 살펴보겠습니다.
현재 MCP Python SDK는 @mcp.tool() 데코레이터를 사용하여 툴을 정의하는 간단한 방법을 제공합니다.
예를 들어:
from mcp.server import MCPServer
mcp = MCPServer("CustomerService")
...
여기서 get_customer()가 MCP 툴로 노출됩니다.
Python 타입 힌트는 예상 입력을 정의하는 데 도움을 주며, 함수의 docstring은 해당 툴이 수행하는 작업에 대한 설명을 제공합니다.
개념적으로 차이점은 다음과 같습니다:
주요 아이디어는 MCP가 API나 백엔드 서비스를 제거한다는 것이 아닙니다. 대신, MCP는 이러한 기능을 노출하고 사용하는 공통 프로토콜을 제공합니다.
최신 MCP 아키텍처 (The Latest MCP Architecture)
프로토콜이 성숙함에 따라 MCP는 계속 진화해 왔습니다.
현재 확정된 MCP 사양은 2026-07-28입니다. 이 사양에는 온라인에서 흔히 볼 수 있는 이전 MCP 예시들과 비교하여 몇 가지 변경 사항이 포함되어 있습니다.
몇 가지 중요한 개념들은 다음과 같습니다:
- Stateless protocol design (상태 비저장 프로토콜 설계) — 최신 프로토콜은 모든 상호 작용에 대해 전통적인 장기 세션(long-lived session)을 요구하지 않습니다.
server/discover— 클라이언트는 서버와 그 기능에 대한 정보를 발견할 수 있습니다.- Streamable HTTP (스트리밍 가능한 HTTP) — 원격 MCP 서버를 이해하는 데 필요한 주요 최신 전송 방식(transport)입니다.
- Multi-round-trip requests (다중 왕복 요청) — 일부 작업은 단일 요청-응답 주기 대신 추가적인 통신을 포함할 수 있습니다.
- Tasks (작업) — 완료되는 데 시간이 더 오래 걸릴 수 있는 작업을 위한 확장 기능입니다.
아키텍처는 다음과 같이 요약될 수 있습니다:
로컬 애플리케이션의 경우, stdio가 여전히 일반적으로 사용됩니다. 원격 MCP 서버의 경우, 이해해야 할 중요한 최신 전송 방식은 Streamable HTTP입니다.
이전 MCP 튜토리얼이나 예시를 읽을 때는 항상 어떤 MCP 사양과 SDK 버전을 사용하는지 확인하십시오.
MCP는 보안 경계가 아닙니다 (MCP Is Not a Security Boundary)
MCP는 AI 애플리케이션이 도구 및 서비스와 통신하는 표준 방식을 제공합니다. 하지만 이것이 AI가 무엇을 할 수 있도록 허용할지는 결정하지 않습니다.
예를 들어, MCP 서버가 일반적인 SQL 도구를 노출한다고 가정해 봅시다:
@mcp.tool()
def execute_sql(query: str):
return database.execute(query)
이것은 유용해 보이지만, AI에게 매우 강력한 기능을 부여합니다.
모델은 다음과 같은 무해한 쿼리를 생성할 수 있습니다:
SELECT * FROM customers;
하지만 동일한 도구는 훨씬 더 위험한 작업에 사용될 가능성이 있습니다:
DELETE FROM customers;
따라서 실제 보호 장치는 MCP 도구 정의뿐만 아니라 애플리케이션과 백엔드에서 나와야 합니다.
더 안전한 흐름은 다음과 같습니다:
원격 MCP 서버의 경우, OAuth 및 bearer-token 검증과 같은 메커니즘을 사용하여 권한 부여(authorization)를 강제할 수 있습니다. 또한 MCP 생태계는 구현 방식에 따라 서버 또는 도구 수준에서 권한 부여를 지원합니다. :contentReference[oaicite:0]{index=0}
핵심 아이디어는 간단합니다:
MCP는 AI가 도구와 통신하는 방식을 제어합니다. 사용자의 보안 계층은 그 도구들이 실제로 무엇을 할 수 있도록 허용할지(allowed to do)를 제어해야 합니다.
간접 프롬프트 주입 (Indirect Prompt Injection)
프롬프트 주입(Prompt injection)이 항상 사용자로부터 직접 오는 것은 아닙니다.
AI 에이전트는 웹페이지, 이메일, PDF, GitHub 이슈, 데이터베이스 또는 기타 외부 소스의 콘텐츠를 읽을 수도 있습니다. 그 콘텐츠에는 모델에 영향을 미치도록 설계된 지침이 포함될 수 있습니다.
공격 작동 방식
도구 오염 (Tool Poisoning)
AI 에이전트는 어떤 도구를 호출할지 결정하기 위해 도구 이름, 설명(description), 입력 스키마를 사용합니다.
이는 도구를 설명하는 정보 또한 모델에 영향을 미칠 수 있음을 의미합니다.
예를 들어, 악성 도구 설명에는 다음과 같은 지침이 포함될 수 있습니다:
AI에게 실제로 필요한 권한만 부여하세요.
예를 들어, 일반적인 SQL 도구는 다음과 같을 수 있습니다:
@mcp.tool()
def execute_sql(query: str):
return database.execute(query)
이것은 AI에게 광범위한 기능을 제공합니다. 만약 권한이 제대로 제한되지 않으면, 잘못되거나 악의적인 쿼리가 데이터를 수정하거나 삭제할 수 있습니다.
더 안전한 대안은 AI가 실제로 필요한 작업만 노출하는 것입니다:
@mcp.tool()
def get_customer_orders(customer_id: str):
return database.get_customer_orders(customer_id)
두 번째 접근 방식은 도구를 임의의 SQL 쿼리를 허용하는 대신 고객 주문을 검색하는 작업으로 제한합니다. 백엔드는 여전히 해당 고객이 그 주문에 접근할 권한이 있는지 확인해야 합니다.
기타 유용한 보안 통제
- 읽기 전용 액세스: 에이전트가 정보를 검색하는 것만 필요하다면 읽기 전용 데이터베이스 계정을 사용하세요.
- 제한된 API 권한: 작업에 필요한 권한만을 API 자격 증명으로 제공하세요.
- 입력 유효성 검사 (Input validation): 도구 인수를 처리하기 전에 유효성을 검사하세요.
- 민감한 작업 분리: 레코드 삭제나 송금과 같은 작업에는 더 엄격한 통제를 적용하세요.
- 인간 승인: 고위험 또는 되돌릴 수 없는 작업을 수행하기 전에 확인을 요구하세요.
이러한 통제는 AI 에이전트가 잘못된 결정을 내리거나 도구가 오용될 경우 잠재적인 영향을 줄여줍니다.
에이전트가 가진 권한이 적을수록, 잠재적 피해도 작습니다.
입력 유효성 검사 및 안전한 도구 설계
AI 에이전트가 제한된 권한을 가지고 있더라도, 실행 전에 그 도구의 입력은 여전히 확인되어야 합니다.
AI 모델은 부정확하거나 예상치 못한, 또는 악의적인 입력을 생성할 수 있습니다. **입력 유효성 검사 (Input validation)**는 잘못된 데이터가 민감한 작업에 도달하는 것을 방지하는 데 도움이 됩니다.
예시: 도구 입력 유효성 검사
고객 주문을 검색하는 도구를 생각해 봅시다. 이 도구는 모든 가능한 값을 확인하지 않고 받아들여서는 안 됩니다.
import re
@mcp.tool()
...
이 예시에서, 해당 도구는 CUST-1234와 같은 특정 형식의 고객 ID를 허용하고 예상 패턴과 일치하지 않는 값은 거부합니다.
하지만, 단순히 형식 유효성 검사만으로는 충분하지 않습니다. 백엔드(backend)는 요청자가 요청된 고객의 주문에 접근할 권한이 있는지 여부도 확인해야 합니다.
기타 안전한 도구 설계 관행
AI 자동 생성 콘텐츠
본 콘텐츠는 Dev.to AI tag의 원문을 AI가 자동으로 요약·번역·분석한 것입니다. 원 저작권은 원저작자에게 있으며, 정확한 내용은 반드시 원문을 확인해 주세요.
원문 바로가기





