모든 조직에는 사명, 즉 존재 이유가 있습니다. 조직은 그 사명을 — 용어, 절차, 시스템, 표준, 그리고 업무 방식과 함께 — 구성원들에게 전달합니다. 구성원들은 다시 이러한 맥락(context)을 자신의 경험과 결합하여 사명을 향해 나아갑니다.
업무는 코드부터 문서와 슬라이드, 관계, 그리고 물리적 세계에서의 결과물에 이르기까지 다양한 형태로 나타날 수 있습니다.
이 중 일부는 명확합니다. 코드는 실행되거나 되지 않거나 둘 중 하나입니다. 에이전트(Agents)는 지난 몇 년 동안 개발자들에게 "작동하는" 코드를 생성하기 위해 이러한 피드백 루프(feedback loop)를 사용해 왔습니다. 하지만 나머지 사람들은 어떨까요?
조직의 나머지 부분에도 동일한 레버리지(leverage)를 제공하는 것은 더 어려운 문제입니다. 에이전트는 회사의 맥락을 이해해야 하며, 사람들이 업무를 수행하기 위해 사용하는 시스템에 접근할 수 있어야 합니다. 에이전트는 그 맥락과 접근 권한을 조직을 사명으로 이끄는 업무로 전환해야 합니다.
이것이 바로 우리가 Cloudflare OS를 만든 이유입니다. 이는 모든 사람에게 그들의 회사 — 회사가 작동하는 방식, 알고 있는 것, 그리고 의존하는 시스템 —를 중심으로 구축된 에이전트와 워크스페이스(workspace)를 제공합니다.
올해 5월, 우리는 Cloudflare의 모든 구성원에게 Cloudflare OS의 첫 번째 버전에 대한 접근 권한을 부여했습니다. 엔지니어링 부서 외의 많은 사람을 포함하여 모든 직무에 걸친 수천 명의 사람들이 매일 이를 사용하여 문서를 만들고 슬라이드를 작성하며, 반복적인 작업을 자동화하고, 데이터를 시각화하여 업무를 돕는 작은 앱들을 구축하고 있습니다.
Cloudflare OS는 또한 Cloudflare의 팀들이 구축한 맥락과 기술의 공유 라이브러리를 모두에게 제공했습니다. 이는 우리의 용어, 절차, 그리고 반복적인 업무를 수행하는 가장 잘 알려진 방식들을 에이전트가 따를 수 있는 지침(instructions)으로 캡처합니다. 한 사람이 무언가를 수행하는 더 나은 방법을 찾아내면, 다른 모든 사람도 그것을 사용할 수 있습니다.
오늘, 우리는 Cloudflare OS의 새로운 버전을 오픈 소스(open sourcing)로 공개합니다. 어떤 조직이든 이를 배포하고, 내부 시스템에 연결하여 자신들만의 것으로 만들 수 있습니다.
첫 번째 버전에서 배운 점
오늘 오픈 소스로 공개하는 Cloudflare OS는 저희가 내부적으로 첫 번째 버전을 운영하며 배운 경험을 바탕으로 구축되었으며, 저희 CIO인 Sam Rhea가 그의 __블로그 포스트 (blog post)__에서 그 여정을 다루고 있습니다.
첫 번째 버전은 개인들이 프라이빗 워크스페이스 (private workspaces)를 통해 에이전트 (agents)와 협업하는 것에 집중했습니다. 앱 (Apps)은 내부 시스템과 연결된 라이브 소프트웨어라기보다는 정적인 상태였으며, 대부분의 결정론적 작업 (deterministic jobs)은 여전히 에이전트 기술 (agent skill)을 다시 실행하고 더 많은 모델 토큰 (model tokens)을 소비해야 했습니다.
협업 과정에서 더 근본적인 과제가 드러났습니다. __MCP 서버 (MCP server)__에 대한 접근 권한은 에이전트가 어떤 도구 (tools)를 호출할 수 있는지는 알려주었지만, 에이전트가 관찰한 기저의 리소스 (underlying resources)가 무엇인지는 알려주지 않았습니다. 사람들이 워크스페이스, 앱, 그리고 결과물을 공유하기 시작하자, 협업 과정에서 누군가가 봐서는 안 될 정보가 노출되지 않도록 보장해야 할 필요성이 생겼습니다.
저희는 이러한 문제들을 해결하기 위해 새로운 기반 위에 Cloudflare OS를 재구축했습니다. 보안 (Security)은 앱을 만들거나 에이전트를 사용하는 모든 사람이 개별적으로 올바르게 구현해야 하는 것이 아니라, 플랫폼의 일부가 되어야 했습니다.
그 결과, 이를 운영하는 기업의 소유가 되도록 설계된 플랫폼이 탄생했습니다. 인터페이스를 맞춤 설정하고, 도구를 연결하며, 조직이 일하는 방식을 담아내는 기술 (skills)과 컨텍스트 (context)를 추가할 수 있습니다.
Cloudflare OS 소개
다른 많은 AI 도구들과 마찬가지로, Cloudflare OS는 브라우저에서의 대화로 시작됩니다. Cloudflare OS를 차별화하는 점은 각 대화가 조직이 큐레이션한 컨텍스트 (context)와 기술 (skills)에 기반한다는 것입니다. 워크스페이스에 목표를 부여하면, 해당 지식을 활용하여 조직이 이미 사용 중인 도구 및 데이터와 함께 그 목표를 달성할 수 있습니다.
BLOG-3379 2.png
Cloudflare OS는 다음 세 가지 요소로 구성됩니다:
에이전트 워크스페이스 (An agent workspace): 회사가 큐레이션한 컨텍스트와 기술에 기반하며, 에이전트가 코드를 작성하고 실행할 수 있는 격리된 런타임 (isolated runtime)을 제공합니다.
새로운 보안 및 거버넌스 프레임워크 (A new security and governance framework): 내부 데이터 및 서비스에 안전하게 접근할 수 있도록 합니다.
개인용 및 수정 가능한 앱을 위한 플랫폼 (A platform for personal, modifiable apps): 사람들이 직접 구축하고, 공유하며, 지속적으로 변경할 수 있는 앱을 위한 플랫폼입니다.
대화로 시작된 것이 문서, 앱, 또는 업무를 지속적으로 수행하는 워크플로 (workflow)가 될 수 있습니다.
기업 내 모든 구성원을 위한 에이전트 워크스페이스 (Agent workspace)
에이전트 워크스페이스 (Agent workspaces)는 조직 내 모든 구성원이 사용할 수 있도록 설계되었습니다. 브라우저를 통해 상호작용하므로, 개발자이거나 터미널 (terminal) 사용법을 알 필요가 없습니다.
워크스페이스 (workspace)는 에이전트 세션 (agent sessions), 지속적인 상태 (persistent state), 출력물 및 파일, 리소스 접근 (resource access), 그리고 에이전트가 코드를 작성하고 실행할 수 있는 격리된 런타임 (isolated runtime)을 결합합니다.
워크스페이스에는 팀이나 회사가 수집한 선별된 컨텍스트 (context)와 기술 (skills)이 탑재되어 있습니다. 더 이상 모든 작업에 대해 바퀴를 다시 발명할 필요가 없습니다. 팀원 중 누군가가 어떤 일을 수행하는 최선의 방법을 찾아냈다면, 모두가 그 혜택을 누릴 수 있습니다. 사람들은 더 이상 작업을 시작할 때마다 모델 (model)에게 동일한 프로세스, 용어, 그리고 모범 사례 (best practices)를 설명할 필요가 없습니다.
수행할 수 있는 몇 가지 작업은 다음과 같습니다:
조사 및 질문하기
워크스페이스에 회사의 컨텍스트 (context)와 사용 가능한 리소스를 사용하여 특정 주제를 조사하도록 요청하십시오. 에이전트는 전체 데이터셋을 모델의 컨텍스트 윈도우 (context window)로 불러오는 대신, 정보를 검색, 필터링, 조인 (join) 및 분석하기 위한 코드를 작성할 수 있습니다.
문서, 슬라이드 및 스프레드시트 생성
워크스페이스는 조사 내용을 계속 편집할 수 있는 문서, 프레젠테이션 또는 스프레드시트로 변환할 수 있습니다. 이러한 출력물은 정적인 파일일 필요가 없습니다. 라이브 데이터 (live data)에 연결된 상태를 유지하고, 소스가 변경됨에 따라 업데이트될 수 있으며, Google Drive와 같은 익숙한 형식이나 서비스로 내보낼 수도 있습니다.
팀을 위한 협업형 연결 앱 생성
문서나 스프레드시트만으로 충분하지 않을 때, 에이전트는 자체 인터페이스, 로직 (logic), 그리고 상태 (state)를 갖춘 앱을 구축할 수 있습니다. 이 앱은 연결된 회사의 리소스를 사용할 수 있으며, 여러 명이 함께 작업하는 것을 지원할 수 있습니다.
결정론적 워크플로 (deterministic workflows) 실행
모든 작업에 전체 에이전트 세션이 필요한 것은 아닙니다. 많은 작업은 한두 군데 정도 판단이 유용한 지점을 제외하면 이미 알려진 단계들의 시퀀스(sequence)로 이루어져 있습니다. 워크스페이스(workspace)는 예측 가능한 단계에는 코드를 사용하고, 가치를 더하는 부분에만 모델을 사용함으로써 이러한 작업들을 대부분 결정론적 워크플로 (deterministic workflows)로 전환할 수 있습니다. 워크플로는 온디맨드(on demand), 스케줄에 따라, 또는 연결된 시스템에서 이벤트가 발생할 때 실행될 수 있습니다.
Cloudflare OS는 게이트키퍼 (Gatekeepers)를 통해 에이전트와 앱이 기록 시스템 (systems of record)에 통제된 방식으로 접근할 수 있도록 합니다 (이에 대한 자세한 내용은 아래 보안 섹션에서 다룹니다). 또한, __MCP 서버 포털 (MCP Server Portals)__을 통해 조직에서 이미 사용 중인 기존의 모델 컨텍스트 프로토콜 (Model Context Protocol, MCP) 서버를 지원합니다.
내부 데이터 및 서비스에 대한 안전한 접근을 위한 새로운 보안 및 거버넌스 프레임워크
사람들이 업무에 AI를 실험적으로 도입하기 시작하면서, 가장 먼저 요청하는 것 중 하나는 종종 회사 시스템에 대한 API 키입니다. 이는 타당한 요구입니다. AI가 사람들이 업무를 수행하는 데 사용하는 시스템에 접근할 수 없다면 업무 현장에서 큰 쓸모가 없기 때문입니다.
하지만 사람과 에이전트에게 API 키를 넘겨주는 것은 위험하며 확장성(scale)이 떨어집니다. 키는 종종 제한하거나 안전하게 공유하고 감사(audit)하기 어려운 광범위하고 장기적인 접근 권한을 제공하기 때문입니다.
MCP는 에이전트가 이러한 시스템을 사용하는 더 나은 방법을 제공합니다. MCP 서버는 에이전트에게 키를 직접 전달하는 대신, 자격 증명 (credential)을 보유하면서 정의된 도구 세트를 노출할 수 있습니다. 하지만 에이전트가 어떤 도구를 호출할 수 있는지 제어하는 것은 첫 번째 단계일 뿐입니다. MCP만으로는 에이전트가 어떤 기저 리소스 (underlying resources)를 관찰했는지 알 수 없습니다. 에이전트는 여러 시스템에 걸친 정보를 결합하여 제한이 덜한 곳으로 보내거나, 원래 리소스를 볼 권한이 없는 사람들에게 앱과 출력을 통해 정보를 노출할 수 있습니다. 따라서 권한 부여 (Authorization)는 데이터가 다음에 어디로 갈 수 있는지를 반드시 고려해야 합니다.
에이전트는 권한이 없는 상태로 시작합니다
__Cloudflare Access__는 누가 Cloudflare OS에 진입할 수 있는지를 제어합니다. 내부에서 모든 에이전트와 앱은 아무런 접근 권한이 없는 상태로 시작합니다. 에이전트는 특정 리소스에 대한 접근 권한을 요청할 수 있으며, 사용자는 이를 허용하거나 거부할 수 있습니다. 생성된 코드는 해당 리소스를 타입이 지정된 바인딩 (typed binding)으로 전달받습니다:
const issues = await env.PROJECT.listIssues({
teamId: "ENG",
state: "open",
...
env.PROJECT는 특정 정책(policy) 하에 특정 리소스를 사용할 수 있는 권한을 나타내는 기능 (capability)입니다. 자격 증명 (credential)은 에이전트 및 생성된 코드로부터 완전히 격리된 상태로 유지됩니다.
서버 코드는 전역 외부 네트워킹 (outbound networking)이 비활성화된 Dynamic Worker에서 실행됩니다. 클라이언트 코드는 브라우저 내의 샌드박스 프레임 (sandboxed frame)에서 실행됩니다. 두 코드 모두 사용자가 명시적으로 제공한 기능 (capabilities)을 통하지 않고는 인터넷에 접속할 수 없습니다.
Gatekeeper가 리소스와 작업을 제어합니다
Gatekeeper는 Cloudflare OS와 외부 서비스 사이에 위치하는 서비스별 __Worker__입니다. Gatekeeper는 해당 서비스의 API, 리소스, 그리고 리소스에 대해 수행할 수 있는 작업들을 이해합니다.
에이전트에게 GitHub 계정 전체에 대한 접근 권한을 부여하는 것은 범위가 너무 넓을 가능성이 높습니다. Gatekeeper를 사용하면 에이전트에게 단일 저장소 (repository)에 대한 접근 권한만 부여할 수 있으며, 이슈 (issue)는 읽을 수 있지만 소스 코드는 읽지 못하게 하거나, 특정 필드를 마스킹 (masking)하고, 속도 제한 (rate limits)을 적용하며, 풀 리퀘스트 (pull request)를 병합하기 전에 승인을 요구하도록 설정할 수 있습니다.
에이전트와 그 앱들은 작은 TypeScript API만을 보게 됩니다. Gatekeeper가 __OAuth__를 처리하고, 자격 증명 (credential)을 보유하며, 정책 (policy)을 집행하고, 무엇이 읽혔는지 기록하며, 외부로 드러나는 부작용 (side effect)이 있는 모든 것을 중재합니다.
BLOG-3379 3.png
정책은 에이전트가 관찰한 내용을 따릅니다
초기 읽기 권한을 제어하는 것만으로는 충분하지 않습니다. 예를 들어, 에이전트가 데이터 웨어하우스 (data warehouse)의 민감한 테이블을 읽고 이를 사용하여 실시간 대시보드를 생성하는 경우를 생각해 보십시오. 대시보드를 공유하는 것이 해당 테이블에 직접 접근할 수 없는 사람들에게 테이블을 공유하는 수단이 되어서는 안 됩니다.
Cloudflare OS는 에이전트가 관찰하는 모든 리소스를 기록합니다. 이러한 관찰 기록은 에이전트 및 그 작업에 계속 부착되어 있습니다. 다른 사람이 워크스페이스 (workspace)를 열려고 하거나, 에이전트와 상호작용하거나, 에이전트가 생성한 결과물을 보려고 할 때, Gatekeeper는 해당 사용자가 관찰된 리소스에 접근할 권한이 있는지 검증합니다.
BLOG-3379 4.png
동일한 관찰 로그(observation log)는 에이전트가 언제 외부 요청을 보낼 수 있는지를 결정하는 정책을 수립하는 데 사용됩니다. 민감한 데이터를 읽는 행위는 에이전트가 특정 소스로 데이터를 쓰거나, 새로운 협업자를 초대하거나, 다른 에이전트에게 업무를 넘기거나, 또는 아웃바운드 요청(outbound request)을 보내는 것을 방지할 수 있습니다.
에이전트를 사용하거나 앱을 구축하는 사람들은 이러한 실수를 저지를까 봐 걱정할 필요가 없습니다. 이제 플랫폼이 이 작업을 처리하도록 사용할 수 있습니다.
개인화 및 수정 가능한 앱을 구축하고 공유하기 위한 플랫폼
대부분의 생산성 제품군(productivity suites)은 문서, 스프레드시트, 프레젠테이션과 같이 고정된 애플리케이션 세트를 제공합니다. Cloudflare OS에서는 각 "파일"이 한 사람, 한 프로젝트 또는 한 팀을 위해 에이전트가 작성한 자체 애플리케이션이 될 수 있습니다.
이것들은 어딘가로 내보내고 배포해야 하는 프로토타입이 아닙니다. 각각은 클라이언트 코드, 서버 코드, API 및 내구성이 있는 상태(durable state)를 갖춘 풀스택 애플리케이션(full-stack application)입니다. 앱은 기본적으로 비공개이지만, 문서처럼 공유할 수 있습니다.
모든 앱은 Worker입니다
워크스페이스에 앱 구축을 요청하면, 에이전트는 다음 두 부분을 작성합니다:
- 브라우저에서 앱의 UI를 렌더링하는 클라이언트 코드 (Client code)
- 상태를 저장하고 앱의 동작을 구현하는 서버 코드 (Server code)
서버는 __Dynamic Worker__로서 필요할 때 로드되며, __Durable Object Facet__로 인스턴스화됩니다 (두 가지 모두 이 프로젝트를 위해 우리가 구축한 기능입니다). 이 Facet은 앱에 이를 관리하는 Cloudflare OS 런타임(runtime)과는 분리된 자체 SQLite 데이터베이스를 제공합니다. Dynamic Worker는 경량 V8 격리(isolates)를 사용하므로, 전용 서버나 컨테이너를 계속 띄워둘 필요 없이 모든 앱이 자체적인 격리된 런타임을 가질 수 있습니다.
BLOG-3379 5.png
브라우저 클라이언트는 Cloudflare의 오픈 소스 객체 역량 원격 프로시저 호출 (object-capability Remote Procedure Call (RPC)) 시스템인 __Cap’n Web__을 사용하여 서버와 통신합니다. 서버 메서드는 일반적인 JavaScript 함수처럼 클라이언트에서 호출될 수 있습니다:
const issues = await app.listIssues({
status: "done",
});
특별한 점은 에이전트 또한 동일한 메서드를 호출할 수 있다는 것입니다.
따라서 당신이 직접 업무를 수행하기 위한 도구를 만들 수 있다면, 에이전트 또한 당신이 자리에 없을 때 그 도구를 사용하여 업무를 수행할 수 있습니다.
앱을 공유하거나, 앱이 구축된 방식을 공유하세요
Cloudflare OS에서 앱을 구축할 때, 이를 공유하는 방법에는 두 가지가 있습니다: