JSON과 YAML: 어떤 구성 형식을 사용해야 합니까?
빠른 답변
APIs, 데이터 교환 및 엄격한 구문 분석 및 유효성 검사가 중요한 경우에는 JSON을 사용하세요. 구성 파일, DevOps 매니페스트, 사람의 가독성과 설명이 중요한 경우에는 YAML을 사용하세요. YAML은 JSON 상위 집합입니다. 모든 유효한 JSON 문서는 유효한 YAML입니다.
소개
JSON 및 YAML은 모두 사람이 읽을 수 있는 데이터 직렬화 형식입니다. JSON는 웹 APIs에서 엄격하고 최소화되며 어디에나 존재합니다. YAML은 주석, 여러 줄 문자열, 앵커 및 들여쓰기 기반 구조를 추가하는 JSON의 상위 집합으로 구성 파일(Docker Compose, Kubernetes, CI/CD 파이프라인)에 널리 사용됩니다.
단계별
-
구문과 가독성 비교
JSON는 중괄호와 따옴표를 사용합니다({"key": "value"}). YAML은 들여쓰기와 콜론(키: 값)을 사용합니다. YAML은 구성이 더 깔끔합니다. 문자열에 따옴표가 필요 없고 항목 사이에 쉼표가 없으며 중괄호가 없습니다. JSON은 데이터 교환에 있어 더 명확하고 오류가 발생할 가능성이 적습니다.
-
기능 비교
YAML은 주석(#), 여러 줄 문자열(|, >), 앵커(&) 및 별칭(*), 한 파일의 여러 문서(---) 및 복합 유형을 지원합니다. JSON는 이들 중 어느 것도 지원하지 않습니다. 주석도, 여러 줄 문자열도, 참조도 없습니다. JSON의 단순성은 의도적인 것입니다. 이는 구성 언어가 아닌 데이터 교환 형식입니다.
-
안전성과 구문 분석 비교
JSON 구문 분석은 빠르고 안전합니다. JSON.parse는 모든 JavaScript 엔진에 내장되어 있습니다. YAML 구문 분석은 더 느리고 더 복잡합니다. YAML 사양은 JSON의 2페이지에 비해 80페이지 이상입니다. YAML에는 JSON에 없는 보안 위험(앵커를 통한 수십억 웃음 공격)이 있습니다. 항상 앵커를 비활성화하는 안전한 YAML 파서를 사용하세요.
-
생태계 사용량 비교
JSON: REST APIs, package.json, tsconfig.json, NoSQL 데이터베이스, 웹 앱. YAML: Docker Compose, Kubernetes 매니페스트, GitHub Actions, Ansible 플레이북, CI/CD 구성, OpenAPI 사양. JSON는 런타임 데이터를 지배합니다. YAML이 구성을 지배합니다.
-
사용 사례에 따라 결정하세요.
APIs, 데이터 교환, NoSQL, 웹 앱 상태: JSON. 구성 파일, DevOps, CI/CD, 코드형 인프라: YAML. 사람이 직접 작성하는 경우: YAML. 기계가 생성하고 소비하는 경우: JSON.
예
JSON 및 YAML의 동일한 구성
입력: JSON: {"server": {"port": 8080, "host": "localhost"}}
YAML: server:\n port: 8080\n host: localhost
산출: YAML은 30% 더 짧고 주석을 지원합니다. JSON은 더 엄격하고 보편적으로 구문 분석 가능합니다.
일반적인 문제
- YAML 들여쓰기 오류: YAML은 구조에 들여쓰기를 사용하며 하나의 잘못된 공백으로 인해 구문 분석이 중단됩니다. YAML 린트 기능이 있는 편집기를 사용하고 탭은 사용하지 않고 항상 공백을 사용합니다.
- YAML Billion Laughs 공격: YAML 앵커와 별칭은 기하급수적인 확장을 생성하여 DoS를 유발할 수 있습니다. 앵커를 비활성화하는 안전한 YAML 파서(예: Python의 yaml.safe_load)를 사용하세요.
- JSON에는 주석이 없습니다. JSON 사양은 주석을 금지하므로 구성 파일에 주석을 달기가 더 어렵습니다. 사람이 편집한 구성에는 YAML을 사용하고 기계 생성 데이터에는 JSON를 사용합니다.
- YAML 암시적 타이핑 놀라움: YAML은 yes/no를 부울로, 1.0을 부동으로 자동 변환합니다. 이는 문자열 필드를 깨뜨릴 수 있습니다. 예상치 못한 유형 강제를 피하기 위해 명시적으로 문자열을 인용합니다.
팁
- 사람이 작성한 구성(Docker Compose, Kubernetes, CI/CD)에는 YAML을 사용하고 기계 생성 데이터 교환(APIs, NoSQL, 앱 상태)에는 JSON을 사용합니다.
- 앵커와 별칭을 비활성화하는 안전한 YAML 파서를 항상 사용하십시오. 신뢰할 수 없는 입력에는 절대 범용 YAML 로더를 사용하지 마십시오.
- YAML을 JSON로 변환할 때 주석, 여러 줄 문자열 및 앵커가 손실될 수 있습니다. JSON는 기능의 경우가 아니라 YAML의 하위 집합입니다.
- YAML을 2개의 공백으로 일관되게 들여쓰기합니다. 탭과 공백을 혼합하거나 일관되지 않은 들여쓰기를 사용하는 것이 가장 일반적인 YAML 구문 분석 오류입니다.