다음에 올 것을 만들어가는 기술에 대한 심층 기사.

피트니스 앱은 감시 도구다

Strava 같은 피트니스 앱이 군사기지부터 항공모함까지 민감한 위치 정보를 어떻게 유출하는지, 개발자가 배워야 할 OPSEC 교훈을 살펴봅니다.

붉은 러닝 경로가 갑판을 따라 그려진 채 바다 위에 떠 있는 항공모함

프랑스의 한 신문이 최근 유럽에서 가장 전략적으로 민감한 군사 자산 중 하나인 프랑스 유일의 항공모함 샤를 드골의 실시간 위치를 피트니스 앱의 공개 데이터로 추적해 보도했습니다. 승조원들이 비행갑판을 돌며 달리는 동안 Strava가 모든 걸음을 기록하고 있었습니다. 어디를 봐야 할지 아는 사람이라면 누구든 함정의 위치, 항로, 속도를 확인할 수 있었습니다.

이것은 해킹이 아니었습니다. 누구도 취약점을 악용하거나 보안 통제를 우회하지 않았습니다. 데이터는 기본값으로 공개되어 있었고, 사용자들은 자신의 조깅 경로가 원자력 추진 군함의 배치 패턴을 드러낼 수 있다는 생각을 하지 못한 채 자발적으로 공유했을 뿐입니다. 같은 종류의 문제는 2018년에도 비밀 군사기지를 드러냈습니다. Strava의 전 세계 히트맵에 아프가니스탄과 시리아의 러닝 경로가 환하게 떠올랐던 사건이죠. 교훈은 아직 제대로 배워지지 않았습니다.

'무해해 보이는' 데이터의 함정

피트니스 앱의 위치 데이터는 따로 놓고 보면 무해해 보입니다. 달리기를 했고, 자전거로 출근했고, 수영장에서 레인을 돌았을 뿐이니까요. 하지만 시간이 쌓이면 전혀 무해하지 않은 패턴이 드러납니다.

  • 집과 직장 위치. 가장 자주 시작하고 끝나는 지점은 거의 확실히 집과 사무실입니다. 러닝 경로를 기록하는 앱은 직접 알려준 적이 없어도 사용자가 어디서 살고 일하는지 알고 있습니다.
  • 일과 스케줄. 평일마다 오전 6시에 달리나요? 데이터를 보면 집이 언제 비는지 알 수 있습니다. 화요일마다 출장을 가나요? 부재 패턴이 그대로 기록됩니다.
  • 민감한 장소. 군인, 정보기관 요원, 공무원, 기업 임원 등 민감한 시설에서 일하거나 방문하는 사람은 누구나 흔적을 남깁니다. 기밀 시설에서 한 번만 운동을 해도 그 시설이 존재하고 당신이 거기에 접근할 수 있다는 사실이 드러납니다.
  • 사회적 관계. 그룹 러닝, 공유 경로, 구간 리더보드는 누가 함께 운동하는지 보여 줍니다. 정보 활동의 맥락에서는 이것으로 민감한 시설에 있는 개인들의 인맥을 그려 낼 수도 있습니다.

항공모함 사례는 극적이지만, 같은 원리는 일반인에게도 그대로 적용됩니다. 스토커가 피트니스 앱 데이터로 피해자의 위치를 알아낸 적이 있고, 도둑은 집이 비는 시간을 알아낼 수 있습니다. 고용주는 근무 시간 외 직원의 움직임을 감시할 수 있습니다. 데이터는 풍부하고 세밀하며, 많은 경우 무료 계정만 있으면 누구나 접근할 수 있습니다.

데이터는 어떻게 새는가

피트니스 앱은 여러 경로로 위치 데이터를 흘립니다. 어떤 경로는 눈에 띄고, 어떤 경로는 미묘합니다.

공개 활동 프로필

