JSON gem의 여러 API는 전역적인 동작 및 설정으로 인해 보안 취약점과 예측 불가능한 문제를 야기합니다. 첫째, JSON.load
가 기본으로 활성화하는 create_additions: true
옵션은 json_class
키를 통해 임의의 클래스 인스턴스화를 허용하여 보안 취약점을 야기합니다. 저자는 이 암묵적 사용을 Deprecate하고 JSON.unsafe_load
를 권장하며, 더 안전한 콜백 기반 JSON.load
인터페이스를 도입하여 로컬에서 객체 역직렬화를 개선했습니다.
둘째, JSON 명세의 모호성으로 인한 객체 내 중복 키 처리 방식(대부분 마지막 키 사용)은 보안 문제를 유발할 수 있습니다. json
gem은 향후 버전에서 중복 키 발견 시 기본적으로 오류를 발생시키도록 변경 예정이며, allow_duplicate_key: true
로 허용이 가능합니다.
셋째, Object#to_json
메서드의 전역적인 동작과 알 수 없는 객체에 대한 Object#to_s
로의 폴백은 라이브러리에서 직렬화 방식을 로컬에서 제어하기 어렵게 만들고 불필요한 출력을 생성합니다. 이러한 문제들을 해결하기 위해 새로운 JSON::Coder
API가 도입되었습니다. JSON::Coder
는 로컬에서 타입별 직렬화를 안전하게 제어하며, JSON 프리미티브 객체 반환을 강제합니다. Object#to_json
은 광범위한 사용으로 인해 Deprecate되지 않지만, JSON::Coder
가 더 우월한 대안임을 강조합니다.
마지막으로, load_default_options
및 dump_default_options
와 같은 전역 옵션 설정은 몽키 패칭과 유사하게 예기치 않은 영향을 미쳐 라이브러리 간 충돌을 유발할 수 있습니다. JSON::Coder
는 이러한 전역 설정 대신 라이브러리나 모듈 내에서 JSON 생성 설정을 로컬하게 관리할 수 있는 안전한 방법을 제공합니다.