brunch

You can make anything
by writing

C.S.Lewis

by 테크유람 Apr 01. 2021

왓츠앱(WhatsApp)의
메시지 동기화 및 암호화

모바일과 PC간의 메시지 동기화 및 암호화



대부분의 인스턴트 메신저들은 모바일 앱과 PC 버전을 제공합니다. 두 개의 앱을 동시 사용하는 경우의 데이터 동기화는 챗 서버의 데이터 동기화 아키텍처와 밀접한 관련이 있습니다. 일반적으로 주고받은 챗을 중앙 서버에 올려두고 클라이언트와 동기화를 하고, 동기화가 완료된 오래된 데이터는 데이터베이스와 클라이언트 특정 영역에 저장합니다.


메시지를 주고받은 사용자 간의 암호화가 중요해지면서 종단 간 암호화(End-To-End Encryption)가 적용된 서비스의 메시지 동기화는 예전처럼 단순한 아키텍처에서는 구현이 불가능합니다. 이 글에서는 왓츠앱의 사례를 들어 종단 간 암호화 기술을 적용하면서도 동일한 사용자의 다른 장치의 앱이 데이터 동기화를 수행하는 과정을 알아보았습니다.

WhatsApp PC 버전은 모바일 앱이 구동 중일 때만 사용할 수 있습니다. PC 버전을 실행해보면 아래 스크린숏처럼 "휴대전화 항상 연결"이라는 메시지가 보이며 이것은 바로 메시지 동기화가 때문입니다. 반대로 해석하면 동일한 사용자의 여러 디바이스에서 운영되는 왓츠앱은 메시지 동기화를 서버(server)가 아닌 클라이언트(client)끼리 진행하는 것임을 눈치챌 수 있습니다.


누군가 나에게 메시지를 보낸다면 PC 버전과 모바일 버전이 모두 인터넷을 통해 연결된 상태에서 두 개의 디바이스에 동일한 메시지를 동시에 받겠다는 의미입니다. PC 버전은 메시지 동기화를 위해 항상 사용자의 모바일 장치와 연결되어야 하지만, 움직이며 사용하는 모바일 버전은 꼭 PC 버전이 구동되지 않아도 상관없이 운영될 수 있는 것은 당연한 일입니다.


<왓츠앱 PC 버전은 휴대전화가 항상 연결 상태여야 한다>


이것을 좀 더 생각해보면 PC 버전은 모바일로부터 수신 메시지를 받아 간다고 유추할 수 있습니다. 그렇지만 PC 버전은 유선 인터넷, 모바일은 LTE를 사용하는 등 각각 다른 인터넷 환경을 사용할 수 있기 때문에 두 개의 소프트웨어가 직접 퍼블릭한 인터넷상의 P2P 통신을 한다고는 생각하기 어렵습니다. 다른 종류의 네트워크 환경에서는 NAT나 방화벽 같은 문제가 도사리고 있기 때문에 중계 서버를 사용하는 방식이 가장 알맞습니다.


보안적으로는 두 개의 Device가 메시지 동기화를 위해 주고받는 데이터는 사용자가 주고받는 채팅 메시지이며 암호화가 되어야 하기 때문에 PKI 기술이 사용될 것입니다.


암호화 키 교환은 일반적으로 아래 방식을 사용합니다. PC버전을 구동하면 모바일 버전의 앱으로 PC 버전이 생성한 QRCode를 인식하도록 하는데 이 과정을 통해 디바이스를 인식하고 PC와 모바일은 각각 자신의 공유키를 공유합니다.

<동일한 사용자의 여러 메신저 디바이스>

공유키가 교환 완료된 상태에서 각 디바이스 간의 메시지 동기화 흐름은 다음과 같습니다.


① 모든 사용자는 사전에 각자의 디바이스에 공유키와 개인키 한 쌍을 가지고 있다.

② Alice가 Bob에게 메시지를 보내는 순간 각자 활성화된 디바이스 정보와 그것의 공유키, OTP 키를 공유한다.

③ Alice가 Bob에게 메시지를 보내면 3개의 키로 각각 암호화된 메시지가 서버에 전송된다.

④ 각 디바이스는 서버로부터 메시지를 Subscribe 한다.

⑤ 각 디바이스는 보유한 Private Key로 메시지를 해독한다.

⑥ 시간이 지나면 OTP(One Time Password)는 새로운 것으로 갱신된다. Key가 유출되어도 대량의 메시지 유출을 방지한다.


중요한 점은 WhatsApp은 종단 간 암호화(E2E, End-To-End Encryption)를 (일부) 지원하기 때문에 모든 메시지를 클라이언트 내에서 암호화되어 전달하고 클라이언트 내에서만 복호화할 수 있다는 점입니다. 즉 전송 구간 중간에서 어떤 서버나 관리자가 들여다볼 수 없는 구조로 구성해야 합니다.






브런치는 최신 브라우저에 최적화 되어있습니다. IE chrome safari