Go의 새로운 JSON API

13 hours ago 2

Go 1.27에서 encoding/json/v2와 encoding/json/jsontext가 안정화되어 정식 제공됨. 기존 JSON 패키지의 동작, API, 성능 문제를 개선하면서 익숙한 사용 방식을 유지함 구문 처리와 Go 값 변환을 분리하고, 토큰과 값을 실제 스트리밍 방식으로 처리함. 새 사용자 정의 인터페이스는 전체 JSON 값을 버퍼링하거나 반복 파싱하는 부담을 줄임 기본 동작이 더 엄격해져 잘못된 UTF-8과 중복 객체 이름을 거부함. nil 슬라이스/맵, 구조체 필드 이름 매칭, omitempty 등의 동작도 달라지며 대부분 옵션으로 조정 가능함 벤치마크에서 Unmarshal 성능이 최대 10배 향상됨. Marshal은 기존 버전과 대체로 비슷하며, 경우에 따라 조금 빠르거나 느림 기존 encoding/json은 무기한 지원되며 이전은 필수가 아님. 내부 구현을 v2 기반으로 통합해 두 버전의 사용자 정의 메서드가 상호 동작하고, 호출 지점별 점진적 이전도 가능함 기존 encoding/json의 한계 Go는 1.0 이전부터 표준 라이브러리로 JSON을 지원했으며, 임의의 Go 타입을 기본 JSON 표현으로 변환하고 필요에 따라 재정의하는 방식은 높은 유연성을 제공해 왔음 초기 JSON 지원 소개 이후 15년 이상이 지났으며, 지난해 공개한 실험적 JSON API에 추가 피드백과 개선을 반영해 정식 제공함 기존 패키지는 모호하거나 잘못된 입력을 허용함 RFC 8259가 유효한 UTF-8을 요구하지만, 잘못된 UTF-8을 받아들여 드러나지 않는 데이터 손상과 후속 문제를 일으킬 수 있음 객체의 중복 이름도 허용함. RFC는 중복 처리 방식을 정하지 않아 구현마다 값을 선택하거나 병합, 폐기, 오류 처리할 수 있으며, 동일한 JSON에 합의된 의미가 없어짐 이러한 차이는 보안 공격에 악용될 수 있고, 실제로 CVE-2017-12635 사례가 있음 nil과 필드 매칭, 메서드 호출에도 동작 문제가 있음 nil 슬라이스와 맵을 null로 직렬화해 배열이나 객체 위치에서 null을 허용하지 않는 다른 구현과 통신할 때 오류가 발생할 수 있음. 설문에서는 대부분의 Go 사용자가 빈 배열과 빈 객체를 기본값으로 선호함 객체 이름을 구조체 필드에 연결할 때 대소문자를 구분하지 않아 예상 밖 동작, 잠재적 보안 취약점, 성능 제약이 생김 포인터 리시버의 MarshalJSON을 일관되지 않게 호출하지만, 현재 동작에 ...

Read Entire Article




피플앤툴즈 네트워크
🛍 샵