TRENDSHIFT · GITHUB DEEP DIVE

Nango — 800개 API를
한 줄로 연결하는 통합 엔진

OAuth, 토큰 갱신, 동기화, 웹훅까지. SaaS 통합의 모든 반복 작업을 흡수하는 오픈소스 인프라. Replit, Ramp, Mercor가 프로덕션에서 쓰는 그 도구를 코드 단위로 해부한다.

1한 줄 요약

이 레포가 정확히 뭘 하는가.

핵심 메시지

"800개 SaaS API와 내 제품을 잇는
오픈소스 통합 미들웨어."

Nango(낭고)는 OAuth 인증, 토큰 갱신, API 프록시, 데이터 동기화, 웹훅 처리, AI 에이전트용 도구 노출까지 — SaaS 통합에서 매번 다시 짜는 골치 아픈 인프라를 한 곳에 모아 놓은 플랫폼이다. 사용자는 TypeScript 함수만 쓰면 되고, 나머지는 Nango 런타임이 알아서 한다.

오픈소스(Elastic License), 셀프호스팅 가능, 7.4k 스타. 96% TypeScript로 짜인 npm 모노레포에 Postgres와 Redis(+선택적 Elasticsearch)를 곁들인 풀스택 서비스다.

"외부 API 하나 붙이는 데 OAuth 토큰 관리, 재발급, 레이트 리밋, 재시도, 멀티 테넌시 처리하다가 또 하루가 갔다" — 이런 경험이 있다면 Nango가 정조준한 문제다. Auth + Proxy + Functions라는 3가지 원시 기능(primitive)으로 모든 통합 패턴을 흡수한다.

2왜 지금 트렌딩인가

AI 에이전트 시대가 만든 새로운 수요.

2026년 현재 Nango가 TrendShift 상위에 오른 이유는 단순한 "OAuth 라이브러리"가 아니다. AI 에이전트가 외부 SaaS를 호출해야 한다는 새로운 요구가 폭발하면서, 800개 API에 즉시 인증·호출할 수 있는 인프라가 갑자기 인기 카테고리가 된 것이다.

경쟁 제품 대비 차별점

사례 1

Merge, Finch 같은 "Unified API" 대비

Merge·Finch는 카테고리별로 통합 API를 미리 정의해서 던져주는 폐쇄형 SaaS다. 빠르지만 카테고리 밖으로 못 나가고, 비싸고, 블랙박스다.

Nango는 반대로 코드를 직접 보여준다. AI 빌더가 TypeScript 통합 함수를 생성하면 그걸 사용자가 리뷰·편집·버전 관리할 수 있다. "AI 생성, 인간 통제(AI-generated, human-controlled)"가 슬로건이다.

사례 2

Pipedream, Zapier 대비

Zapier 류는 노코드 워크플로 빌더지, 제품 내장 통합 도구가 아니다. 내 SaaS 안에 "Slack 연결하기" 버튼을 박을 때는 도움이 안 된다.

Nango는 embeddable Auth UI(앱에 박는 인증 화면)와 SDK를 준다. 내 사용자가 내 앱 안에서 OAuth를 마치면 토큰은 Nango가 안전하게 보관·갱신한다.

사례 3

Composio, Arcade 같은 신생 AI 도구 플랫폼 대비

2025-2026년 AI 에이전트용 도구 호출(tool calling) 플랫폼이 우후죽순 등장했다. Nango는 그중 가장 오래된 OAuth 인프라(2022년 시작)에 MCP 서버, AI 빌더, 액션 함수까지 후속 레이어로 붙여 "제품 통합 + AI 통합"을 한 곳에서 처리한다.

결정적 매력
"코드로 소유하는 통합"

다른 솔루션은 통합 로직이 SaaS 안에 갇혀 있어서 수정·디버깅·이전이 어렵다. Nango는 통합을 TypeScript 함수로 보고 만질 수 있게 한다. Git에 커밋 가능. CI로 테스트 가능. 그래서 진지한 엔지니어링 팀이 좋아한다.

용어
MCP (Model Context Protocol, 모델 컨텍스트 프로토콜)
Anthropic이 2024년 말 공개한, AI 모델이 외부 도구를 표준화된 방식으로 호출하게 하는 프로토콜. Nango는 사용자의 액션 함수를 MCP 서버로 즉시 노출해서 Claude·Cursor 같은 에이전트가 바로 쓸 수 있게 한다. 이게 최근 트렌딩의 결정타다.

