- 필자는 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이 공식 구현을 한다면 더 많은 이용자 편의성 확보 가능함
- "비공식이지만 효과적인 경험"을 창출한 사례로 기록됨