IronJSON을 Cloudflare Workers에 배포하고 API 요청을 처리하는 방법을 단계별로 안내합니다.
IronJSON은 Cloudflare Workers에 최적화된 Rust + WebAssembly 기반 엔진입니다.
rustup target add wasm32-unknown-unknown# 빌드 cargo build --release --target wasm32-unknown-unknown # 또는 build.sh 실행 bash build.sh # wrangler로 배포 npx wrangler deploy
Wrangler 대시보드 또는 wrangler.toml에서 다음 변수를 설정합니다.
| 변수명 | 필수 | 설명 |
|---|---|---|
IRONJSON_RULES | 아니오 | JSON 형식의 규칙 정의. 미설정 시 기본 규칙 사용 |
IRONJSON_API_KEYSecret | 권장 | API 인증 키. 미설정 시 인증 없이 접근 가능 |
# Secret으로 안전하게 저장
npx wrangler secret put IRONJSON_API_KEY
IRONJSON_API_KEY가 설정된 경우, 모든 POST /process 요청은 다음 헤더를 포함해야 합니다:
x-ironjson-key: your-secret-api-key
키가 일치하지 않으면 401 Unauthorized를 반환합니다.
JSON 본문을 전송하면 설정된 규칙에 따라 처리 후 결과를 반환합니다.
POST /process Content-Type: application/json x-ironjson-key: your-api-key // 본문 { "email": "user@example.com", "password": "secret123", "age": 30 }
{
"success": true,
"data": {
"email": "user@example.com",
"age": 30
}
}
응답 헤더에는 처리 시간(x-ironjson-duration-ms)이 포함됩니다.
| 헤더 | 필수 | 기본값 | 설명 |
|---|---|---|---|
x-ironjson-key | 조건부 | - | API 인증 키 |
x-ironjson-path | 아니오 | /api/* | 규칙 매칭에 사용할 경로 |
x-ironjson-method | 아니오 | POST | 규칙 매칭에 사용할 HTTP 메서드 |
x-ironjson-direction | 아니오 | request | 규칙 방향: request, response, both |
x-ironjson-strip-nulls | 아니오 | false | null 값 / 빈 객체 제거 (true / 1) |
x-ironjson-compact | 아니오 | false | 빈 문자열·배열·객체까지 제거 (true / 1) |
규칙은 IRONJSON_RULES 환경 변수에 JSON 배열로 정의합니다.
{
"rules": [
{
"path": "/api/users",
"methods": ["POST", "PUT"],
"direction": "request",
"validate": { ... },
"remove_fields": ["password"],
"include_fields": ["name", "email"],
"mask_fields": ["token"],
"rename": { "old_key": "new_key" },
"value_map": { "status": { "active": 1 } }
}
]
}
path는 Glob 패턴을 지원합니다:
| 패턴 | 매칭 예시 |
|---|---|
/api/users | 정확히 /api/users만 |
/api/* | /api/users, /api/posts (한 단계만) |
/api/** | /api/users, /api/v1/users, /api/a/b/c |
/api/user-* | /api/user-123, /api/user-admin |
/api/user-? | /api/user-1, /api/user-a (한 글자) |
여러 규칙이 매칭되면 경로 세그먼트 수가 많은 규칙이 우선 적용됩니다. 모든 매칭 규칙은 병합(merge)되어 한 번에 처리됩니다.
validate 필드에 JSON Schema 스타일 정의를 작성합니다.
| 필드 | 타입 | 설명 |
|---|---|---|
type | string | object, array, string, number, integer, boolean, null |
required | string[] | 반드시 존재해야 하는 필드 목록 |
properties | object | 각 필드별 하위 스키마 정의 (중첩 가능) |
min_length / max_length | number | 문자열 최소/최대 길이 (유니코드 문자 기준) |
min / max | number | 숫자 최소/최대값 |
min_items / max_items | number | 배열 최소/최대 요소 수 |
unique_items | boolean | 배열 내 중복 금지 |
enum_values | any[] | 허용된 값 목록 |
const_value | any | 고정 값 |
pattern | string | 문자열 포함 여부 패턴 |
format | string | email, url, uuid, date, ipv4 |
additional_properties | boolean | false면 정의되지 않은 필드 금지 |
{
"type": "object",
"required": ["email", "name"],
"properties": {
"email": { "type": "string", "format": "email" },
"name": { "type": "string", "min_length": 1 },
"age": { "type": "integer", "min": 0, "max": 150 },
"tags": { "type": "array", "items": { "type": "string" }, "unique_items": true }
},
"additional_properties": false
}
지정된 필드를 JSON에서 완전히 제거합니다. .으로 중첩 경로를 지정할 수 있습니다.
"remove_fields": ["password", "secret", "user.internal_id"]
지정된 필드만 남기고 나머지는 제거합니다. (최상위 객체에만 적용)
"include_fields": ["name", "email"]
문자열은 *로 대체, 숫자·불리언은 "***"로 대체합니다. 전체 마스킹이며 최대 256자입니다.
"mask_fields": ["token", "api_key", "credit_card"]
old_key → new_key 형식. .으로 중첩 경로 지원.
"rename": { "old_name": "new_name", "user.contact.email": "email_address" }
문자열 필드의 값을 다른 값으로 매핑합니다.
"value_map": { "status": { "active": 1, "inactive": 0, "banned": -1 } }
샘플 JSON을 전송하면 자동으로 JSON Schema를 생성합니다.
POST /infer-schema Content-Type: application/json x-ironjson-key: your-api-key { "name": "John", "age": 30, "email": "john@test.com", "tags": ["rust", "wasm"] }
응답으로 추론된 스키마가 반환됩니다. email 형식은 자동으로 format: "email"로 감지됩니다.
| 상태 코드 | 타입 | 설명 |
|---|---|---|
400 | json_parse / invalid_utf8 / malformed_json | JSON 파싱 실패 또는 형식 오류 |
401 | unauthorized | API 키 누락 또는 불일치 |
413 | payload_too_large | 본문이 1MB 제한 초과 |
422 | validation | 스키마 검증 실패 (상세 내역 포함) |
500 | internal / config_parse | 서버 내부 오류 또는 규칙 설정 오류 |
{
"success": false,
"error": {
"type": "validation",
"message": "Validation failed",
"details": [
{
"path": "$.email",
"message": "Required field 'email' is missing",
"expected": "present",
"found": "missing"
}
]
}
}
{
"rules": [{
"path": "/api/register",
"methods": ["POST"],
"direction": "request",
"validate": {
"type": "object",
"required": ["email", "password"],
"properties": {
"email": { "type": "string", "format": "email" },
"password": { "type": "string", "min_length": 8 }
}
},
"remove_fields": ["password"]
}]
}
→ 비밀번호 최소 8자 검증 + 응답에서 비밀번호 필드 제거
{
"rules": [{
"path": "/api/users/*",
"methods": ["GET"],
"direction": "response",
"remove_fields": ["password_hash", "internal_notes"],
"mask_fields": ["email", "phone"],
"rename": { "user_id": "id" },
"value_map": {
"role": { "admin": "관리자", "user": "사용자" }
}
}]
}
→ 응답에서 내부 필드 제거, 이메일 마스킹, 필드명 변경, 역할값 한글 변환
{
"rules": [{
"path": "/api/**",
"direction": "both",
"mask_fields": ["token", "secret", "api_key", "authorization"],
"remove_fields": ["password", "credit_card"]
}]
}
→ 모든 API 경로에서 민감 정보 자동 마스킹 및 제거