3기술 스택 전체 지도

96% TypeScript 모노레포. 백엔드·프론트엔드·인프라 한눈에.

백엔드 (Node.js 22 + TypeScript 5.8)

packages/serverpackage.json을 직접 까보면 무엇으로 만들어졌는지 분명하다.

웹 프레임워크
Express 5.1 + Helmet + cookie-parser
최근에 정식 출시된 Express 5를 채택. 미들웨어 생태계 그대로 쓰면서 async 에러 처리가 깨끗해진 게 핵심. CORS, body-parser, express-session도 같이 묶었다.
OAuth 처리
simple-oauth2 + passport + oauth
OAuth 2.0은 simple-oauth2, OAuth 1.0a는 oauth 패키지로 둘 다 지원한다(트위터/X 같은 레거시 때문). passport는 Nango 자체 대시보드 로그인용. 사용자가 연결하는 외부 서비스 OAuth는 별도 흐름이다.
데이터베이스 + ORM 대체
PostgreSQL 16 + Knex (마이그레이션) + 자체 records 패키지
Prisma·TypeORM 같은 풀 ORM을 쓰지 않고 Knex 쿼리 빌더로 직접 SQL을 짠다. 마이그레이션은 packages/database/lib/knexfile.cjs 기준으로 관리. 큰 모노레포에서 ORM 추상화가 발목 잡지 않게 한 선택.
큐 / 작업 스케줄러
자체 @nangohq/scheduler + @nangohq/orchestrator + Redis
Bull·BullMQ 같은 기성 큐를 안 쓰고 자체 스케줄러를 만들었다. Postgres에 작업 상태를 저장하고 Redis로 신호를 보낸다. 이유는 동기화·재시도·체크포인트 같은 통합 도메인 특화 동작이 일반 큐 추상화로 풀기 까다로워서.
관측 & 로깅
Elasticsearch 8 + Datadog dd-trace + Sentry
대용량 통합 로그는 Elasticsearch에 쌓고(NANGO_LOGS_ENABLED=true로 켬), 트레이싱은 Datadog APM, 에러는 Sentry. 자체 @nangohq/logs 패키지가 추상화 레이어. Elasticsearch는 옵션이라 자체호스팅 시 빼도 동작한다.
코드 실행 샌드박스
e2b + 자체 Runner 패키지
사용자가 작성한 통합 함수를 안전하게 격리 실행하기 위해 e2b 클라우드 샌드박스 + packages/runner가 별도 프로세스로 떠서 코드를 받아 실행한다. 멀티 테넌트 환경에서 한 고객 코드가 다른 고객 환경을 깨면 안 되므로 필수.
기타 핵심 라이브러리
zod (스키마 검증) · undici (fetch) · soap · botbuilder · axios
제공자 응답을 신뢰할 수 있게 zod로 검증한다. fetch는 Node 22 기본 대신 성능 좋은 undici를 직접 끌어다 쓰고, SOAP API 통합도 가능(soap), 마이크로소프트 봇 프레임워크까지 묶었다.

프론트엔드 (React 18 + Vite 7)

packages/webapp은 Nango 클라우드 대시보드, packages/connect-ui는 사용자 제품에 박는 OAuth 화면, packages/frontend는 브라우저 SDK.

UI 스택
React 18.3 + TypeScript + Vite 7 + Tailwind 4
Tailwind 4(2025 출시)와 Vite 7을 빠르게 채택. 빌더는 SWC 기반 @vitejs/plugin-react-swc로 빌드 속도 우선. 모노레포 안에서 @nangohq/frontend는 npm에 따로 배포되는 사용자용 SDK.
컴포넌트 라이브러리
Radix UI 전수 채택 + Mantine 7 + base-ui
접근성 좋은 헤드리스 UI인 Radix를 거의 모든 primitive(dialog, popover, tabs, select…)에 깔고, 그 위에 Tailwind로 디자인을 입혔다. 폼은 react-hook-form + Tanstack Form, 테이블은 Tanstack Table.
상태/데이터 페칭
SWR + Tanstack Query + Zustand
SWR과 Tanstack Query를 둘 다 두는 건 흔치 않은 선택. 점진적으로 Tanstack으로 옮기는 중일 가능성. 로컬 상태는 Zustand 5로 가볍게 가져간다. URL 상태는 nuqs.
기타 프론트엔드 도구
react-router-dom 6 · recharts · lucide-react · sonner · posthog-js · Stripe
대시보드라서 차트(recharts), 아이콘(lucide-react), 토스트(sonner), 결제 UI(Stripe), 프로덕트 분석(posthog)까지 SaaS 표준 세트가 모두 들어있다.

