나열 안 한 property 도 정책 필요
additionalProperties
기본값은 properties 에 안 적힌 키도 그냥 통과야. 막으려면 additionalProperties: false 를 줘. 그러면 schema 가 '닫힌' 상태가 돼. 통째로 막는 대신 검사만 하고 싶으면 거기에 schema 를 넣어. { "type": "string" } 을 주면 '나머지 키는 전부 문자열이어야 한다' 는 뜻이야.
patternProperties
가끔은 property 이름 자체가 규칙을 따르기도 해. patternProperties 는 키 regex 하나에 schema 하나를 짝지어. "^env_": {"type": "string"} 이면 'env_ 로 시작하는 키는 전부 문자열' 이야. env-var 맵이나 locale 맵 ("^[a-z]{2}(-[A-Z]{2})?$") 에 자주 써.
propertyNames
키 문자열 자체에 제약을 걸 수도 있어. "propertyNames": {"pattern": "^[a-zA-Z_][a-zA-Z0-9_]*$"} 는 '모든 키가 쓸 만한 식별자여야 한다' 는 뜻이야. JSON 키가 나중에 변수 이름이 되는 경우에 요긴해.
'기본으로 닫기' 에는 앞호환을 포기하는 대가가 따라와.
additionalProperties: false 를 건 schema 는 v1 validator 에서 멀쩡한 v2 문서를 거부해. 그래서 공개 API 는 대체로 열어두거나, 닫는다면 그 정책을 문서에 못 박아. 반대로 내부에서만 쓰는 schema 는 닫아두는 일이 많고. 반사적으로 정하지 말고 의식하고 골라.