PureGym의 비공식 Apple Wallet 개발자가 된 계기

3 hours ago 2

  • 필자는 PureGym 앱의 느린 사용성과 복잡한 입장 과정을 불편하게 여기고, 이를 Apple Wallet으로 최적화함
  • 기존 QR 코드는 매번 앱을 열고 정보를 불러와야 하며, 약 47초가 걸리는 비효율적 진입 방식임
  • 다양한 리버스 엔지니어링, mitmproxy 사용, PassKit 프레임워크 등 기술적 과정을 통해 자동 갱신 가능한 Wallet 패스를 구현함
  • 이 과정에서 PIN 코드의 보안 허점, API 인증 구조, 지점 위치 정보 등 웹상에서 드러난 PureGym의 내부 동작을 확인함
  • 최종적으로 3초 만에 입장하는 사용자 경험을 만들어냈으며, 개인적인 실험으로 끝내고 공식 서비스가 아님을 명확히 함

47초: 불편함의 시작

  • 평일 오전 11:15, PureGym 입구에서 앱을 여는 데 47초가 소요됨
  • 신호가 약하고, Wi-Fi 접속과 앱 실행, 각종 푸쉬 알림, 특별 할인 제안 등을 넘겨야 QR 코드가 나타남
  • 실제 QR 코드가 뜨기까지 오래 걸리고, 다른 회원의 눈치를 보게 됨
  • 주 6회 반복 시 매주 282초가 소모되는 비효율적 경험임
  • Amazon Fresh와 같은 무비접 경험과 비교해 PureGym의 진입 UX는 매우 뒤떨어짐

8년 된 PIN의 미스터리

  • 필자는 8자리 PIN 코드를 8년째 동일하게 사용함
  • 이 PIN은 만료되지도 변경되지도 않음
  • 반면 앱 내 QR 코드는 1분마다 새로운 값으로 교체됨
  • 실질적 보안 수준과 실제 구현 간에 큰 모순이 존재함
  • PIN 방식은 극단적으로 오래 유지되면서 QR 코드만 엄격하게 보호되는 "보안 쇼" 현상임

mitmproxy로 PureGym 이해하기

  • 처음에는 QR 코드 스크린샷을 Apple Wallet에 넣어 사용하려 했으나 즉시 작동하지 않음
  • PureGym의 QR 코드는 동적으로 생성, 대략 1주 만에 만료되지만 앱에서는 1분마다 갱신함
  • GitHub에서 "PureGym" 관련 레포를 검색해 API 인증 구조를 발견함
    • 로그인용 8자리 PIN이 API 패스워드와 동일하게 사용됨
    • Base64로 인코딩된 기본 인증 정보도 보안성이 떨어짐
  • 앱 트래픽을 분석하기 위해 mitmproxy 등 프록시 도구로 요청을 가로챔
    • QR 코드의 JSON 구조는 part1(고정 id), part2(타임스탬프), part3(갱신용 salt)로 이루어짐
    • API에서 갱신 타이밍, 만료 조건까지 모두 안내함

PassKit: Apple Wallet의 잠재력

  • Apple Wallet 패스는 정적 카드가 아닌, 자체 갱신·푸쉬 알림·위치 반응 등이 가능한 미니 앱 구조
  • PassKit 구현에는 JSON 명세, 이미지 리소스, 인증서 서명, 실시간 갱신용 웹서비스 등이 필요함
  • Apple의 개발자 포탈에서 Pass Type ID 및 WWDR 인증서 발급이 요구됨
  • 인증서 서명과 관리가 까다롭지만, 성공하면 실제 기기에서 매끄러운 경험이 가능함

Swift 백엔드 구축

  • 일반적으로 Node.js를 쓰지만, 필자는 Swift 기반 Vapor로 직접 PassKit 웹서비스 구현
    • 패스 갱신 필요시, 사일런트 푸쉬로 자동 업데이트 제공
    • 사용자가 인식하지 못하는 자연스러운 패스 갱신 실현

전국 PureGym 위치 자동화

  • Apple Wallet 패스는 지정 위치에서 자동 노출 가능
  • PureGym 공식 사이트에는 상세 좌표가 없으나, API에서 전국 지점의 좌표 리스트 획득
  • 모든 지점 좌표를 파싱해 패스마다 가까운 지점을 지정함
  • 단점: 쇼핑센터 내 PureGym인 경우, 단순 쇼핑에도 패스가 뜨는 소소한 불편함

Apple Watch 연동

  • Apple Wallet 패스는 별도 작업 없이 Apple Watch에서 자동 동기화됨
  • 손목에서 두 번 클릭 후 스캔, 입장까지 3초 소요로 대폭 단축
  • 93% 이상의 시간 절감 실현

수치로 보는 변화

  • 기존 PureGym 앱 진입 시간: 47초
  • Apple Wallet 패스 진입 시간: 3초
  • 한 주 평균 절감 시간: 4.4분(연 3.8시간)
  • 주변 회원들이 "이런 앱 있냐"고 23회 물어봄, 모두 비공식임을 설명함
  • 요청이 있지만 저작권/서비스 정책상 배포 계획 없음

보너스: Home Assistant 연동

  • PureGym API의 실내 인원수 엔드포인트를 통해 IoT 대시보드에 현재 체육관 혼잡도를 표시함
  • 데이터 기반으로 한산한 시간 재방문 결정 가능, 운동 효율/동기 상승 효과

엔지니어링 현실과 윤리

  • 순수한 개인 불편함 해결이었으나, PureGym 내부에서는 다년간 개선하지 않은 영역임
  • 조직 밖에서 만들어진 프로토타입이 때로는 공식 로드맵보다 빨리 문제를 해결함
  • 이것이 공식적으로는 약관 위반일 수 있고, 언제든 PureGym이 차단 가능함
  • 절대 자동화/공유는 하지 않고 오로지 개인 실험 용도, 안정성을 위해 캐시 등 원칙 준수

다음 단계와 마무리

  • 앞으로 "부끄러움 푸쉬 알림" 등 확장 아이디어 제안이 가능
  • 실질적 효용은 작지만, 연간 3.8시간의 "불필요한 동작"을 최적화함에 만족감 느낌
  • PureGym이 공식 구현을 한다면 더 많은 이용자 편의성 확보 가능함
  • "비공식이지만 효과적인 경험"을 창출한 사례로 기록됨

Read Entire Article