JSON 읽기: 구문, 계약과 신뢰 구분하기

핵심 요약

파서는 JSON 텍스트를 값으로 바꿉니다. 업무상 유효성, 발신자 신뢰 또는 데이터 사용 권한을 입증하지 않습니다.

빈 브리핑실의 세계 네트워크 지도
이 글의 목차

유효한 입력도 의미는 다를 수 있음

JSON 문서는 객체, 배열 또는 단순 값일 수 있습니다. 계약에서 객체를 요구해도 null 자체는 유효합니다. 일부 수는 JavaScript 정수 정밀도를 넘으며 중복 속성 이름의 해석은 파서마다 다를 수 있습니다.

설명용 입력구문 해석남은 검증
{"ok":true}유효함.값이 계약을 충족하는가?
{"ok":true,}유효하지 않음: 끝의 쉼표.오류를 명시적으로 처리.
null유효함.계약이 null을 허용하는가?
{"id":9007199254740993}유효한 수지만 JavaScript 정밀도 위험.해당 식별자는 문자열 사용.
{"a":1,"a":2}중복 이름: 해석의 이식성이 없음.거부 정책 정의 및 적용.

수신의 모든 단계 확인하기

  • 유지보수되는 JSON 파서를 쓰고 eval은 사용하지 않습니다. HTTP 상태, 예상 콘텐츠 유형, 크기 제한과 누락되거나 잘못된 본문 처리를 확인합니다.
  • 그다음 계약을 검증합니다. 루트 유형, 필수 필드, 허용 값과 누락·null·0의 차이를 확인합니다. 계약이 정하면 긴 식별자는 문자열로 유지합니다.
  • 깊이와 자원 제한, 중복 이름 정책과 오류 처리를 정합니다. 적절한 보호 없이 받은 문자열을 HTML이나 쿼리에 넣지 않습니다.

데이터를 노출하지 않고 유용한 오류 남기기

부분 응답, 버전 변경과 Unicode를 테스트합니다. 비밀이나 전체 본문 대신 최소 맥락을 기록합니다. 해석 실패를 빈 성공 결과로 바꾸거나 전체 처리 체인을 조용히 중단해서는 안 됩니다.

1차 자료

페이로드를 유출하지 않고 JSON API 오류를 로깅해야 합니다.

JSON 본문에는 식별자, 비밀 키 또는 개인 데이터가 포함될 수 있습니다. 진단에는 전체 페이로드보다는 이벤트 유형, 경로, 결과, 상관 관계 식별자 및 민감하지 않은 오류 세부 정보가 필요한 경우가 많습니다.

  • 필드를 분류하고 진단에 필요하지 않은 필드는 마스킹해야 합니다.
  • 가상 값을 사용하여 구문 분석 및 스키마 오류를 테스트합니다.
  • 오류 로그 및 내보내기 시 전체 페이로드가 복사되지 않는지 확인합니다.

1차 자료: ACSC and partners — Event logging and threat detection. 관련 방법: 실무 가이드 읽기.

개인화된 JSON 및 캐시 키

추가 검토 사항: 개인화된 JSON 및 캐시 키. 계정 간 유출 및 변경 후 오래된 콘텐츠 방지를 위한 표현 수준 정책 및 테스트.

  • 보존 기간 선택: RFC 9111은 지시문을 구분합니다. no-cache는 재사용 전 유효성 검사를 요구하고, no-store는 관련 HTTP 저장소를 금지하며, unqualified private는 공유 저장소를 제외합니다. none만으로는 시스템 기밀성을 보장할 수 없습니다.
  • 키 검사: 표현 변경 시 메서드, URI 및 차원을 확인합니다. Vary는 요청 필드와 관련이 있으며 권한 부여와는 관련이 없습니다. 애플리케이션 계층에서 누락된 언어, 형식 협상 및 계정 컨텍스트를 찾습니다.

1차 자료: IETF — RFC 9111, HTTP Caching. 관련 방법: 실무 가이드 읽기.

API 페이지 분할과 일관된 내보내기

변하는 데이터는 내보내기 누락과 중복을 만들 수 있습니다.

  • 필터, 정렬과 같은 값의 순서를 결정할 키를 기록합니다. API가 스냅샷을 제공하는지 변하는 집합을 읽는지 확인합니다. 읽는 동안 생성과 삭제를 시험합니다. 커서가 있다고 데이터가 고정된 것은 아닙니다.
  • AIP-158에서는 빈 next_page_token이 종료 조건이며 짧거나 빈 결과 페이지가 종료 조건은 아닙니다. 가상 페이지 [A,B]와 [B,C]에는 네 행이 있지만 고유 식별자는 세 개입니다. 진행 없는 같은 커서도 감지하고 실제 API 계약을 따릅니다.
  • 배치를 영구 저장한 뒤 계속 상태를 확정합니다. 안정된 식별자로 중단 배치를 재처리하고 요청마다 권한을 확인합니다. 커서는 접근 허가가 아닙니다. 스냅샷이 만료되면 다시 시작하거나 명시한 정책으로 대조하고 다른 상태를 조용히 합치지 않습니다.

재현 가능한 수락 사례

가상 예시입니다. 고객이나 실제 관측 결과를 나타내지 않습니다.

사례 입력 보기
{
    "page_1_ids": [
        "A",
        "B"
    ],
    "page_2_ids": [
        "B",
        "C"
    ],
    "next_cursor": "c2",
    "empty_page_has_next_cursor": true
}

예상 판단

B가 반복됩니다. 식별자를 확인하고 빈 페이지 뒤에도 다음 커서가 있으면 계속합니다.

검증 절차

  1. 필터, 안정 순서 및 객체 식별을 정합니다.
  2. 중복과 다음 커서가 있는 빈 페이지를 시험합니다.
  3. 식별자와 실제 종료 조건을 보존합니다. 수신 객체와 고유 식별자를 대조하고 반복 커서를 표시하세요. 후속 페이지가 있는 빈 페이지를 수집 완료로 처리하지 마세요.

Google AIP-158 — Pagination

예상 행 수에 맞으면 내보내기가 완전한가요?

아닙니다. 빠진 식별자와 중복 식별자가 건수에서 상쇄될 수 있습니다. 식별자, 범위와 마감 시각을 비교하고 해결 못 한 차이를 기록하세요.

1차 자료: Google AIP-158 — Pagination. 관련 방법: 실무 가이드 읽기.