인프라 (Docker + Postgres + Redis)

services:
  nango-db:        postgres:16.0-alpine     # 핵심 메타데이터
  nango-server:    nangohq/nango-server     # API + 대시보드 + Connect UI
  nango-redis:     redis:7.2.4              # 큐 신호, 캐시
  nango-elasticsearch: elasticsearch:8.13   # (옵션) 로그 검색

docker-compose.yaml 한 파일로 풀스택이 뜬다. 이게 셀프호스팅을 가능하게 하는 핵심. Dockerfile은 멀티스테이지 빌드(precompile → build → web)로 npm workspaces 37개 패키지를 한 이미지에 담는다.

4아키텍처 심화 분석

ASCII 다이어그램으로 본 데이터 흐름.

전체 시스템 구조

┌────────────────────────────────────────────────────────────────┐
│                         사용자 제품 (앱)                         │
│  ┌──────────────┐    ┌────────────────┐                         │
│  │ Connect UI   │    │ @nangohq/node  │  ← 백엔드 SDK            │
│  │ (브라우저 임베드)│   │ @nangohq/frontend│  ← 프론트엔드 SDK     │
│  └──────┬───────┘    └────────┬───────┘                         │
└─────────┼─────────────────────┼─────────────────────────────────┘
          │  OAuth callback     │  REST API
          ▼                     ▼
┌────────────────────────────────────────────────────────────────┐
│                      Nango Server (포트 3003)                    │
│   Express 5 + Helmet + Session                                  │
│   ┌──────────┐  ┌──────────┐  ┌───────────┐  ┌──────────────┐   │
│   │ Auth     │  │ Proxy    │  │ Connect   │  │ MCP Server   │   │
│   │ 라우터   │  │ 라우터   │  │ Sessions  │  │ (tool calling)│   │
│   └────┬─────┘  └────┬─────┘  └─────┬─────┘  └──────┬───────┘   │
└────────┼──────────────┼─────────────┼────────────────┼───────────┘
         │              │             │                │
         ▼              ▼             ▼                ▼
┌────────────────────────────────────────────────────────────────┐
│   Orchestrator ─── Scheduler (작업 큐, 자체 구현)                 │
│         │                                                       │
│         ▼                                                       │
│   Runner (격리 프로세스, e2b 샌드박스 옵션)                       │
│      ↓                                                          │
│   사용자가 작성한 TypeScript 통합 함수 실행                       │
└────────┬───────────────────────────────────────────────────────┘
         │
         ▼
┌──────────────────────────────────────────┐
│  PostgreSQL 16: 연결·토큰·records·로그메타  │
│  Redis 7:       큐 신호, 레이트리밋 카운터    │
│  Elasticsearch: 통합 실행 로그 (옵션)        │
└──────────────────────────────────────────┘

핵심 설계 패턴 3가지

패턴 1

Providers.yaml — 800개 API를 선언으로 처리

800개 API마다 OAuth URL, 토큰 엔드포인트, 스코프, 헤더 형식이 다르다. Nango는 이걸 코드가 아니라 packages/providers/providers.yaml 한 파일로 선언한다. 새 API 추가는 PR 한 줄.

"Provider 선언만으로 OAuth 인증·갱신이 작동하는 구조라, 커뮤니티 기여자가 새 API를 쉽게 붙일 수 있다. 코드 베이스를 건드릴 필요가 없다."
패턴 2

Functions 런타임 — 자체 워크플로 엔진

사용자가 작성한 sync/action 함수를 Temporal 같은 외부 워크플로 엔진 없이 직접 만든 Scheduler + Orchestrator에서 돌린다. 이유는 통합 도메인 특유의 요구(체크포인트, 점진 동기화, 레이트 리밋 백오프, 멀티 테넌시)를 일반 워크플로 엔진으로 풀기 어려워서다.

