JSON Schema 검증기
JSON Schema 온라인 검증기. Draft 2020-12, 2019-09, Draft-07 지원에 JSON Pointer 경로 단위 오류 메시지. 100% 브라우저 처리, 업로드 없음, 무료.
JSON Schema 검증기란 무엇인가요?
JSON Schema 검증기는 두 JSON 문서 - 데이터 문서와 스키마 문서 - 를 받아 데이터가 스키마의 계약을 따르는지 보고하는 프로그램입니다. 스키마는 고정된 어휘(type, properties, required, items, enum, oneOf, allOf, $ref, format)를 사용해 필드 타입, 필수 키, 값 범위, 허용 enum 값, 정규식 패턴, 구조 규칙을 선언합니다. 검증기는 두 문서를 병렬로 순회하며 0개 이상의 오류를 발산하고, 각 오류는 데이터 내부의 JSON Pointer 경로에 고정됩니다.
유효성 검사는 신뢰할 수 없는 입력과 코드 사이의 경계, 즉 런타임에 실행됩니다. TypeScript 타입은 컴파일타임에 사라지므로 webhook이나 외부 API, 사용자 붙여넣기로 들어오는 JSON에는 도움이 되지 않습니다. 그 빈틈을 정확히 메우는 게 JSON Schema입니다. TypeScript(또는 Python의 Pydantic)와 함께 쓰면 코드베이스 내부의 컴파일타임 보장과 경계의 런타임 보장을 모두 얻습니다.
Draft 2020-12는 현행 스펙이며 2026년 신규 프로젝트에서 선택해야 할 버전입니다. 이전 드래프트(2019-09, Draft-07, Draft-06, Draft-04)는 레거시 코드베이스에 남아 있으며, 특히 Draft-07은 Helm 차트, VS Code 설정, 구버전 Ajv 설정에서 여전히 흔합니다. OpenAPI 3.1은 Draft 2020-12를 네이티브로 사용하고, OpenAPI 3.0은 Draft 4 부분집합을 사용합니다.
이 도구는 전적으로 브라우저에서 실행됩니다. 사용자의 JSON, 스키마, 검증 출력이 기기를 벗어나지 않으므로 비공개 API 계약과 민감한 페이로드에 안전합니다. 내부 $ref 포인터는 자동 해석되고, 외부 HTTP ref는 프라이버시 보존을 위해 의도적으로 비활성화되어 있습니다.
인접 JSON 도구와 함께 쓰시나요? 붙여넣기 전에 JSON Formatter로 포맷하고, JSON Diff로 두 JSON 문서를 비교하고, JSON to YAML과 YAML to JSON으로 변환하세요. Node, Python, 브라우저에서의 종단간 검증은 JSON Schema 유효성 검사 가이드를 참고하세요.
// A 5-line schema that catches three real bugs
const schema = {
"$schema": "https://json-schema.org/draft/2020-12/schema",
"type": "object",
"properties": {
"id": { "type": "integer", "minimum": 1 },
"email": { "type": "string", "format": "email" },
"age": { "type": "integer", "minimum": 0, "maximum": 150 }
},
"required": ["id", "email"],
"additionalProperties": false
};
// Three bugs the schema catches:
const bad = { "id": "42", "age": 200 };
// /id → type: expected integer, got string
// /email → required: missing
// /age → maximum: 200 > 150
// In Node: new Ajv().compile(schema)(bad) // false; ajv.errors has the paths
// In Python: jsonschema.validate(bad, schema)
// In the browser: this tool — same errors, same paths, no install 주요 기능
다중 드래프트 지원
Draft 2020-12 (기본값), 2019-09, Draft-07. 스키마의 $schema URI에서 드래프트를 자동 감지하며, $schema가 없는 스키마용 폴백 선택기 제공.
정확한 경로 오류
모든 오류는 JSON Pointer(예: /user/email/0), 실패한 키워드(type, required, pattern), 한 줄 메시지를 포함합니다. 클릭으로 해당 위치 이동.
라이브 유효성 검사
입력하는 동안 검증합니다. 오류가 실시간으로 갱신되므로 Validate 버튼을 왕복하지 않고 스키마와 데이터를 반복 수정할 수 있습니다.
format 키워드 커버리지
email, uri, uuid, date, date-time, ipv4, ipv6, hostname, regex - 실제로 쓰는 format을 검증된 패턴으로 처리합니다.
100% 브라우저 처리
입력값이 기기를 벗어나지 않습니다. 업로드 없음, 붙여넣은 내용에 대한 분석 없음, JSON의 localStorage 저장 없음. 비공개 계약과 민감한 페이로드에 안전합니다.
샘플 스키마, 원클릭
로드 가능한 프리셋(가입 폼, webhook 봉투, 설정 파일, 주문 배열)으로 5초 안에 동작하는 검증 시나리오에 도달합니다.
예시
유효 객체 - required + 타입
{
"id": 42,
"email": "alice@example.com",
"age": 30
} {
"$schema": "https://json-schema.org/draft/2020-12/schema",
"type": "object",
"properties": {
"id": { "type": "integer", "minimum": 1 },
"email": { "type": "string", "format": "email" },
"age": { "type": "integer", "minimum": 0, "maximum": 150 }
},
"required": ["id", "email"],
"additionalProperties": false
} 스키마는 id와 email을 required로 선언하고 타입을 고정합니다. 위 데이터는 모든 제약을 만족하므로 통과합니다. email을 제거하거나 id를 문자열로 바꿔서 경로 단위 오류 메시지를 확인해 보세요.
유효하지 않음 - required 누락 + 타입 오류
{
"id": "42",
"age": 200
} {
"type": "object",
"properties": {
"id": { "type": "integer" },
"email": { "type": "string", "format": "email" },
"age": { "type": "integer", "maximum": 150 }
},
"required": ["id", "email"]
} 오류 3건: /id는 integer가 아닌 string, /email 누락, /age (200)이 maximum 150 초과. 각 오류는 정확한 JSON Pointer 경로를 보고하므로 데이터 또는 스키마 수정 위치를 정확히 짚어낼 수 있습니다.
판별 유니온 - oneOf와 const
{
"type": "order.created",
"data": { "orderId": "ORD-001234", "totalUsd": 49.99 }
} {
"oneOf": [
{
"properties": {
"type": { "const": "order.created" },
"data": {
"type": "object",
"properties": {
"orderId": { "type": "string", "pattern": "^ORD-[0-9]{6}$" },
"totalUsd": { "type": "number", "minimum": 0 }
},
"required": ["orderId", "totalUsd"]
}
},
"required": ["type", "data"]
},
{
"properties": {
"type": { "const": "order.refunded" },
"data": { "type": "object", "required": ["refundId"] }
},
"required": ["type", "data"]
}
]
} Webhook 봉투 검증. type이 "order.created"이므로 첫 번째 oneOf 분기가 일치합니다. type을 "order.refunded"로 바꾸거나 orderId 패턴을 어기면 oneOf가 분기별 실패를 어떻게 보고하는지 확인할 수 있습니다.
객체 배열 - items + uniqueItems
[
{ "sku": "A1", "qty": 3 },
{ "sku": "B2", "qty": 5 },
{ "sku": "A1", "qty": 3 }
] {
"type": "array",
"minItems": 1,
"uniqueItems": true,
"items": {
"type": "object",
"properties": {
"sku": { "type": "string", "pattern": "^[A-Z][0-9]+$" },
"qty": { "type": "integer", "minimum": 1 }
},
"required": ["sku", "qty"]
}
} 두 항목이 바이트 단위로 동일하므로 uniqueItems가 발동합니다. 인덱스 0과 2가 충돌 - 검증기는 배열 루트에서 중복을 보고합니다. 장바구니 라인 중복이나 병합 버그로 인한 배송 요청 중복을 잡는 데 유용합니다.
사용 방법
- 1
JSON Schema 붙여넣기
스키마를 오른쪽 패널에 넣으세요. $schema URI가 있으면 검증기가 드래프트를 자동 감지하고, 없으면 툴바에서 Draft 2020-12, 2019-09, Draft-07 중 선택하세요.
- 2
JSON 데이터 붙여넣기
검사할 JSON 문서를 왼쪽 패널에 넣으세요. 입력하는 동안 유효성 검사가 실행되며, 큰 입력(>200 KB)은 입력 반응성을 유지하기 위해 수동 Validate 버튼으로 전환됩니다.
- 3
오류 목록 읽기
각 오류는 JSON Pointer 경로, 키워드, 한 줄 메시지를 포함합니다. 오류를 클릭해 데이터의 해당 위치로 이동하고, 수정하면 카운트가 실시간으로 줄어드는 것을 확인하세요.
JSON Schema 흔한 함정
Type: integer 대 number
JSON Schema는 1.0을 number로 보지만 integer로는 보지 않습니다. 계약에 integer라고 적었다면 검증기는 1.0을 거부합니다 - 대부분의 언어가 1과 같다고 부르더라도. integer가 정말 필요한 게 아니면 number를 선택하세요.
{ "qty": 1.0 } schema: { "type": "integer" } → error: not an integer { "qty": 1 } schema: { "type": "integer" } → valid 잘못된 중첩 레벨의 required
required는 properties 옆에 있어야 하며 그 안에 들어가서는 안 됩니다. 속성 선언 내부의 required 배열은 조용히 무시되어 검증기가 결코 적용하지 않습니다.
{ "properties": { "name": { "type": "string", "required": true } } } { "properties": { "name": { "type": "string" } }, "required": ["name"] } additionalProperties 기본값은 true
additionalProperties: false 없이는 스키마가 개방형이라 어떤 추가 키든 통과합니다. 이를 잊는 것이 스키마가 "전부 받아준다"는 가장 흔한 이유입니다.
{ "properties": { "id": { "type": "integer" } } } accepts: { "id": 1, "foo": "bar", "x": null } { "properties": { "id": { "type": "integer" } }, "additionalProperties": false } OpenAPI 3.0 nullable 대 Draft 2020-12 타입 배열
OpenAPI 3.0은 nullable: true를 사용하고, Draft 2020-12는 type: ["string", "null"]을 사용합니다. 둘을 섞으면 정상으로 보이지만 실제로는 null을 절대 허용하지 않는 스키마가 만들어집니다.
{ "type": "string", "nullable": true } in 2020-12: nullable is just an unknown keyword { "type": ["string", "null"] } in 2020-12: explicitly allows null 앵커 없는 pattern
JSON Schema 정규식은 기본적으로 어디서든 일치합니다 - pattern: "^[A-Z]+$"는 전체 문자열을 앵커하지만 pattern: "[A-Z]+"는 어디든 대문자가 하나라도 있으면 일치합니다.
pattern: "[A-Z]+" accepts: "helloX" (because X matches)
pattern: "^[A-Z]+$" accepts only: "HELLO"
anyOf를 의도했는데 oneOf 사용
oneOf는 정확히 하나의 분기와만 일치해야 합니다. 두 분기가 같은 형태를 받으면 anyOf라면 통과할 데이터에서 oneOf는 실패하고, 오류 메시지도 헷갈립니다("matches more than one").
oneOf: [ { type: "string" }, { type: "string", maxLength: 10 } ] on: "hi" → error: matches both anyOf: [ { type: "string" }, { type: "string", maxLength: 10 } ] on: "hi" → valid 주요 활용 사례
- API 요청 유효성 검사
- 배포 전에 요청 본문과 엔드포인트 스키마를 붙여넣으세요. 테스트로 못 잡은 400 응답을 잡아냅니다 - 누락된 필수 필드, 잘못된 타입, 범위 밖 숫자.
- Webhook 페이로드 검증
- 벤더가 보낸 페이로드를 핸들러가 거부하나요? 실제 페이로드를 사용자 스키마와 벤더가 공개한 스키마 양쪽으로 검증하세요. 두 결과의 차이가 곧 버그입니다.
- 설정 파일 린팅
- package.json, tsconfig.json, helm values.yaml - 모든 설정 파일에는 공개 스키마가 있습니다. 스키마를 붙여넣고 설정을 붙여넣어 오타를 찾으세요. 시행착오 생략.
- OpenAPI 컴포넌트 테스트
- OpenAPI 3.1 문서에서 스키마 컴포넌트를 떼어 여기에 붙여넣고 샘플 페이로드를 검증하세요. 모의 서버를 띄우는 것보다 빠르고, 결정적이며, SDK도 필요 없습니다.
- 폼 제출 사전 점검
- 프론트엔드 유효성 검사를 연결하기 전에 샘플 폼 페이로드를 붙여넣으세요. 스키마가 거부할 것은 거부하고 받을 것은 받는지 확인한 뒤, 같은 스키마를 클라이언트와 서버에 배포하세요.
- 데이터 파이프라인 계약 점검
- ETL 출력이 변형됐나요? 샘플 행과 다운스트림 스키마를 붙여넣으세요. 파이프라인이 1만 건을 재시도하기 전에 어느 프로듀서가 바뀌고 어느 키가 깨졌는지 짚어냅니다.
기술 세부사항
- Draft 2020-12 준수
- 공개된 Draft 2020-12 스펙을 구현 - 키워드, 타입 시스템, format 어휘. Ajv 8.x와 ajv-formats 출력을 기준으로 교차 검증.
- JSON Pointer 오류 경로
- 오류는 RFC 6901 JSON Pointer(/user/email/0)를 사용합니다. 모든 키워드 실패는 데이터 내부의 단일하고 해석 가능한 위치를 가리킵니다 - 모호함도, 문자열 검색도 없습니다.
- 내부 $ref 해석
- 단일 문서 내의 $ref 포인터(#/$defs/foo, #/properties/bar)를 해석합니다. 순환은 감지해 보고하며, 외부 HTTP $ref는 프라이버시를 위해 비활성화되어 있습니다.
모범 사례
- 항상 additionalProperties: false 설정
- 입력 계약(요청 본문, 설정 파일, 큐 메시지)에서 알 수 없는 키는 대개 버그입니다 - 오타, 우발적 필드, 공격자 탐색. 기본적으로 거부하세요.
- 재사용 가능한 서브 스키마는 $defs 사용
- 같은 형태를 두 번 인라인하면 어긋납니다. 공유 정의를 $defs로 옮기고 $ref로 참조하세요 - 단일 진실 공급원, 모든 변경이 모든 곳에 적용됩니다.
- 비즈니스 로직 전에 검증
- JSON.parse 직후, 파싱된 구조를 건드리기 전에 스키마 유효성 검사를 실행하세요. 타입 좁히기, 기본값 채우기, 영속화는 모두 계약이 성립한다고 가정합니다 - 정말 그런지 확인하세요.
자주 묻는 질문
JSON Schema 유효성 검사란 무엇인가요?
이 검증기가 지원하는 JSON Schema 드래프트는 무엇인가요?
JSON을 스키마에 대해 어떻게 검증하나요?
JSON Schema 유효성 검사와 JSON 문법 유효성 검사의 차이는 무엇인가요?
스키마가 정상적으로 보이는 JSON을 거부하는 이유는 무엇인가요?
$ref와 원격 스키마 참조를 지원하나요?
additionalProperties: false는 어떤 역할을 하나요?
Node.js나 Python에서 JSON을 스키마에 대해 어떻게 검증하나요?
oneOf, anyOf, allOf의 차이는 무엇인가요?
OpenAPI 스키마를 지원하나요?
검증기가 내 JSON Schema 자체가 유효하지 않다고 하는 이유는?
이 도구가 내 JSON이나 스키마를 서버로 전송하나요?
JSON Lines (NDJSON)나 다중 문서를 검증할 수 있나요?
관련 도구
모든 도구 보기 →Base64 디코더 · 인코더 (Base64 Decoder & Encoder)
인코딩 & 포매팅
Base64를 온라인에서 무료로 인코딩하고 디코딩합니다. UTF-8과 이모지를 완벽 지원하는 실시간 변환으로, 100% 브라우저에서 처리되어 회원 가입이 필요 없습니다.
JSON Diff 비교
인코딩 & 포매팅
두 JSON 파일을 브라우저에서 즉시 Diff 비교하세요. 나란히 보기 하이라이팅, RFC 6902 JSON Patch 출력, 타임스탬프·ID 같은 노이즈 필드 무시. 비공개, 업로드 없음.
JSON 포맷터 (JSON Formatter)
인코딩 & 포매팅
브라우저에서 JSON을 즉시 포매팅하고 유효성 검사를 수행합니다. 온라인 도구로 구문 검사, 오류 감지, 최소화, 복사를 지원하며 데이터는 서버로 전송되지 않습니다.
JSON to YAML 변환기 (JSON to YAML Converter)
인코딩 & 포매팅
JSON을 붙여넣으면 즉시 YAML로 변환됩니다. 브라우저에서 실시간 변환, K8s/Compose 지원, 2/4칸 들여쓰기, Norway 안전 자동 인용, 100% 개인 정보 보호.
QR 코드 생성기 — URL, WiFi, vCard, 이메일, SMS, 위치
인코딩 & 포매팅
무료 온라인 QR 코드 생성기. URL, WiFi, vCard, 이메일, SMS용 정적 QR 코드를 만드세요. SVG·PNG 다운로드. 만료 없음, 회원가입 불필요, 100% 브라우저에서 처리.
URL 인코더 · 디코더 (URL Encoder & Decoder)
인코딩 & 포매팅
URL을 실시간 인코딩·디코딩하고 내장 파서로 구조를 분석합니다. encodeURI와 encodeURIComponent 모드를 온라인에서 지원하며 데이터는 브라우저를 떠나지 않습니다.