Arcjet: AI 코드에 내장되는 런타임 보안 플랫폼
요약
Arcjet은 AI 코드가 실행되는 런타임 보안 플랫폼으로, 프롬프트 인젝션 감지, 민감 데이터 마스킹, 악용 시도 차단 등 강력한 기능을 제공합니다. 이 플랫폼은 HTTP 요청이 있는 경우 '요청 보호'와 그렇지 않은 경우 '가드 보호' 두 가지 진입점을 통해 AI 에이전트의 모든 액션을 실시간으로 보안 강제 및 감사 기록을 남깁니다.
핵심 포인트
- AI 코드 실행 환경에 특화된 런타임 보안 플랫폼입니다.
- 요청(Request) 기반과 요청 없는 작업(Guard) 기반 두 가지 보호 방식을 제공합니다.
- CLI, 스킬(Skills), Claude Code/Cursor 플러그인 등을 통해 쉽게 통합할 수 있습니다.
- 보안 강제와 함께 모든 액션에 대한 감사(audit) 기록을 남깁니다.
Arcjet은 AI 코드가 작동하는 환경(runtime)에서 작동하는 보안 플랫폼입니다. 프롬프트 인젝션 감지, 에이전트 도구 호출 승인, 민감 데이터 마스킹(redact), 봇 및 악용 시도 차단 기능을 제공합니다. 이는 앱 내부에서 어떤 액션이 발생하기 전에 실시간으로 호출할 수 있는 보안 구성 요소입니다.
여기는 JS를 위한 다양한 Arcjet 오픈 소스 패키지를 담고 있는 모노레포지토리(monorepo)입니다.
사용자의 앱에 포함된 AI 기능과 에이전트는 도구를 호출하고, 데이터를 읽고, API를 호출하는 등 실제 액션을 수행합니다. Arcjet은 이 코드 내부에서 실행되어 각 액션마다 보안을 실시간으로 강제할 수 있게 하며, 어떤 일이 발생했는지 감사(audit) 기록까지 남깁니다.
Arcjet은 두 가지 유형의 진입점(entry point)을 보호합니다. 사용 사례에 맞는 적절한 경로를 선택하세요:
| 진입점 | 사용 시기 | 패키지 |
|---|---|---|
| 요청 보호 (Request protection) | HTTP 라우트 핸들러, API 엔드포인트, 미들웨어 등 Request 객체를 받는 모든 경우. | @arcjet/next, @arcjet/node, @arcjet/bun 등 |
| 가드 보호 (Guard protection) | AI 에이전트 도구 호출, MCP 서버 핸들러, 큐 워커, 백그라운드 작업 등 HTTP 요청이 없는 모든 경우. | @arcjet/guard |
어떤 것을 사용해야 할지 모르겠다면? HTTP 요청이 있다면 프레임워크 SDK를 사용하세요. 그렇지 않다면 @arcjet/guard를 사용하세요.
두 패키지를 같은 프로젝트에서 사용할 수 있습니다.
가장 빠르게 시작하는 방법은 AI 코딩 에이전트를 이용하는 것입니다. 로그인하고 스킬을 설치한 다음, 에이전트가 나머지를 처리하도록 하세요.
npx @arcjet/cli auth login
또한 app.arcjet.com에서 가입하고 키를 관리하거나 Arcjet MCP 서버를 AI 어시스턴트에 연결할 수도 있습니다.
스킬(Skills)은 에이전트에게 프레임워크를 감지하는 문서, SDK 설치 방법, 요청 또는 가드 보호 규칙을 연결하는 방법을 제공합니다.
npx @tanstack/intent@latest install
이는 패키지 코드를 실행하지 않고 node_modules에서 @arcjet/skills(그리고 설치된 경우 @arcjet/guard)를 발견(discover)합니다. 앱의 package.json에 허용 목록(allowlist)을 추가하여 해당 패키지만 스킬을 노출할 수 있도록 하세요:
{
. Editor hooks from
`intent hooks install`
은 보안 경계가 아닌 편의 기능입니다.
독립적인 마켓플레이스 설치(`npx skills add arcjet/skills`)
도 여전히 `arcjet/skills`에서 작동합니다.
버전이 지정된 패키지를 사용하는 것이, `node_modules`에 있는 SDK와 일치하는 스킬을 원할 때 더 좋습니다.
또한 Arcjet 플러그인을 Claude Code 및 Cursor용으로 사용할 수 있으며, 이는 스킬, MCP(Multi-Context Plan), 그리고 코딩 규칙을 번들링합니다.
경고
플랫폼에서 제공하는 클라이언트 IP를 사용할 수 없는 경우, Arcjet은 `X-Forwarded-For`와 같은 포워딩 헤더를 사용할 수 있습니다. 클라이언트는 해당 헤더에 직접 접근하거나 프록시가 클라이언트가 제공한 값을 보존할 수 있는 경우 이를 위조(spoof)할 수 있습니다. Arcjet은 요청을 계속 보호하지만, 각 Arcjet 클라이언트 인스턴스의 수명 동안 하나의 경고를 기록하고 `client_ip_provenance` 디버그 페싯에서 출처를 `unverified-header`로 표시합니다.
운영 환경(production)에서는 애플리케이션이 포워딩 헤더를 덮어쓰거나 안전하게 추가하는 프록시를 통해서만 접근 가능하도록 하고, 모든 신뢰할 수 있는 경유지(hop)를 `proxies`에 나열하십시오. 사용 가능한 경우 `cloudflare()`와 같은 프록시 서비스 도우미를 사용하십시오. 유효하지 않은 프록시 항목과 비어 있지 않은 잘못된 형식의 `ipSrc` 값은 거부됩니다(`ipSrc: ""`는 옵션을 생략하는 것과 동일합니다). `0.0.0.0/0` 또는 `::/0`을 신뢰하면 구성 경고가 발생합니다. `@arcjet/node`에서 `client.clientIpDetails(request)`를 사용하거나, 다른 어댑터에서는 `@arcjet/ip`의 `findIpDetails()` / `resolveClientIp()`를 사용하여 선택 사항을 검사하십시오. 애플리케이션이 주소를 자체적으로 결정하는 경우, 해당 검증된 값을 디버깅 API와 `protect()` 모두에 `ipSrc`로 전달하십시오.
**요청 보호(request protection)** — 프레임워크에 맞는 SDK를 선택하세요:
| Framework | Package | Install |
|---|---|---|
| Next.js | `@arcjet/next` | `npm i @arcjet/next` |
| Node.js | `@arcjet/node` | `npm i @arcjet/node` |
| Bun | `@arcjet/bun` | `bun add @arcjet/bun` |
| Deno | `@arcjet/deno` | `deno add npm:@arcjet/deno` |
| Express | `@arcjet/node` | `npm i @arcjet/node` |
| Fastify | `@arcjet/fastify` | `npm i @arcjet/fastify` |
| Hono | `@arcjet/node` or `@arcjet/bun` | `npm i @arcjet/node` |
| NestJS | `@arcjet/nest` | `npm i @arcjet/nest` |
| Nuxt | `@arcjet/nuxt` | `npm i @arcjet/nuxt` |
| Remix | `@arcjet/remix` | `npm i @arcjet/remix` |
| React Router | `@arcjet/react-router` | `npm i @arcjet/react-router` |
| SvelteKit | `@arcjet/sveltekit` | `npm i @arcjet/sveltekit` |
| Astro | `@arcjet/astro` | `npm i @arcjet/astro` |
**가드 보호(guard protection)를 위해:**
`npm i @arcjet/guard`
코딩 에이전트에게 보호 기능을 구현하도록 요청하세요. 2단계에서 설치한 스킬은 필요한 모든 것을 제공합니다. 예를 들어:
"내 `/api/chat` 경로에 Arcjet 봇 보호 및 속도 제한을 추가해줘"
"MCP 도구 핸들러에 프롬프트 주입 탐지 기능을 갖춘 Arcjet 가드를 추가해줘"
에이전트가 적절한 패키지를 설치하고, 규칙을 구성하며, `protect()` 또는 `guard()` 호출을 연결할 것입니다. 또는 아래에서 전체 보호 목록을 확인하세요.
저희 Discord 서버에 참여하거나 지원을 요청하세요.
- 문서(Documentation) — 전체 참조 및 가이드
- 예제 앱(Example apps) — 모든 프레임워크용 작동하는 스타터 프로젝트
- 청사진(Blueprints) — 일반적인 보안 패턴 레시피
| 기능 | 요청 SDK(Request SDKs) | 가드(Guard) |
|---|---|---|
| 🛑 속도 제한(Rate Limiting) — 토큰 버킷, 고정 창, 슬라이딩 창 | ✅ | ✅ |
| ... | |
**요청 SDK(Request SDKs)** = `@arcjet/next`, `@arcjet/node`, `@arcjet/bun` 등 — HTTP 경로용입니다.
**가드(Guard)** = `@arcjet/guard` — 도구 호출, MCP 서버, 큐 및 HTTP 요청이 없는 모든 것을 위한 것입니다.
- Astro
- Deno
- Express
- FastAPI
- Fastify
- NestJS
- Next.js (실시간 테스트)
- Nuxt
- React Router
- Remix
- SvelteKit
- Tanstack Start
- AI 할당량 제어 (AI quota control)
- 쿠키 배너 (Cookie banner)
- 사용자 지정 규칙 (Custom rule)
- IP 지리 위치 파악 (IP geolocation)
- 피드백 양식 (Feedback form)
- 악성 트래픽 (Malicious traffic)
- 결제 양식 (Payment form)
- 샘플링 트래픽 (Sampling traffic)
- VPN 및 프록시 (VPN & proxy)
문서는 `docs.arcjet.com`에서 확인하세요.
참고: 아래 예시는 설명 목적으로 `@arcjet/next`를 사용합니다. 실제 런타임에 맞는 SDK(예: `@arcjet/node`, `@arcjet/bun`, `@arcjet/sveltekit` 등)로 대체해야 합니다. API는 모든 SDK에서 동일하게 작동합니다.
이 예시는 Vercel AI SDK를 사용하여 Next.js의 AI 채팅 경로를 보호하는 방법을 보여줍니다. 이를 통해 비용을 증가시키는 자동화된 클라이언트를 차단하고, 사용자별 토큰 예산을 강제하며, 메시지 내 민감 정보를 감지하고, 프롬프트 주입 공격이 모델에 도달하기 전에 차단합니다.
// app/api/chat/route.ts
import { openai } from "@ai-sdk/openai";
import arcjet, {
...
`detectPromptInjectionMessage`를 사용하여 사용자의 메시지를 각 `protect()` 호출을 통해 전달함으로써 프롬프트 주입 공격(AI 모델의 지침을 무효화하려는 시도)을 모델에 도달하기 전에 감지하고 차단할 수 있습니다.
import arcjet, { detectPromptInjection } from "@arcjet/next";
const aj = arcjet({
key: process.env.ARCJET_KEY!,
...
Arcjet을 사용하면 허용하거나 거부할 봇 목록을 구성할 수 있습니다. `allow`를 지정하는 것은 다른 모든 봇이 거부됨을 의미합니다. 빈 allow 리스트는 모든 봇을 차단합니다.
사용 가능한 카테고리: `CATEGORY:ACADEMIC`, `CATEGORY:ADVERTISING`, `CATEGORY:AI`, `CATEGORY:AMAZON`, `CATEGORY:APPLE`, `CATEGORY:ARCHIVE`, `CATEGORY:BOTNET`, `CATEGORY:FEEDFETCHER`, `CATEGORY:GOOGLE`, `CATEGORY:META`, `CATEGORY:MICROSOFT`, `CATEGORY:MONITOR`, `CATEGORY:OPTIMIZER`, `CATEGORY:PREVIEW`, `CATEGORY:PROGRAMMATIC`, `CATEGORY:SEARCH_ENGINE`, `CATEGORY:SLACK`, `CATEGORY:SOCIAL`, `CATEGORY:TOOL`, `CATEGORY:UNKNOWN`, `CATEGORY:VERCEL`, `CATEGORY:WEBHOOK`, `CATEGORY:YAHOO`.
또한 이름으로 특정 봇을 허용하거나 거부할 수 있습니다.
import arcjet, { detectBot } from "@arcjet/next";
import { isSpoofedBot } from "@arcjet/inspect";
const aj = arcjet({
...
봇은 카테고리별 및/또는 특정 봇 이름으로 설정할 수 있습니다. 예를 들어, 검색 엔진과 OpenAI 크롤러는 허용하되 다른 모든 봇은 차단하려면 다음과 같이 구성합니다:
detectBot({
mode: "LIVE",
allow: ["CATEGORY:SEARCH_ENGINE", "OPENAI_CRAWLER_SEARCH"],
...
Arcjet은 토큰 버킷(token bucket), 고정 창(fixed window), 슬라이딩 창(sliding window) 알고리즘을 지원합니다. 토큰 버킷은 AI 토큰 예산(token budgets)을 제어하는 데 이상적입니다. 사용자당 지출할 수 있는 최대 토큰 수를 `capacity`로 설정하고, 초당 복원되는 토큰 수를 `refillRate`로, 그리고 요청당 차감할 토큰 수를 `requested`를 통해 `protect()`에서 지정합니다.
`interval`는 문자열(`"1s"` , `"1m"` , `"1h"` , `"1d"`) 또는 숫자로 초를 받을 수 있습니다. IP별이 아닌 사용자별로 제한을 추적하려면 `characteristics`를 사용하십시오.
import arcjet, { tokenBucket } from "@arcjet/next";
const aj = arcjet({
key: process.env.ARCJET_KEY!,
...
요청 내용에서 개인 식별 정보(PII)를 감지하고 차단합니다. 각 `protect()` 호출 시 `sensitiveInfoValue`를 통해 내용을 스캔하도록 전달하십시오. 내장 엔티티 유형에는 `CREDIT_CARD_NUMBER`, `EMAIL`, `PHONE_NUMBER`, `IP_ADDRESS`가 있습니다. 추가 패턴을 위해 사용자 정의 `detect` 콜백도 제공할 수 있습니다.
import arcjet, { sensitiveInfo } from "@arcjet/next";
const aj = arcjet({
key: process.env.ARCJET_KEY!,
...
OWASP Top 10을 포함하여 일반적인 웹 공격으로부터 애플리케이션을 보호합니다.
import arcjet, { shield } from "@arcjet/next";
const aj = arcjet({
key: process.env.ARCJET_KEY!,
...
이메일 주소를 유효성 검사하고 확인합니다. 차단할 유형은 `DISPOSABLE`, `FREE`, `NO_MX_RECORDS`, `NO_GRAVATAR`, `INVALID`입니다.
import arcjet, { validateEmail } from "@arcjet/next";
const aj = arcjet({
key: process.env.ARCJET_KEY!,
...
요청 속성(IP, 헤더, 경로, 메서드 등)에 대한 표현식 기반 규칙을 사용하여 요청을 필터링합니다.
import arcjet, { filter } from "@arcjet/next";
const aj = arcjet({
key: process.env.ARCJET_KEY!,
...
특정 국가의 접근을 제한할 수 있습니다 — 라이선싱, 규정 준수 또는 지역별 출시 시 유용합니다. `allow` 목록은 명시되지 않은 모든 국가를 거부합니다:
filter({
mode: "LIVE",
// US 트래픽만 허용 — 다른 모든 국가는 거부됨
...
익명화된 트래픽이 민감한 엔드포인트에 접근하는 것을 방지할 수 있습니다 — 사기 방지, 지리적 제한 강제 및 오용 감소 시 유용합니다:
filter({
mode: "LIVE",
deny: [
...
더 미묘한 처리를 위해서는 `protect()` 호출 후 `decision.ip` 헬퍼를 사용하세요.
const decision = await aj.protect(request);
if (decision.ip.isVpn() || decision.ip.isTor()) {
return new Response("VPN 트래픽은 허용되지 않습니다", { status: 403 });
...
자세한 내용은 Request Filters 문서, IP Geolocation 청사진(blueprint), 그리고 VPN/Proxy Detection 청사진을 참조하세요.
Arcjet은 모든 요청에 IP 메타데이터를 풍부하게 합니다. 이 헬퍼들을 사용하여 네트워크 신호를 기반으로 정책 결정을 내릴 수 있습니다:
const decision = await aj.protect(request);
if (decision.ip.isHosting()) {
// 클라우드/호스팅 제공업체로부터의 요청은 종종 자동화됩니다.
...
IP 주소만으로가 아니라 사용자 ID, API 키, 세션 등 안정적인 식별자를 사용하여 요청을 추적하고 제한하세요.
const aj = arcjet({
key: process.env.ARCJET_KEYlar!
characteristics: ["userId"], // SDK 레벨에서 선언
...
`@arcjet/guard`는 HTTP 요청 객체가 없는 AI 에이전트 도구 호출 및 백그라운드 작업을 위해 설계된 더 낮은 수준의 API입니다. 이 API를 통해 속도 제한(rate limiting), 프롬프트 주입 감지, 민감 정보 감지 및 사용자 지정 규칙에 대해 호출별 세밀한 제어 기능을 제공합니다.
프레임워크 SDK (`@arcjet/next` 등) |
`@arcjet/guard` |
|
|---|---|---|
설계 목적 | HTTP 요청 보호 | AI 에이전트 도구 호출, 백그라운드 작업 |
요청 객체 | 필수 (`protect(request, ...)` ) | 필요 없음 | 규칙 바인딩 | 규칙을 한 번 구성하고 `protect()` 옵션으로 입력 | 함수로 규칙을 구성하고 호출 시마다 입력과 함께 호출 | 속도 제한 키 | IP 또는 `characteristics` 딕셔너리 | 명시적 `key` 문자열 (전송 전 SHA-256 해시) | 사용자 정의 규칙 | 지원하지 않음 | 유형이 지정된 설정/입력/데이터를 가진 `defineCustomRule`
`npm i @arcjet/guard`
import {launchArcjet, tokenBucket,...}
토큰 버킷(token bucket), 고정 창(fixed window), 슬라이딩 창(sliding window) 알고리즘을 사용할 수 있습니다. 규칙을 한 번 구성한 다음, 각 호출마다 `key` (및 선택적 `requested` 토큰 개수)와 함께 호출합니다.
import {launchArcjet, tokenBucket} from "@arcjet/guard";
const arcjet = launchArcjet({ key: process.env.ARCJET_KEY! });
const limitRule = tokenBucket({
...
import {launchArcjet, fixedWindow} from "@arcjet/guard";
const arcjet = launchArcjet({ key: process.env.ARCJET_KEY! });
const limitRule = fixedWindow({
...
import {launchArcjet, slidingWindow} from "@arcjet/guard";
const arcjet = launchArcjet({ key: process.env.ARCJET_KEY! });
const limitRule = slidingWindow({
...
import {launchArcjet, detectPromptInjection} from "@arcjet/guard";
const arcjet = launchArcjet({ key: process.env.ARCJET_KEY! });
const piRule = detectPromptInjection();
...
AI 자동 생성 콘텐츠
본 콘텐츠는 GitHub AI Coding Assistants의 원문을 AI가 자동으로 요약·번역·분석한 것입니다. 원 저작권은 원저작자에게 있으며, 정확한 내용은 반드시 원문을 확인해 주세요.
원문 바로가기