packages/scheduler + packages/orchestrator + packages/runner가 한 묶음. 큐 상태는 Postgres에 있고 Redis는 신호 채널일 뿐.

패턴 3

Per-tenant isolation — 모든 자원이 environment로 격리

한 Nango 계정 안에 prod/staging/dev 같은 environment가 있고, 각 environment 안에 connection(연결된 사용자 계정), integration(API 설정), record(동기된 데이터)가 모두 격리된다. DB 스키마부터 이 격리가 강제된다.

OAuth 인증 흐름 (Connect UI 사용 시)

(1) 사용자 클릭 ──→ 내 앱 프론트엔드
                       │
                       │ nango.openConnectUI()
                       ▼
(2) Connect UI 모달 열림 (Nango가 호스팅)
                       │
                       │ 사용자가 "Slack 연결" 클릭
                       ▼
(3) Nango Server가 OAuth URL 생성 → Slack으로 리다이렉트
                       │
                       │ 사용자가 Slack에서 권한 승인
                       ▼
(4) Slack → Nango callback URL로 code 전달
                       │
                       │ Nango가 code를 token으로 교환
                       │ 토큰을 암호화해서 Postgres에 저장
                       │ connectionId 생성
                       ▼
(5) 모달이 onEvent("CONNECT") 이벤트 발사
                       │
                       ▼
(6) 내 앱은 connectionId만 받아서 보관
    이후 nango.get({ connectionId, endpoint })로 API 호출
    토큰 만료되면 Nango가 알아서 갱신
비유

호텔의 발레파킹 같은 구조다. 손님(사용자)이 차(OAuth 토큰)를 직접 주차하지 않고 호텔 직원(Nango)에게 키만 넘긴다. 손님은 차 번호표(connectionId)만 들고 다니다가 "내 차 가져와줘"(API 호출) 하면 직원이 알아서 처리한다. 차 검사(토큰 갱신)도 직원이 한다.

5디렉토리 구조 해부

npm workspaces 37개 패키지를 의미별로 묶어보면.

nango/
├── packages/                       ← npm workspaces 본진
│   │
│   ├── ▼ 핵심 서버 4종
│   ├── server/        ← Express 5 메인 서버 (포트 3003)
│   ├── jobs/          ← cron, 정기 작업
│   ├── orchestrator/  ← 작업 큐 관리, 스케줄러 위 한 단계
│   ├── persist/       ← 작업 결과 영속화 전용 서비스
│   │
│   ├── ▼ 워크플로 엔진
│   ├── scheduler/     ← 자체 작업 스케줄러 (Postgres + Redis)
│   ├── fleet/         ← Runner 인스턴스 풀 관리
│   ├── runner/        ← 사용자 함수 격리 실행 프로세스
│   ├── runner-sdk/    ← 함수가 import하는 SDK (nango.get 등)
│   ├── sandbox/       ← 코드 실행 샌드박스 추상화
│   ├── lambda-runner/ ← AWS Lambda 기반 Runner 구현
│   ├── tasks/         ← 작업 단위 정의·추적
│   ├── data-ingestion/← 외부 데이터 수집 파이프라인
│   │
│   ├── ▼ 도메인 패키지
│   ├── providers/     ← providers.yaml + 800개 API 메타데이터
│   ├── records/       ← 동기된 데이터 저장소 추상화
│   ├── webhooks/      ← 외부·내부 웹훅 처리
│   ├── nango-yaml/    ← nango.yaml DSL 파서
│   │
│   ├── ▼ 데이터·저장소
│   ├── database/      ← Postgres + Knex 마이그레이션
│   ├── kvstore/       ← Redis 키밸류 추상화
│   ├── logs/          ← Elasticsearch 로그 인덱싱
│   ├── keystore/      ← 토큰 암호화 보관소
│   ├── kms/           ← 키 관리 서비스 추상화
│   ├── feature-flags/ ← 기능 플래그 관리
│   │
│   ├── ▼ 프론트엔드 3종
│   ├── webapp/        ← Nango 클라우드 대시보드 (React + Vite)
│   ├── connect-ui/    ← 사용자 제품에 박는 OAuth UI
│   ├── frontend/      ← 브라우저 SDK (npm: @nangohq/frontend)
│   ├── design-system/ ← Storybook 컴포넌트 라이브러리
│   │
│   ├── ▼ SDK·CLI
│   ├── node-client/   ← Node.js SDK (npm: @nangohq/node)
│   ├── cli/           ← nango CLI 명령어
│   ├── types/         ← 모든 패키지가 쓰는 TypeScript 타입
│   ├── shared/        ← 서버 측 공통 비즈니스 로직
│   ├── utils/         ← 작은 헬퍼들
│   │
│   ├── ▼ 빌링·과금
│   ├── billing/       ← Stripe 통합
│   ├── usage/         ← API 호출량 측정
│   ├── metering/      ← 과금용 미터링 서비스
│   ├── pubsub/        ← 내부 이벤트 전파
│   ├── email/         ← 트랜잭션 메일
│   └── authz/         ← 권한 체크
│
├── docs/              ← Mintlify 기반 공식 문서
├── scripts/           ← provider 스코프 동기화, llms.txt 생성 등
├── tests/             ← 통합·E2E 테스트
├── dev/               ← docker-compose.dev.yaml (개발용 의존성)
├── github-actions/    ← 커스텀 GitHub Actions
├── .agents/skills/    ← AI 에이전트가 읽는 스킬 가이드
├── .claude/           ← Claude Code 전용 설정
├── docker-compose.yaml
├── Dockerfile         ← 프로덕션용 멀티스테이지
└── Dockerfile.self_hosted
눈여겨볼 점
패키지가 37개나 되는데 뒤엉키지 않는 이유