많은 앱이 기본값으로 프로필을 공개합니다. 달리기, 라이딩, 수영 기록이 GPS 궤적과 함께 지도 위에 누구에게나 보입니다. Strava의 기본값은 그동안 꾸준히 개선되었지만, 기본값이 더 느슨했던 시기에 계정을 만들고 설정을 다시 확인하지 않은 사용자가 많습니다. Strava에서 군사기지, 데이터센터, 관공서 근처 활동을 간단히 검색해 보면 보여서는 안 될 정보가 종종 드러납니다.

히트맵과 집계 데이터

개별 활동을 비공개로 설정해도 집계 데이터는 민감한 패턴을 드러낼 수 있습니다. 모든 기록된 활동의 밀도를 보여 주는 Strava의 전 세계 히트맵은 분쟁 지역 전진기지의 평면도를 그려 낸 것으로 유명합니다. 아무것도 없는 사막에 활동이 밝은 점처럼 나타났습니다. 개별 사용자는 익명이었지만 집계된 패턴은 명확했습니다.

구간 리더보드

Strava 구간은 사용자가 정의한 도로나 산길 구간으로, 사용자들이 가장 빠른 기록을 놓고 경쟁하는 곳입니다. 이런 구간은 지속적인 위치 표식이 됩니다. 항공모함 비행갑판에 있는 구간은 그 경로를 달린 모든 사용자를 식별해 냅니다. 개별 프로필을 비공개로 해 두어도 구간 리더보드에는 사용자명, 기록, 날짜가 나옵니다. 이를 다른 공개 정보와 대조하면 개인을 특정할 수 있습니다.

API 접근과 데이터 브로커

피트니스 앱은 API, 파트너십, 데이터 브로커 관계를 통해 제3자와 데이터를 공유하는 경우가 많습니다. 프로필을 비공개로 설정해도 데이터는 건강보험사, 광고주, 또는 다른 데이터셋과 결합하는 데이터 집계 업체로 흘러갈 수 있습니다. 피트니스 앱의 위치 데이터는 법 집행기관, 정보기관, 민간 조사원에게 팔리는 상업용 데이터베이스에도 등장한 적이 있습니다.

일반 개발자를 위한 OPSEC 교훈

위치 데이터나 민감한 패턴을 드러낼 수 있는 데이터를 다루는 애플리케이션을 만든다면, 피트니스 앱의 실패에서 구체적인 교훈을 얻을 수 있습니다.

기본값은 비공개로

너무 당연해 보이지만, 대부분의 피트니스 앱은 공개 프로필이 참여도와 성장을 이끈다는 이유로 수년간 이 원칙을 어겨 왔습니다. 위치 데이터를 수집하는 앱이라면 기본값은 비공개여야 하고, 사용자가 명시적으로 공유를 선택하게 해야 합니다. '기본은 공개, 설정 깊숙이 비공개 옵션이 있음'이 아니라, 실제로 기본이 비공개여야 합니다.

// Bad: default to public, user must opt out
const userSettings = {
profileVisibility: 'public',
activityVisibility: 'public',
showOnHeatmap: true,
shareWithPartners: true
};
// Good: default to private, user must opt in
const userSettings = {
profileVisibility: 'private',
activityVisibility: 'private',
showOnHeatmap: false,
shareWithPartners: false
};
// Better: explain what each setting actually means
const privacySettings = {
profileVisibility: {
value: 'private',
description: 'Only people you approve can see your profile',
riskLevel: 'Your name and activity history are visible'
},
activityVisibility: {
value: 'private',
description: 'Only you can see your activities',
riskLevel: 'GPS routes show where you live, work, and travel'
}
};

개인정보 보호 구역 구현하기

Strava는 결국 '개인정보 보호 구역(privacy zone)'을 추가했습니다. 민감한 장소 주변의 GPS 데이터를 숨기는 기능인데, 좋은 기능이지만 몇 년 늦게 나왔습니다. 위치 데이터를 기록하는 앱이라면 사용자가 기록을 막거나 데이터를 흐리게 처리할 영역을 직접 정할 수 있게 해야 합니다. 대부분의 사용자는 집과 직장 주변에 이 영역을 설정할 것이고, 그러면 가장 민감한 패턴은 대부분 사라집니다.

