NHS COVID-19 접촉자 추적 베타는 이제 iOS와 Android 모두 오픈 소스로 공개되었으며, 문서도 함께 제공됩니다. “계속 살아 있기” 글의 후속으로 소스 코드를 깊이 들여다보았습니다. MIT 라이선스로 공개되어 있다는 점이 반가운 놀라움이며, 투명성과 품질에 대한 NHSX의 의지를 보여 줍니다.
지난 이틀 동안 여러 엔지니어가 이 앱이 계속 살아 있을 수 있는지, 그리고 어떻게 그럴 수 있는지를 알아내기 위해 앱을 살펴보았습니다. 이를 이해하려면 대부분의 개발자가 알고 있는 것보다 관련 CoreBluetooth 프레임워크를 더 깊이 이해해야 했습니다. 엔지니어가 보통 깊이 파고들 필요가 없는 프레임워크입니다.
꽤 초기에 저희는 Android 기기에서 이 방식이 어떻게 작동하는지 발견해 보고했습니다. 오늘 밤에는 iOS에서 정확히 어떤 일이 일어나는지 공유합니다. 하나씩 따라가 보겠습니다.
첫 실행
처음 실행하면 앱은 활성화 코드, 푸시 알림 토큰, 사용자가 입력한 우편번호의 앞부분을 담아 https://api.svc-covid19.nhs.uk/api/devices/registrations로 PUT 요청을 보냅니다. 그 응답으로 서버는 앱 설정에 저장되는 linkingId를 돌려줍니다.
앱은 예상할 수 있듯이 푸시 알림과 Bluetooth 권한도 요청합니다. 위치 권한은 요청하지 않으며, 따라서 사용자의 우편번호를 검증하지도 않습니다. 우편번호의 앞 몇 자리만 필요합니다.
Android 앱이 위치 데이터에 접근한다는 주장이 있었는데, Android 기기에서 Bluetooth API 접근 안내가 위치 권한을 요청하는 것처럼 보이기 때문입니다. 그러나 저희는 어제 이것이 사실이 아님을 밝혔습니다. 이는 Android가 Bluetooth 권한 요청을 관리하는 방식에서 비롯된 결과입니다.
Android에서 살아 있도록 유지하기
앱이 백그라운드에서 잠들지 않게 하는 일은 Android에서는 간단합니다. 기본 API가 이 기능을 지원하고, 엔지니어에게 Bluetooth 하드웨어에 대한 저수준 접근 권한을 주기 때문입니다.
하지만 iOS에서는 이야기가 그리 간단하지 않습니다. iOS에서 앱이 백그라운드로 전환되면 기능이 크게 줄어듭니다. 개발자에게 Bluetooth 접근 권한을 주는 Apple 프레임워크인 CoreBluetooth도 마찬가지입니다. 영리한 우회책이 없다면, 백그라운드 모드로 실행 중일 수 있는 iPhone을 앱이 감지하기가 훨씬 어려워집니다. 저희는 여러 iOS 기기를 몇 시간 동안 그대로 두고 테스트했고, 폴링이 덜 자주 이루어지긴 하지만 기기들이 밤새도록 통신한다는 것을 확인했습니다.
Android로 iPhone 깨우기
어제 저희는 iOS 앱이 백그라운드에 있을 때도 Bluetooth 광고를 계속 브로드캐스트하지만, Apple에만 해당하는 다른 방식으로 한다는 점도 보고했습니다. NHSX / Pivotal 엔지니어들이 이를 리버스 엔지니어링해 Android 앱에 지원을 추가했다고 저희는 믿었습니다. 실제로 그렇다는 것을 확인할 수 있으며, 이에 대한 기술적 세부 사항은 여기에서 볼 수 있습니다. 이는 iOS 기기가 앱을 백그라운드 상태로 유지할 수 있는 것에 더해, Android 기기가 백그라운드에 얼마나 오래 있었든 상관없이 “잠들어 있는” iOS 기기를 깨울 수 있다는 뜻입니다.
그렇다면 이것이 의미하는 바는 무엇일까요? 앱이 작동하려면 iPhone이 Android 기기의 범위 안에 꽤 자주 있어야 하며, 그래야 keepalive를 보내 스스로 백그라운드 상태를 유지할 수 있다는 뜻입니다. 이것만으로는 실현 가능한 해결책이 아닐 수도 있지만...
iOS 기기로 다른 iOS 기기 깨우기
어제의 “계속 살아 있기” 글에서 저희는 iOS 앱이 “keepalive”를 사용해 백그라운드 제한을 우회하고 있다고 믿는다고 보고했습니다. iOS 앱 소스 코드를 살펴본 결과 실제로 그렇다는 결론을 내렸습니다. 그렇다면 정확히 어떻게 작동할까요?
간단히 말해 이 맥락에서 keepalive는 앱 개발자들이 생각해 낸 아이디어입니다. 앱을 실행 중인 두 iOS 기기 사이에 보내는 알림으로, 두 기기 사이의 연결을 유지합니다. 흥미로운 점은 이것이 앱을 훨씬 오래 깨어 있게 하는 효과도 있다는 것입니다. 기기가 keepalive를 받으면 iOS가 추가 처리를 하도록 앱이 깨어 있는 것을 허용하기 때문입니다.
실용적인 관점에서 이는 다른 기기와 가까이 있기만 하면 앱이 살아 있는 상태를 유지할 수 있다는 뜻입니다. 어떤 의미에서 이것이 COVID-19 추적 프로젝트의 존재 이유입니다. 이런 기술적 요령이 없더라도, 공공 안전에서 좋은 결과를 얻으려면 임계 규모의 사용자가 추적 앱을 실행해야 합니다.
이와 별개로, 앱은 백그라운드로 전환되어도 곧바로 잠들어 일시 중단 상태에 들어가지 않습니다. 따라서 문제는 대부분의 사용자가 우회책이 통할 만큼 충분한 iOS 또는 Android 기기 주변에 있을 것인가입니다. 저희 생각에는 그럴 가능성이 높아 보이며, 인구가 밀집한 지역에 더 자주 있는 사용자에게는 더욱 그렇습니다. Bluetooth는 꽤 괜찮은 유효 범위를 갖고 있습니다.
일부 관찰자는 앱이 무음 알림을 받을 수 있다는 점을 들어, 이 기능으로 원격에서 스스로를 깨우고 있다고 주장했습니다. 그러나 이 기능은 사용자가 COVID-19에 감염된 사람 근처에 있었는지를 알려 주는 데에만 쓰입니다. 앱은 시스템이 앱을 강제로 종료한 것을 감지해 사용자에게 앱을 다시 열도록 안내하는 로컬 알림도 사용합니다. 사용자가 Bluetooth를 끌 때도 비슷한 알림이 사용됩니다.
Reincubate의 CEO인 Aidan Fitzpatrick은 이렇게 말합니다.
네, iOS 13.5에 곧 도입될 Apple의
ExposureNotification프레임워크가 이런 keepalive의 필요성을 없애는 것은 사실입니다. 그러나 다음 사항에 유의할 필요가 있습니다.
- iOS 13.5는 아직 출시되지 않았으며, 몇 주 더 걸릴 수도 있습니다
- 어제 이전까지 마지막 iOS 13.5 베타에는 심각한 보안 결함이 있었는데, 이는 Apple 엔지니어링 팀 내부에서 대규모 작업이 진행되고 있음을 시사합니다
- 출시되더라도 대다수 iOS 사용자가 설치하기까지는 몇 달이 걸릴 가능성이 큽니다(이례적으로 Android의 동급 버전 보급은 더 빠를 수 있습니다)
- iPhone 6 같은 구형 iOS 기기는 iOS 13을 실행할 수 없으므로 Apple의 방식을 사용할 수 없습니다
- NHS COVID-19 앱이 앞으로 Apple의 프레임워크를 사용하는 쪽으로 자동 전환하지 못할 이유는 없으며, 두 방식을 함께 이중으로 운영하는 것도 가능합니다
이 앱은 더 많은 사람이 사용할수록 점점 더 효과적이 될 것이며, 이런 의미에서 대규모 보급의 이점은 선순환 효과를 낳을 것입니다. 호주의 COVIDSafe 앱은 Android 기기에서 백그라운드 상태의 iOS 기기를 감지하는 것을 지원하지 않았고, 이런 영리한 iOS 기기 간 keepalive 메커니즘도 없었기 때문에 어려움을 겪었습니다.
어떤 상황에서 이런 기술을 사용하는 것이 적절한지 생각해 보는 것이 중요합니다. 접촉자 추적이 생명을 구하는 데 성공한다면, 미래의 질병에 이를 적용할지 여부를 판단하기 위해 어떤 기준을 평가해야 할까요? 일단 선례가 만들어지면, 이 기술이 이미 존재하는 감염병에 맞서는 데에도 쓰일 수 있다는 주장이 나올 수 있지 않을까요? 사회마다 이런 득실을 다르게 평가하리라는 것은 충분히 예상할 수 있습니다.
개인정보 보호 안전장치
프로토콜의 수학적 원리에 대한 상세한 분석은 이 글의 범위를 다소 벗어나지만, 개인정보 보호 안전장치는 살펴보았습니다. 이 앱은 NCSC가 발표한 문서를 엄격히 따르는 것으로 보입니다. 사용자가 증상을 신고하기 전까지는 어떤 키 데이터도 사용자의 기기를 떠나지 않으며, 신고한 후에야 가까이 있었던 기기들의 익명화된 키가 기기를 떠난다는 것을 확인할 수 있습니다. 사용자가 입력한 우편번호의 앞부분은 등록 서비스의 일부로 API에 전송됩니다.
결국 코드로 볼 때, 사용자가 증상을 신고하고 NHS에 연락해 검사를 예약하기 전까지는 이 앱을 사용하는 데 따르는 기술적 개인정보 위험이 거의 없습니다. 그 시점에서 검사 결과는 NHS가 관리하게 되며, 이는 앱이 있든 없든 다르지 않습니다. 하지만 여러 사용자가 접촉하고, 증상을 신고하고, 앱이 제공한 식별자를 사용해 검사를 예약하는 경우, 이들을 중앙에서 연결하는 것이 가능할 수도, 불가능할 수도 있습니다. 이는 백엔드의 문제이며, NHSX가 앱 개인정보 보고서에서 밝혔듯이 이 점에서는 코드가 곧 진실입니다.
허위 신고 방지
시스템의 백엔드는 오픈 소스로 공개되지 않았기 때문에 이를 확인할 수는 없지만, 시민들이 COVID-19 양성 판정을 받기 전까지는 다른 기기로 푸시 알림이 전송되지 않는 것으로 보입니다. 사용자가 증상을 신고하면 검사를 예약하는 데 쓸 수 있는 참조 코드를 받습니다. (이 코드는 등록 섹션에서 설명한 linkingId와 같습니다.)