각 패키지가 자기 영역(server는 HTTP, runner는 실행, scheduler는 큐)만 책임지고, 의존성은 "@nangohq/utils": "file:../utils" 형식으로 명시적으로 걸려 있다. tsconfig.build.json의 references로 TypeScript가 빌드 순서를 자동 계산한다. "모노레포에서 코드 분리"의 모범 사례.

함정
.agents/skills 디렉토리의 의미

이게 흥미롭다. 레포 루트에 .agents/skills/.claude/가 있다는 건 Nango 자체 개발에 AI 에이전트(Claude Code 등)를 적극 사용한다는 뜻이다. 자기 제품(AI 빌더로 통합 함수 생성)을 자기들이 먼저 쓴다는 dogfooding의 흔적.

6학습 포인트

이 레포에서 뽑아낼 수 있는 기술별 인사이트.

OAuth 인프라를 직접 만든다면

학습 1

800개 provider를 코드 아닌 YAML로 처리한 이유

각 provider마다 OAuth flow 코드를 짜면 8만 줄이 된다. packages/providers/providers.yaml을 보면 한 provider당 10~30줄 YAML로 끝낸다. "데이터로 다룰 수 있는 건 코드로 두지 마라"의 교과서.

비슷한 패턴이 적용 가능한 곳: webhook 시그니처 검증, 레이트 리밋 정책, 페이지네이션 방식.

학습 2

토큰 갱신을 안전하게 처리하는 법

토큰 만료 직전(보통 5분 전)에 갱신해야 하는데, 여러 워커가 동시에 같은 connection으로 API를 때리면 갱신이 N번 발생한다. Nango는 Redis 분산 락(@nangohq/kvstore)으로 connection별 갱신을 직렬화한다. 코드를 까보면 락 패턴이 깔끔하다.

npm workspaces 모노레포 운영

학습 3

TypeScript project references

tsconfig.build.json이 packages별 tsconfig를 references로 연결한다. tsc -b 한 번에 의존 순서대로 빌드. 빌드 캐시(tsbuildinfo)로 변경된 패키지만 재빌드한다. 큰 모노레포의 빌드 시간 절약 핵심.

학습 4

concurrently로 7개 서비스 동시 띄우기

npm run dev:watch:apps 명령어 안에 concurrently --names 'srv,web,job,prs,orc,met,con'로 server·webapp·jobs·persist·orchestrator·metering·connect-ui를 한 터미널에서 띄운다. 멀티 프로세스 개발 환경의 정석.

React 프론트엔드 아키텍처

학습 5

Radix UI + Tailwind의 안정적 조합

다른 솔루션(Material UI, Chakra)에 비해 Radix는 접근성·키보드 인터랙션만 책임지고 스타일은 손대지 않는다. 결과적으로 Tailwind와 만나 디자인 자유도가 매우 높다. webapp의 radix-ui, @radix-ui/react-* 임포트를 보면 학습 자료가 된다.

