예전에 이런 댓글을 본 적이 있습니다. 한창 톡 감청 루머로 대한민국이 시끌시끌하던 때입니다.
애초에 카카x톡에 왜 서버가 필요한지 모르겠어요. 그냥 서로 주고받으면 되는 거 아닌가요?
물론 지금 이 글을 저분이 볼지 안 볼지는 모릅니다. 물론 못 보실 확률이 높겠지만 저의 마음이 그분께 닿길 바랍니다.
유치하긴 하지만 상황극으로 예를 들어보겠습니다.
톡돌이와 톡순이는 연애를 시작했는데요. 이렇게 컵과 실을 연결하여 대화를 합니다. 편의상 실은 필요한 만큼 무한정 늘일 수 있다고 가정합니다.
톡돌이와 톡순이는 서로의 위치에 직접 연결되어있다.
언제 어디서나 꼭 귀를 대고 있기로 합의했다.
그렇지 않으면 상대의 메시지를 놓칠 수 있음에 동의했다.
만약 연결이 끊어지면 어떻게든 서로의 위치를 알아내서 직접 연결하기로 한다.
하지만 며칠 지내보니 너무 불편했습니다. 위는 아래의 문제점이 있기 때문입니다.
저장매체가 없기 때문에 한 번 받은 메시지는 다시 확인할 수 없다.
계속 연결을 유지하고 있어야 한다.
귀를 떼거나 자고 있으면 메시지가 유실된다.
끊어지면 직접 위치를 파악한 후 다시 직접 연결해야 한다.
생각만 해도 매우 애틋한 상황입니다. 이 상황을 조금이나마 편하게 할 수 있는 방법은 무엇일까요?
톡돌이, 톡순이는 뭔가 도움이 될 수단을 찾아보았습니다. 구름이에게 부탁을 해보려 합니다. 톡돌이와 톡순이의 요구사항은 아래와 같습니다.
메시지를 다시 확인할 수 있으면 좋겠다.
귀를 떼도, 자고 있어도 메시지가 유실되지 않았으면 좋겠다.
위치를 직접 파악하지 않아도 연결을 잘 시켜줬으면 좋겠다.
그래서 구름에게 부탁했습니다. 이 구름이는 어떻게 위 문제점들을 해결했을까요?
메시지를 전송하면 구름속에 쌓아둔다.
상대가 연결되어 있다면 메시지를 바로 보낸다.
상대가 부재중이라면 메시지가 왔다고 알려준다.
재접속시 구름속에 쌓아둔 메시지를 보여준다.
단, 구름이는 톡돌이, 톡순이에게 몇 가지 부탁을 했습니다.
다른 사람이 구름 속을 휘저을 수 있으니 나를 부를 때마다 너임을 증명해줘.
자는 동안 쌓아둔 메시지는 다시 확인시켜줄게. 단, 너희들이 받아 적어두었으면 해.
단, 3일 동안만 보관할게. 내가 너무 무거워지면 너희들을 도와줄 수 없으니까.
3일이 지났는데 너희들이 적어두지 않은 메시지는 평생 확인 못한다는 점 꼭 주의하고!
바로 위 구름이의 역할이 서버의 역할이라고 보면 되겠습니다. 개발자의 언어로 바꿔봅시다. 일단 톡돌이, 톡순이 커플의 요구사항입니다.
메시지를 다시 확인할 수 있으면 좋겠다.
→ 지금까지 주고받은 메시지를 시간순으로 앱에서 보고 싶다.
귀를 떼도, 자고 있어도 메시지가 유실되지 않았으면 좋겠다.
→ 앱을 꺼둔 상태에서도 다시 켰을때 쌓인 메시지를 보고 싶다.
위치를 직접 파악하지 않아도 연결을 잘 시켜줬으면 좋겠다.
→ 서버가 알아서 내가 원하는 상대에게 메시지를 전송해주면 좋겠다.
우리가 메신저 서비스를 이용할 때의 요구사항과 같습니다. 이를 위해서는 서버가 꼭 필요합니다.
아래는 서버가 하는 일입니다.
메시지를 전송하면 구름 속에 쌓아둔다.
→ 서버(database)에 메시지를 저장한다. 단, 당사자만 확인할 수 있도록 암호화하여 저장한다.
상대가 연결되어 있다면 메시지를 바로 보낸다.
→ 상대가 접속된 채팅 서버를 통해 메시지를 bypass 한다.
상대가 부재중이라면 메시지가 왔다고 알려준다.
→ iOS, Android 각각의 푸시 노티 서비스(APNS, FCM) 이용한다.
재접속 시 구름 속에 쌓아둔 메시지를 보여준다.
→ 앱 구동 시 서버와 메시지를 동기화한다.
구름이가 부탁한 일도 개발 언어로 바꿔보겠습니다.
다른 사람이 구름 속을 휘저을 수 있으니 접속할 때마다 너임을 증명해줘.
→ 회원가입 및 계정 생성. 인증. (카톡의 경우 전화번호 인증 및 카카오 계정 인증)
자는 동안 쌓아둔 메시지는 다시 확인시켜줄게. 단, 너희들이 받아 적어두었으면 해.
→ 서버에 저장된 메시지들을 앱에 저장하여 동기화한다.
단, 3일 동안만 보관할게. 내가 너무 무거워지면 너희들을 도와줄 수 없으니까.
→ 서버 메시지 저장 정책.
3일이 지났는데 너희들이 적어두지 않은 메시지는 평생 확인 못한다는 점 꼭 주의하고!
→ 서버 메시지 저장 정책.
카카오톡, 라인, 텔레그램, 페메 등 대부분의 메신저 서비스들의 서버가 이런 일을 합니다. 이제 서버가 왜 필요한지 감이 좀 오실지 모르겠네요. 물론 서버는 추가적으로 이런 일도 합니다.
비개발분들은 어떻게 생각하실지 모르겠지만, 멀티 디바이스를 사용 시 그게 자동으로 동기화가 되는 게 아닙니다. 폰, 태블릿, 노트북 이 세 가지 기기가 동시에 접속되어 있는 경우는 서버에서 내가 접속된 기기들을 확인 후 강제로 동기화를 시켜줘야 하는 것이죠. 물론 동시에 접속된 상황이 아닌 경우는 어차피 앱을 켤 때 서버와 메시지를 동기화하는 절차를 거칩니다.
물론 이외에도 굉장히 많은 일을 하는 게 서버의 역할입니다. 이제 왜 서버가 꼭 필요한지 이해가 되셨을 거라고 생각합니다.
내가 자고 있어도 구름이가 내 집에 들어와서 적어두면 되는 거 아닌가요?
→ 기술적으로 불가능합니다. 물론 된다고 해도 개인정보 침해라서 못합니다.
암호화한다고 해도 서버에서 누군가는 확인 가능한 것 아닌가요?
→ 디코딩을 위한 키는 톡돌이, 톡순이 본인만 알고 있어서 불가능합니다.
"상대가 접속된 서버를 통해 메시지를 bypass 한다."와 "APNS, FCM 등의 푸시 노티 서비스"를 사용하는 게 다른가요?
→ 결과적으로 다르진 않습니다만 OS별 푸시 노티 서비스는 굉장히 느립니다. 채팅하다가 속터집니다. 따라서 둘 다 앱을 켠 경우는 서비스 자체적으로 빠르게 튜닝하여 bypass 시킵니다.
승x, 정준x 등 뉴스에서는 몇 달 전 단톡방 메시지도 복구한다고 하는데, 3일 간만 저장한다는 건 무슨 얘기인가요?
→ 서버에만 3일간 저장한다는 뜻입니다. 뉴스에서 나오는 메시지 복구는 폰에 저장된 데이터를 복구한다는 뜻입니다.
우리나라는 개인정보에 정말 민감한데요. 사실 비개발자분들이 잘 모르는 부분이 있어서 좀 더 크게 느끼시는 것 같습니다. 결론적으로, 메신저 앱 회사 차원에서의 감청이나 해킹은 거의 불가능하다고 보면 되겠습니다. 요즘 빈번하게 발생하는 해킹 사건은 이 서버가 잘못한 건 아니고요. 사기꾼들이 사용자의 아이디/패스워드를 살살 꼬셔서 갈취하는 것입니다. 그러니 평소에 보안을 철저히 하도록 합시다.
메시지를 서버에서 아무리 암호화한다고 해도 직원들이 디비를 조회하여 풀 수 있는 거 아니냐고 의문을 품으실 수도 있겠습니다만 이렇게 생각하시면 되겠습니다. 군필자 분들은 아실 겁니다. "우와! 군대에 실탄 많으니까 막 꺼내서 맘대로 쏘고 놀고 그랬겠다!!"라는 말이 얼마나 터무니없는 말인지를요. 심지어 폐쇄 조직인 군대에서도 위험한 부분에 대해선 스스로 매우 엄격하게 관리하는데, 국가 기관에서 호시탐탐 정책에 대해 감시받고 감사받는 일개 메신저 회사가 이 민감한 메시지들을 허술하게 관리하지 못합니다. 절대요.
나름 쉽게 설명해보려고 예시도 들고, 여자 친구한테 부탁해서 그림도 그려달라고 했는 데 성공한 건지 잘 모르겠습니다. 무튼 글 위에 언급했던 그 댓글을 다셨던 분에게 저의 마음이 조금이나마 전달됐길 빕니다.