1P by GN⁺ 3시간전 | ★ favorite | 댓글 1개
  • Chrome에서 JSON 데이터를 구조적으로 시각화하던 확장 프로그램이 더 이상 오픈소스로 유지되지 않음
  • 프로젝트는 폐쇄형 상용 모델로 전환되며, 새 버전은 프리미엄 기능을 포함한 API 탐색 도구로 개발 중임
  • 기존 사용자를 위해 JSON Formatter Classic이 최종 오픈소스 버전으로 공개되어, 로컬 전용 포맷터 형태로만 제공됨
  • Classic 버전은 업데이트가 중단되며, Chrome Web Store 또는 소스 코드로 설치 가능함
  • 이번 전환으로 인해 광고성 코드 삽입 및 신뢰성 저하 우려가 제기됨

프로젝트 종료 및 전환 공지

  • JSON Formatter는 오픈소스 개발을 종료하고 폐쇄형 상용 모델로 전환됨
    • 새 버전은 프리미엄 기능을 포함한 API 탐색 도구로 개발 중임
  • 기존 오픈소스 사용자를 위해 최종 오픈소스 버전JSON Formatter Classic으로 공개됨
    • Chrome Web Store에서 설치 가능하며, 로컬 전용 JSON 포맷팅 확장으로 유지
    • 더 이상 업데이트는 제공되지 않음

JSON Formatter 개요

  • Chrome 브라우저에서 JSON API 응답을 구조적으로 시각화하는 확장 프로그램
  • 긴 JSON 페이지에서도 빠른 처리 속도를 제공하며, Dark Mode문법 하이라이트를 지원
  • 트리 구조 접기/펼치기, 들여쓰기 가이드, 클릭 가능한 URL 기능 포함
  • JSON이 아닌 페이지에서는 1밀리초 미만의 성능 영향만 발생
  • Raw / Parsed JSON 전환 버튼 제공, 파싱된 JSON은 전역 변수 json으로 콘솔 접근 가능

설치 방법

  • 옵션 1: Chrome Web Store에서 JSON Formatter Classic 설치
  • 옵션 2: 소스 코드에서 직접 설치 가능
    • bun install로 의존성 설치 후 bun run build 또는 bun run watch 명령 사용
    • dist 폴더를 Chrome 개발자 모드에서 로컬 확장 프로그램으로 로드 가능

JSON 감지 방식

  • JSON 감지는 Content-Type 헤더를 기반으로 수행되며, 일부 경우 페이지 구조 분석을 통해 JSON 엔드포인트 여부를 판단
  • 브라우징 성능에 영향을 주지 않도록 빠른 동작을 목표로 설계됨

숫자 표현 한계

  • JavaScript의 수치 한계로 인해 큰 수나 정밀 부동소수점은 정확히 표시되지 않음
    • Number.MAX_SAFE_INTEGER(2^53 - 1)보다 큰 수는 해당 값으로 조정
    • Number.MIN_SAFE_INTEGER(-2^53 + 1)보다 작은 수는 해당 값으로 조정
    • 매우 정밀한 부동소수점은 16자리로 반올림
  • 이는 JSON Formatter의 문제가 아니라 V8 엔진의 JSON.parse 동작에 따른 것임
  • 안전 범위를 벗어나는 숫자는 문자열로 감싸서 표현해야 함

객체 키 순서 관련

  • 표시 순서는 파싱된 객체의 실제 순서로, Object.keys(JSON.parse(json)) 결과와 동일
  • 과거 JavaScript 표준은 객체 키 순서를 보장하지 않았으며, V8 엔진이 숫자형 키를 상단으로 이동하는 최적화를 수행
  • 이 동작이 이후 표준화되어 현재까지 유지

원본 JSON 보기

  • 서버가 전송한 원본 JSON을 그대로 보려면 "Raw" 버튼을 사용
  • "Parsed" 버튼은 JSON.parse 결과를 표시
  • 향후에는 커스텀 파서를 도입해 파싱 과정에서 값이 변경된 경우 경고 표시 기능을 추가할 가능성 있음