학습 6

임베드 UI를 만드는 법 (Connect UI)

고객 앱에 박는 OAuth 모달(packages/connect-ui)을 별도 빌드로 빼서 iframe·postMessage 패턴으로 호스트 앱과 통신한다. Stripe Elements, Plaid Link 같은 임베드 SDK 만드는 법을 배울 수 있는 사례.

분산 시스템 패턴

학습 7

워크플로 엔진을 직접 만들어야 할 때

Temporal, Inngest, BullMQ 같은 기성 솔루션이 있는데도 자체 스케줄러를 만든 결정의 무게를 느껴볼 만하다. "기성 도구가 도메인 요구를 100% 충족하지 못할 때 어디까지 직접 만들 것인가" 의 실제 사례.

7하드웨어 & 시스템 요구사항

셀프호스팅 / 로컬 개발에 필요한 것.

로컬 개발 (npm run dev)

필수 런타임
Node.js 20 이상 (권장 22) + npm 10+
package.json"engines": { "node": ">=20.0.0" }가 명시. Dockerfile은 22.22.2 사용. nvm으로 22 깔면 안전.
의존 서비스
PostgreSQL 16 + Redis 7 (필수), Elasticsearch 8 (옵션)
docker compose --file dev/docker-compose.dev.yaml up -d로 Postgres와 Redis만 띄우면 충분. 로그 검색이 필요하면 Elasticsearch까지.
디스크 & 메모리
최소 4GB RAM, 5GB 디스크
7개 dev 서비스가 동시에 뜨면 메모리가 꽤 든다. node_modules가 모노레포라 1GB 가깝다. SSD 권장.

프로덕션 셀프호스팅

최소 권장 구성
─────────────────────────────────────────
nango-server      2 vCPU / 4GB RAM
nango-runner(s)   1 vCPU / 2GB RAM × N개 (멀티 인스턴스)
postgres-16       2 vCPU / 4GB RAM / 50GB SSD
redis-7           1 vCPU / 1GB RAM
elasticsearch-8   2 vCPU / 4GB RAM / 100GB SSD (옵션)
주의
platform: linux/amd64 강제

docker-compose.yaml의 nango-server에 platform: linux/amd64가 박혀 있다. Apple Silicon(M1/M2/M3) Mac에서는 Rosetta 에뮬레이션으로 돌아간다. ARM 네이티브 이미지는 아직 공식 배포 안 함.

필수 환경변수 (핵심만)

NANGO_ENCRYPTION_KEY      # 토큰 암호화 키 (32바이트 base64)
NANGO_DB_PASSWORD         # Postgres 비밀번호
NANGO_SERVER_URL          # 외부 callback용 공개 URL
SERVER_PORT=3003
NANGO_LOGS_ENABLED=false  # Elasticsearch 안 쓰면 false

8직접 해볼 수 있는 실습 과제

초급부터 상급까지 4단계.

실습 1 · 초급

로컬에서 Nango 띄우고 GitHub OAuth 연결하기

docker compose up → 대시보드 접속 → GitHub integration 생성 → Connect UI로 내 GitHub 계정 연결 → nango.get({ endpoint: '/user' })로 내 프로필 조회까지. 약 30분 소요.

배우는 것: OAuth 흐름 전체, providerConfigKey vs connectionId 개념, 토큰이 어디 저장되는지.

실습 2 · 초중급

Sync 함수로 GitHub 이슈를 5분마다 동기화

nango-integrations/ 디렉토리에 sync 함수를 작성. nango.yaml에 schedule을 5min으로 설정. CLI로 deploy. 대시보드에서 동기화된 issue 레코드가 records 테이블에 쌓이는 걸 확인. 약 1~2시간.

배우는 것: 점진적 동기화(incremental sync), 체크포인트, 자동 페이지네이션 SDK 사용법.

실습 3 · 중급

새 Provider 추가 PR 보내기

Nango가 아직 지원 안 하는 작은 SaaS의 OAuth를 providers.yaml에 정의 → 로컬에서 동작 확인 → PR. 메인테이너 리뷰 거치며 OAuth flow 디버깅을 배운다. 약 반나절.

배우는 것: OAuth provider별 quirk (스코프 콤마/스페이스 구분, refresh token 헤더 차이 등), 오픈소스 기여 사이클.

