Ruby JSON Gem API: 무엇이 문제인가?

What’s wrong with the JSON gem API? | byroot’s blog

작성자
Ruby Weekly
발행일
2025년 08월 02일

핵심 요약

  • 1 Ruby JSON gem의 기존 API 중 `JSON.load`의 `create_additions` 옵션, 중복 키 처리, `to_json` 및 전역 설정(`_default_options`)이 보안 및 설계상 문제를 안고 있습니다.
  • 2 이러한 문제 해결을 위해 저자는 위험한 기능에 대한 명시적 사용을 권장하고, 중복 키에 대한 경고를 도입하며, 새로운 `JSON::Coder` API를 제안합니다.
  • 3 `JSON::Coder`는 객체 직렬화 및 JSON 설정에 대한 전역적인 변경 대신 지역적이고 안전한 제어 방식을 제공하여 API 설계 개선을 목표로 합니다.

도입

이 글은 Ruby JSON gem의 새로운 유지보수자가 기존 API의 문제점과 위험성 때문에 이 역할을 맡게 되었음을 밝힙니다. 저자는 Deprecation이 사용자에게 피로감을 줄 수 있지만, 이번 변경은 명확한 이유와 가치를 가지고 있음을 설명합니다. 또한, 현대 Ruby에서 Deprecation 경고를 효과적으로 처리하는 방법(`Kernel#warn`, `Warning` 모듈 재정의)을 소개하며, 테스트 스위트에서의 활성화 중요성을 강조합니다.

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_optionsdump_default_options와 같은 전역 옵션 설정은 몽키 패칭과 유사하게 예기치 않은 영향을 미쳐 라이브러리 간 충돌을 유발할 수 있습니다. JSON::Coder는 이러한 전역 설정 대신 라이브러리나 모듈 내에서 JSON 생성 설정을 로컬하게 관리할 수 있는 안전한 방법을 제공합니다.

결론

API Deprecation은 사용자에게 미칠 영향을 고려하여 신중하게 결정되어야 합니다. 그러나 API가 위험하거나 오류를 유발할 때는 올바른 방향으로 나아가기 위한 필수적인 조치입니다. JSON gem API에서 발견된 문제점들의 공통적인 특징은 '전역적인 동작과 설정'에 있습니다. 전역 상태나 동작은 때때로 단순성을 제공하지만, 이는 극도로 신중하게 다뤄야 하는 '날카로운 도구'임을 재차 강조하며, API 설계에서 지역적 제어의 중요성을 역설합니다.

댓글 0

댓글 작성

0/1000
정중하고 건설적인 댓글을 작성해 주세요.

아직 댓글이 없습니다

첫 번째 댓글을 작성해보세요!