Hacker News 의견들
  • 오늘 Chrome Inspector에서 give-freely-root-bcjindcccaagfpapjjmafapmmgkkhgoa라는 수상한 요소를 발견했음
    확인해보니 인기 오픈소스 JSON Formatter 확장 프로그램이 한 달 전쯤 폐쇄 소스로 전환되었고, 결제 페이지에 광고 코드와 위치 추적을 삽입하기 시작했음
    이제는 브라우저 확장 마켓플레이스 자체가 실패한 실험처럼 느껴짐. 그냥 직접 JSON 포매터를 만들어 쓰는 게 낫겠다는 생각임

    • Google 정책상 광고를 삽입하는 건 허용되지만 제거하는 건 금지되어 있는 게 아이러니함
    • 앱스토어의 보안 필터링 기능은 여전히 일정 가치가 있음. 완벽하진 않지만, 아무 통제 없는 환경보다는 낫다고 봄
    • 기존 사용자를 속이고 광고를 삽입한 건 정말 비윤리적인 행위라고 생각함. 폐쇄형 상업 버전으로 전환하는 건 괜찮지만, 사전 고지 없이 광고를 넣는 건 선 넘은 일임
    • 이런 행위는 공개적으로 비판과 책임 추궁을 받아야 함. 물론 농담 섞인 말이지만, 이런 ‘팔아넘김’이 사회적 제재를 받는 것도 필요하다고 봄
    • 어떻게 그런 수상한 요소를 발견했는지 궁금함. 평소에 DOM을 자주 살펴보는 편인지 묻고 싶음
  • 이 사건의 저자인 Callum Locke가 실존 인물이라는 점이 흥미로움
    예전엔 이런 ‘실명 개발자’가 신뢰의 신호였는데, 이제는 꼭 그렇지도 않다는 걸 보여줌

    • 사용자 수가 수백만 명이면 매각 유혹이 상당히 큼. 나도 30만 명 규모의 확장을 운영하는데, 몇 년간 받은 제안만 해도 꽤 큰돈이었음
      관련 논의는 HoverZoom GitHub 토론에 있음
    • 인기 확장 프로그램을 가진 개발자라면 이런 유혹을 피하기 어렵다는 걸 잘 알고 있음
    • 브라우저 확장 유지보수자는 종종 수상한 제안 메일을 받음. 이번 일도 그런 제안에 넘어간 사례로 보임
    • 어쨌든 Callum Locke는 이번 일로 평판을 완전히 잃은 셈
  • 2년 전 작성자가 직접 남긴 HN 댓글을 보면,
    자신이 JSON Formatter의 창작자이며 절대 사용자 데이터를 전송하거나 팔지 않겠다고 맹세했었음
    여러 차례 거액의 인수 제안을 받았지만 명예를 지키기 위해 거절했다고 밝힘

    • “영웅으로 죽거나, 오래 살아 악당이 된다”는 말이 떠오름
    • 요즘은 직접 도구를 만드는 비용이 거의 0이라 굳이 타인을 신뢰할 이유가 없다고 생각함
    • 결국 이런 약속도 판매 전략이었을 뿐일 수도 있음. 오픈소스는 제대로 된 지속가능한 자금 구조가 필요함
    • 그래도 그가 끝까지 원칙을 지켰다면 잘한 일임
  • 작성자가 남긴 Chrome Web Store 리뷰 답변에 따르면,
    ‘Give Freely’는 스파이웨어가 아니라 기부용 제휴 링크 시스템이라고 설명함
    사용자가 제휴 상점에서 결제할 때 클릭하면, 수익 일부가 Code.org 같은 단체에 기부되는 구조라고 함
    개인 정보나 브라우징 데이터를 수집하지 않으며, 원치 않으면 설정에서 완전히 비활성화할 수 있다고 강조함
    ‘Give Freely’ 코드가 없는 JSON Formatter Classic 버전도 제공 중이라고 함

    • 의도와 상관없이 실행 방식이 미숙했고, 브라우저 확장 배포 모델의 보안 취약점을 드러낸 사례라고 봄
  • 핵심 문제는 자동 업데이트 이념에 있다고 생각함
    업데이트는 보안 취약점을 해결하지만, 동시에 사용자가 원치 않는 변경이나 공급망 공격 위험을 초래함
    특히 개인 개발자의 확장은 자동 업데이트를 꺼야 함. 하지만 Chrome은 이를 허용하지 않음
    Google은 광고 중심의 철학 때문에 이런 애드웨어 전환을 문제로 인식하지 못함
    Firefox는 조금 낫지만, 자체 빌드 확장을 영구 설치할 수 없다는 점이 아쉬움

    • Firefox에서도 완전히 불가능한 건 아님. about:debugging에서 임시 로드하거나, xpinstall.signatures.required를 끄면 가능함
    • 개인적으로는 모든 로컬 실행 프로그램은 자동 업데이트 금지가 원칙임. 그렇지 않으면 사회적으로 허용된 RCE 백도어일 뿐임
    • JSON Formatter처럼 기능이 고정된 확장은 설치 직후 업데이트를 비활성화하는 게 최선임.
      다만 uBlock처럼 필터 리스트를 주기적으로 갱신하는 확장은 예외일 수 있음
  • Chrome Web Store의 바이너리와 공개 소스 간 불일치가 가장 큰 문제라고 생각함
    스토어는 개발자가 올린 패키지를 그대로 신뢰하며, 실제 공개 코드와 일치하는지 검증하지 않음
    내가 직접 몇몇 확장을 재현 빌드해봤지만 대부분 일치하지 않았음
    Firefox AMO는 소스 제출 후 클린 빌드와 비교(diff) 를 수행하지만 Chrome은 그렇지 않음
    재현 가능한 빌드와 서명된 커밋 연결이 없다면, 악성 코드 삽입을 사전에 탐지할 방법이 없음

  • Google이 Manifest V3를 밀어붙이면서도 이런 문제는 방치하고 있음
    오히려 Blaze VPN, Safum VPN, Snap VPN 같은 악성 확장에 ‘Featured’ 배지를 달아줌
    이들은 과거 악성 확장을 만든 PDF Toolbox 그룹의 복제본이며, 실제로는 작동조차 하지 않음
    Chrome Web Store의 검증 체계가 엉망이라는 걸 보여주는 사례임

  • 같은 일이 ModHeader 확장에서도 발생했음
    ModHeader 링크
    Google 검색 결과마다 광고를 삽입하기 시작했고, 신고했지만 여전히 스토어에 남아 있음

  • 일주일 전에 이 문제를 알아차리고, 직접 내가 좋아하던 기능을 모아 새로운 JSON 포매터를 만들었음
    GitHub - JSON Alexander

    • 이름이 정말 멋지다는 칭찬을 받았음
  • 이번 사건은 설치된 확장 프로그램을 정리할 좋은 계기가 되었음
    꼭 필요한 것만 남기고 나머지는 삭제할 예정임