실습 4 · 중상급

Nango를 MCP 서버로 Claude Desktop에 붙이기

내가 만든 action 함수를 Nango MCP 엔드포인트(@modelcontextprotocol/sdk)로 노출 → Claude Desktop의 claude_desktop_config.json에 등록 → 채팅에서 "내 Slack에 메시지 보내줘"가 실제로 동작하는 걸 확인. 약 1일.

배우는 것: MCP 프로토콜 구조, tool schema 작성, AI 에이전트와 외부 API 연결 패턴.

실습 5 · 상급

자체 호스팅 Nango에 SSO/SAML 붙이기

코드에 이미 @workos-inc/node가 들어있다. WorkOS 계정 생성 → SAML connection 설정 → Nango 대시보드에 SSO 로그인 추가. enterprise self-hosted 시나리오 시뮬레이션. 약 2~3일.

배우는 것: SAML 흐름, IdP/SP 관계, 엔터프라이즈 인증 구성 실전.

9심화 학습 로드맵

8주짜리 커리큘럼으로 정리.

1~2주차

OAuth 2.0 / OIDC 기초 다지기

RFC 6749 (OAuth 2.0), RFC 6750 (Bearer Token), RFC 7636 (PKCE), OpenID Connect Core 1.0. spec을 직접 읽는 게 결국 빠르다. Authorization Code, Client Credentials, Device Code 흐름 차이까지.

병행해서 Nango providers.yaml에서 OAuth 2.0과 OAuth 1.0a, API key, Basic Auth가 각각 어떻게 다르게 표현되는지 비교.

3주차

Node.js 모노레포 아키텍처

npm workspaces 공식 문서 → pnpm workspaces 비교 → Nx, Turborepo는 왜 안 썼는지 추측해보기. TypeScript project references, tsc -b 빌드 캐시. 빌드 그래프 시각화 시도.

4주차

큐와 워크플로 엔진

BullMQ → Temporal → Inngest → Restate 순서로 비교. 각각이 어떤 도메인 문제에서 빛나는지. 마지막에 Nango의 자체 scheduler 코드를 까서 "왜 직접 만들었나"를 추론.

5주차

React + Vite + Tailwind 4 모던 프론트엔드

Vite 7 + SWC, Tailwind 4의 새 빌드 파이프라인, Radix UI primitive 사용법. Tanstack Query vs SWR. Nango webapp의 라우팅 구조 따라가기.

6주차

분산 시스템 신뢰성 패턴

Idempotency key, exponential backoff with jitter, circuit breaker, dead letter queue. exponential-backoff, rate-limiter-flexible 라이브러리가 Nango에서 어떻게 쓰이는지 추적.

7주차

MCP (Model Context Protocol) 깊이 보기

Anthropic MCP 공식 spec → @modelcontextprotocol/sdk 코드 읽기 → Nango가 어떻게 동적으로 tool schema를 생성하는지 추적. 직접 MCP 서버 하나 만들어보기.

8주차

오픈소스 비즈니스 모델

Elastic License v2 vs AGPL vs BSL 비교. "오픈코어(open core)" 전략. Nango가 어디까지 오픈하고 어디부터 닫는지 LICENSE_SHORT 읽기. Cal.com, Supabase, Posthog와 모델 비교.

10핵심 키워드 사전

Nango 문서·코드에서 자주 만나는 용어들.