구현 세부사항: 경로의 시작점과 끝점에 무작위 오프셋을 더하는 것만으로는 경로 모양이 독특하면 충분하지 않습니다. 매일 같은 5km 코스를 도는 사람은 끝점을 가려도 알아볼 수 있는 모양이 남습니다. 더 나은 방법은 경로의 처음과 끝 N미터를 잘라내거나, 정확한 위치를 추론하지 못하도록 끝점을 격자에 맞춰 스냅하는 것입니다.

집계 공격을 고려하라

개별 데이터 포인트는 무해할 수 있지만, 집계된 패턴은 그렇지 않을 수 있습니다. 여러 사용자의 데이터를 결합하거나 시각화하는 기능, 예를 들어 히트맵, 리더보드, 인기 위치 기능을 만들 때는 어떤 패턴이 드러날지 생각해야 합니다. 비밀 시설을 강조하는 히트맵은 개별 사용자의 데이터가 노출되지 않더라도 집계 공격입니다.

방어책은 다음과 같습니다. 집계에 최소 임계값을 두어 고유 사용자가 N명 미만인 지역의 히트맵 데이터는 표시하지 않고, 민감한 지역은 제외하며, 공개 전에 시각화에서 예상치 못한 패턴이 드러나지 않는지 검토합니다. 집계 쿼리에 보정된 노이즈를 더하는 차등 프라이버시(differential privacy) 기법도 도움이 되지만, 제대로 구현하기는 복잡합니다.

데이터 공유 현황을 감사하라

위치 데이터를 제공하는 모든 API 엔드포인트, 모든 데이터 내보내기 기능, 모든 제3자 연동은 민감한 데이터가 새어 나갈 수 있는 통로입니다. 데이터 흐름을 지도로 그려 보세요. 사용자의 위치 데이터가 어디로 가는지, 누가 접근할 수 있는지, 어떤 조건에서 접근하는지 정확히 알아야 합니다. 파트너나 광고주와 데이터를 공유한다면, 무엇을 누구와 공유하는지 사용자에게 명확히 알려야 합니다.

더 큰 그림: 데이터 최소화

근본적인 질문은 애플리케이션이 정말 그 데이터를 필요로 하는가입니다. 러닝 앱은 1초 간격의 GPS 좌표가 필요할까요? 경로 시각화에는 필요합니다. 거리와 페이스 계산에는 더 낮은 해상도로도 충분합니다. 칼로리 추정에는 총 거리와 고도 변화만 있으면 됩니다.

데이터 최소화, 즉 사용자가 쓰고 있는 특정 기능에 필요한 데이터만 수집하는 것은 데이터 유출에 대한 가장 강력한 보호책입니다. 수집하지 않은 데이터는 유출되거나, 소환 영장의 대상이 되거나, 팔리거나, 감시 패턴으로 결합될 수 없습니다. 일단 모두 수집해 두고 나중에 쓸 곳을 찾자는 성장 지향적 본능과 충돌하지만, 진정으로 견고한 유일한 방법입니다.

사용자 데이터를 보호하는 최선의 방법은 더 나은 암호화나 더 엄격한 접근 통제가 아닙니다. 애초에 그 데이터를 갖고 있지 않는 것입니다.

피트니스 앱 업계는 이 교훈을 쓰라린 방식으로 배웠고, 일부 기업은 아직도 배우지 못했습니다. 군인들은 여전히 항공모함에서 Strava를 쓰고 있고, 정보기관 요원들은 여전히 기밀 시설 근처에서의 러닝을 기록하고 있습니다. 데이터는 여전히 서버, API, 데이터 브로커로 흘러가고, 그들은 어떤 개별 사용자도 드러내려 하지 않았던 패턴을 맞춰 낼 수 있습니다. 개발자로서 우리는 위험으로부터 사용자를 기본값으로 보호하는 시스템을 만들 수도 있고, 사용자의 무관심을 이용하는 시스템을 만들 수도 있습니다. 항공모함의 승조원이 러닝 앱을 열 때 보안 결정을 내린 것은 아닙니다. 기본 설정을 고른 앱 개발자가 수년 전에 그 결정을 내렸습니다.