기본 개념
Integration (인테그레이션) / Provider
"Slack과의 연결" 같은 한 외부 서비스 설정. providerConfigKey로 식별. 한 environment 안에 여러 integration을 둘 수 있고, 각 integration 아래 여러 connection이 붙는다.
기본 개념
Connection (커넥션)
"내 SaaS 사용자 A씨가 자기 Slack을 연결한 결과". connectionId가 사용자별로 발급된다. 토큰은 이 connection에 묶여 있다. 멀티 테넌시의 기본 단위.
기본 개념
Sync (싱크) / Action (액션)
Sync는 주기적으로 외부 데이터를 가져오는 함수(예: Slack 채널 목록을 매시간 동기화). Action은 호출 시 1회 실행되는 함수(예: 메시지 보내기). 둘 다 TypeScript로 작성.
아키텍처
Environment (환경)
prod, staging, dev 같은 분리 단위. environment마다 별도의 secret key, integration 설정, connection 풀이 존재. 한 계정에 여러 environment를 만들 수 있다.
아키텍처
Records (레코드)
Sync가 가져온 외부 데이터를 저장하는 정규화된 테이블. packages/records가 담당. 사용자는 records를 SDK로 조회하거나 webhook으로 변경 알림을 받는다.
실행 환경
Runner (러너)
사용자 함수를 격리된 프로세스(또는 e2b 샌드박스)에서 실행하는 워커. packages/runner. tRPC로 메인 서버와 통신한다.
실행 환경
Orchestrator (오케스트레이터)
언제 어떤 함수를 어느 runner에 보낼지 결정하는 컴포넌트. packages/scheduler 위에서 동작한다. p-queue로 동시성 제어.
UI
Connect UI / Nango Connect
내 제품에 임베드하는 OAuth 모달. nango.openConnectUI() 한 줄로 띄운다. 사용자가 직접 외부 API 키나 OAuth 화면을 만질 필요가 없게 만드는 화이트라벨 UI.
AI 연동
AI Builder
자연어로 "Salesforce의 closed deals를 매일 동기화해줘" 입력하면 TypeScript sync 함수를 생성하는 Nango 클라우드 기능. 생성된 코드는 사람이 리뷰·수정한다.
라이선스
Elastic License v2
완전 오픈소스(MIT/Apache)는 아니고, "코드를 호스팅 서비스로 팔지 마라" 조항이 붙은 source-available 라이선스. 셀프호스팅·내부 사용·수정·재배포는 자유. AWS가 Elasticsearch를 SaaS로 팔던 사태 이후 등장한 라이선스 계열.

11참고 링크

더 깊이 들어가려면.

필수 자료

1차 소스

GitHub 레포 · github.com/NangoHQ/nango — 6,418 commits, 7.4k stars, 189 releases. master 브랜치가 활발.

공식 문서 · nango.dev/docs — Mintlify 기반. https://nango.dev/docs/llms.txt에 LLM이 읽기 좋게 정리된 인덱스가 있다.

800+ API 카탈로그 · nango.dev/docs/integrations/overview — 어느 API를 지원하는지 한눈에.

코드 레벨

레포 안에서 꼭 읽어볼 파일

packages/providers/providers.yaml — OAuth 메타데이터 800개의 정수.

packages/server/lib — Express 라우터 구조.

packages/scheduler/lib — 자체 스케줄러 구현.

Dockerfile — 모노레포 멀티스테이지 빌드 모범 사례.

docs/spec.yaml — OpenAPI 스펙. API 표면 전체 파악용.

생태계

주변 기술 자료

MCP 공식 · modelcontextprotocol.io

Express 5 마이그레이션 · expressjs.com/en/guide/migrating-5.html

npm workspaces · docs.npmjs.com/cli/v10/using-npm/workspaces

Elastic License v2 비교 · elastic.co/licensing/elastic-license

실용 가이드

지금 시도해볼 만한 것들

  1. 30분 안에 띄워보기. git clonedocker compose up → 대시보드 접속. 토큰 갱신이 실제로 어떻게 일어나는지 Slack OAuth 한 번 끼워서 직접 본다. README만 100번 읽는 것보다 빠르다.
  2. providers.yaml 까보기. 내가 자주 쓰는 SaaS(예: Notion, GitHub)가 어떻게 정의돼 있는지 본다. 새 API를 직접 추가해보면 OAuth flow의 변종을 체득하게 된다.
  3. scheduler 코드 30분만 읽어보기. "기성 큐 안 쓰고 자체 스케줄러 만들면 어떤 코드가 나오나"를 실제로 본다. Postgres를 큐로 쓰는 패턴은 다른 프로젝트에도 응용 가능.
  4. MCP 서버로 노출해보기. action 함수 하나 만들고 Claude Desktop에 연결한다. "AI가 외부 API를 호출하는" 가장 빠른 체험 경로다.
  5. 자기 제품에 끼울지 결정. OAuth 통합을 3개 이상 붙여야 한다면 Nango를 진지하게 검토. 1~2개라면 직접 만드는 게 더 가볍다. 결정의 손익분기점은 보통 "3개 이상 + 멀티 테넌시 필요" 시점.
소스 · NangoHQ/nango master 브랜치 (v0.70.5), 2026-05-28 분석 · github.com/NangoHQ/nango