더 안전한 대화를 위한 Letter Sealing

안녕하세요. LINE의 보안 관련 업무를 담당하고 있는 원종일입니다. 이번 글에서는 스마트폰 사용자들이 모바일 메신저를 선택할 때 중요하게 생각하고 있는 메시지 보안, 그 중에서도 네트워크를 통한 안전한 메시지 송수신 시 고려해야 할 문제와 이를 해결하기 위해 LINE 5.3에 추가된 Letter Sealing 기능에 대해서 설명하고자 합니다.

메시지를 안전하게 전달하기

오랜 옛날부터 비밀 정보를 전달하는 일은 항상 존재해왔고 또한 중요한 것이었습니다. 사람들은 인적이 드문 곳에 숨어서 비밀 이야기를 하거나 자신들만의 은어(隱語)를 만들어 다른 사람들이 이해하지 못하게 하여 자신들의 대화를 숨겨왔습니다.

하지만 이러한 방식들은 상대방이 가까운 곳에 있을 때만 사용할 수 있는 방법이었습니다. 현대의 인터넷과 같은 장거리 간의 통신이 없었던 옛날에는 종이와 같은 매체에 적은 문서를 봉투에 넣어 사람이 직접 전달하는 것 외에는 방법이 없었습니다. 하지만 사람이 전달하는 과정에서도 봉투를 몰래 개봉해 비밀을 확인하고 다시 봉투를 봉합하여 그대로 전달하는 문제가 있었습니다. 때로는 문서의 내용을 수정, 조작하여 내용을 왜곡해 전달하더라도 확인할 방법이 없었습니다. 따라서 처음에 작성한 내용을 전달자로부터 안전하게 전달하는 것은 어려움이 많았습니다.

그래서 사람들은 새로운 방법을 생각해 냈습니다. 내용을 숨길 수 없다면 최소한 누가 문서를 작성하였는지, 누군가 중간에 봉투를 뜯지는 않았는지를 확인할 수 있는 표식을 만들어야겠다고 생각하게 되었습니다. 이렇게 해서 탄생한 것이 봉인(Sealing)입니다. 전달할 문서를 잘 봉합한 후에 밀랍(wax)과 같은 것을 이용하여 문서를 담은 봉투를 완전히 봉인하는 방식이었습니다. 따라서 중간 전달자가 문서를 확인하려면 봉인을 훼손해야 했고, 전달 받은 사람은 전달 도중에 누군가 훔쳐 봤는지, 혹은 내용을 조작했는지 여부를 봉인의 상태로 확인할 수 있었습니다. 그리고 봉인을 훼손하고 다시 복구하지 못하게 하기 위해서 고유한 문양의 도장을 찍어 보내는 방식을 사용했습니다. 또한 더 어려운 방법으로 문서의 글자를 특수한 액체로만 볼 수 있게 해서 글자를 숨기기도 했습니다.

[그림 1] Letter Sealing

이렇게 옛날부터 사용한 봉인 방식은 문서 전달 과정에서 생기는 여러 가지 위험으로부터 문서를 보호하는 역할을 했습니다. 하지만, 이 방법은 오랜 옛날의 내용 전달 방법으로, 반드시 종이 문서를 통해 전달할 때나 의미가 있었던 방법입니다. 현대의 커뮤니케이션처럼 인터넷으로 정보를 전달할 때, 그 중에서도 LINE으로 메시지를 전송할 때 어떤 방식을 사용하여 메시지 전송의 안전을 보장하고 있을까요? 그 방법을 살펴보도록 하겠습니다.

LINE에서 제공하는 기본 암호화 방식

모바일 시대에 사용하는 모든 메신저와 SNS는 메시지를 전달하고 저장하기 위해 서버가 항상 존재합니다. 서버에서는 사용자로부터 전달 받은 메시지나 기타 정보를 해석하고 수신자에게 다시 전달해 주는 역할을 합니다. 만약 수신자에게 즉시 전달할 수 없다면 서버에서는 일정 기간동안 그 내용을 디스크에 저장하고, 사용자에겐 새로운 메시지가 있다는 내용을 알림(push notification)으로 발송하게 됩니다.

메신저 서비스에서 서버까지 전달되는 메시지의 안전을 보장하기 위해 암호화는 매우 중요한 기술입니다. LINE에서도 사용자의 여러 가지 정보들이 서버에 전달되는 과정에서 제 3자에 의한 불법 접근을 막기 위해 오래 전부터 암호화를 제공하고 있습니다. 사용자 단말기의 메신저와 서버 사이의 암호화된 통신 과정을 다음 그림과 같이 간략하게 표현할 수 있습니다.

[그림 2] 현재의 LINE 메시지 전송

암호화 통신을 제공하지만 여전히 문제는 있습니다. 암호화를 하거나 암호화된 내용을 복호화하기 위한 비밀 키를 LINE 앱에 포함해서 배포할 수 없다는 문제가 있습니다. 만일 그렇게 했다면 동일한 복호화 키를 이용하여 통신 네트워크를 감청할 경우 모든 사람의 메시지를 다 들여다 볼 수 있기 때문입니다.

그 대신 LINE에서는 공개키 암호화(public key encryption) 방식을 사용하여 LINE 앱을 배포할 때에는 암호화를 할 수 있는 public key만 앱에 포함해서 배포하고, 사용자 단말과 서버가 연결될 때만 LINE 서버만이 해석할 수 있는 암호화된 안전한 채널을 만듭니다. 이렇게 하면 SSL(Secure Socket Layer)보다 가벼우면서 모든 LINE 버전에서 사용할 수 있는 안전한 암호화가 가능합니다. 중간의 매체를 도청하는 중간자 공격으로부터(MITM, Man In The Middle Attack) 안전한 방법입니다.

[그림 3] LINE에서의 RSA 암호화 방법

현재 LINE에서 사용하고 있는 방식은 공개키 암호화(public key encryption), 그 중에서도 현재 SSL에서 가장 일반적으로 사용하고 있는 RSA라는 암호화 방식을 이용하고 있습니다. LINE에서 RSA를 사용한 방식을 자세하게 설명하면 다음과 같습니다.

먼저 서버에서 발행한 RSA 키를 이용하여 사용자의 LINE 앱(클라이언트)에서는 데이터를 암호화할 때 사용할 암호화 키 값을 공유하게 됩니다. 이후에는 이 키를 이용해 데이터를 암호화하게 되어, 제3자는 메시지를 볼 수 없게 됩니다. 이 방식이 안전하다고 할 수 있는 근거의 기반에는 RSA의 개인 키가 오직 LINE 서버에만 보관되는 값이기 때문입니다. 즉, 악의적인 목적을 가진 공격자는 LINE 서버를 해킹해 키를 소유하고 가짜 서버를 만들지 않는 한 메시지를 복구할 수 없는 것이 현재의 메시지 암호화 시스템 방식입니다.

[그림 4] 대량의 메시지 봉인 저장

그러나 이 방식에는 한 가지 약점이 존재합니다. 실제로는 있지 않는 상상의 경우이긴 하지만, LINE 서버 내부에서 공격자, 즉 해커가 존재할 경우 현재의 방식으로는 메시지의 안정성을 보장할 수 없다는 문제입니다. 간단히 예를 들어 설명하면 현재의 LINE 메시지 보호 방식은 위의 밀랍 봉인을 대량으로 생산하여 LINE의 서버 창고에 보관하고 있는 것과 같습니다. 이렇게 대량으로 생산된 봉인은 봉인이 되어 있는 편지(혹은 메시지)가 오게 되면 그 봉인을 뜯고 다시 한번 봉투를 정리한 후 다시 봉인을 붙여 받는 사람에게 보내는 방식입니다.

물론 현재 이 대량 생산된 봉인은 기술적으로 LINE 서버 내에만 존재하고 있습니다. 하지만 만약에 내부에 해커가 존재한다고 하면 안전성을 보장하기가 어려울 수 있습니다. 또한, 의도적이든 의도적이지 않든 LINE의 암호화를 처리하는 과정에서는 매우 일시적이지만 메시지가 평문 형태로 노출되게 됩니다. 따라서 이 순간에 서버의 권한을 취득한 공격자가 메시지를 훔쳐보고자 하면 기술적으로 그것을 완벽하게 막을 수 없게 됩니다.

최근까지는 이러한 형태의 보안 취약점이 큰 이슈가 되지는 않았습니다. 그러나 현재의 인터넷은 예전과는 환경이 많이 달라졌습니다. 먼저, 과거와는 달리 인터넷 서비스가 일상생활과 밀접한 관련을 가지게 되면서 공격에 의한 일반 사용자들의 피해도 더욱 커지게 되었습니다. 또한 컴퓨터 기술의 고도화와 함께 해킹 기술 또한 발전하게 되면서 기존에는 경험하지 못했던 다양한 형태의 침해 사건이 발생하기 시작했습니다. 게다가 개인 위주로 활동하던 해커들이 점점 집단, 기업화되면서 공격 규모가 커지게 되고 기존에는 상대적으로 안전하다고 생각했던 서버 공격으로 인한 피해가 치명적으로 발생하기 시작하였습니다. 따라서 기존에는 크게 고려하지 않았던 부분이 최근에는 관련 이슈가 많이 발생하여 위험성에 대한 재평가와 보완 방안이 필요하게 되었습니다.

LINE에서는 발생할 수 있을 여러 보안 위험에 대해 재평가를 수행하였고 그 중 메시지의 보호 방식을 개선해야 할 필요가 있다는 결론을 내렸습니다. 해결책으로 앞서 설명한 옛날의 봉인 방식을 현대의 디지털 메시지 전송에도 도입하여 해결하고자 하였습니다. 즉, 기존의 LINE 서버에서 대량 생산된 봉인이 아닌 각각의 사용자가 고유의 봉인을 직접 생성하여 메시지 안전성을 보강하고자 하였습니다. 그리고 LINE의 새로운 메시지 보호 기능에 대해 사용자가 쉽게 이해할 수 있도록 ‘Letter Sealing’이라는 이름을 붙였습니다.

Letter Sealing: 무엇이 어떻게 나아졌는가?

Letter Sealing이라는 새로운 기능은 과연 어떤 면에서 달라진 것일까요?
먼저 기술적으로 안전한 알고리즘을 사용하여 송신자와 수신자 사이에 안전한 암호화 키 교환을 수행할 수 있도록 하였습니다. Letter Sealing에서는 기존의 RSA 방식을 이용한 키 교환 방식이 아닌 Diffie-Hellman(이하 DH) 방식을 기반으로 암호화 키 교환을 수행하였습니다. 이 방식은 암호화 키를 암호화하여 전송하는 방식이 아닌 양측이 서로 공개해도 되는 값을 공유하기만 하면 중간 지점에서는 알 수 없는 값을 생성해내는 방식입니다. 이를 통해 메시지를 교환하고자 하는 양 사용자는 DH의 공개키와 비밀키를 생성하고 이 중 공개키를 상대방에게 넘겨주기만 하면 중간에 제3자가 존재하더라도 안전하게 통신할 수 있게 됩니다.

또한 이렇게 교환한 값을 통해 양 사용자는 일정한 크기의 공유 비밀 데이터(shared secret)를 통신상에서 유출하는 일 없이 교환할 수 있게 됩니다. 기존의 RSA 방식 또한 비밀 데이터를 공유하기 위해 사용하는 안전한 방식이기는 하지만 키 관리 측면에서 사용자의 단말기에서 별개의 RSA 키를 모두 관리해야 한다는 면에서는 문제가 있어 대체 방법으로 DH를 사용하게 되었습니다.

[그림 5] Diffie-Hellman 암호화 다이어그램

DH에는 이산대수와 타원곡선 계산 방법을 이용한 2가지 수학적 기술을 이용한 구현 방법이 있습니다. Letter Sealing에서는 이 중에서 강력한 보안 방식으로 평가 받고 있는 타원곡선 기반의 DH 방식인 ECDH(Elliptic Curve Diffie-Hellman)를 사용하였습니다. 타원 곡선 기반의 DH는 이산대수 방식, 그리고 기존에 사용했던 RSA 방식에 비해 작은 크기의 데이터로 강력한 암호화 강도를 가지기 때문에, ECDH를 사용함으로써 Letter Sealing은 암호화의 강도를 높이고 작은 데이터로 인한 키 관리의 효율성까지 향상되어 두 가지 장점을 모두 얻게 되었습니다.

[그림 6] Letter Sealing 절차

메시지를 봉인하는 데 우리가 기술적으로 사용한 방식은 메시지를 암호화하고 이때 필요한 정보를 특정 사용자에게만 전송하는 방식을 사용했습니다. 이때 메시지를 암호화하는 데 사용한 암호화 알고리즘은 AES-CBC-256이라는 방식으로 현재까지 사용되는 암호화 알고리즘 중에서 가장 강력한 강도를 가진 것으로 평가 받는 것입니다. 그런데 이 암호화를 사용하는 데 중요한 것은 암호화를 하는 대상과 암호화를 푸는 복호화를 하는 대상이 모두 같은 키 데이터를 가져야 하는 것인데, 이때 사용하는 값이 앞에서 설명한 DH 기반의 키 공유 방식입니다.

위와 같은 방법을 통해 서로 협의한 공통의 값, shared secret을 공유한 후에는 메시지 데이터를 암호화합니다. LINE의 경우 앞서 설명한 ECDH 방식을 통해 256Bits(32Bytes)의 공유 값을 생성하고 이를 통해 암호화에 사용할 키 값을 생성합니다. 그리고 암호화된 메시지와 이때 사용한 키 데이터에 대한 정보를 함께 전송합니다. 그러나 메시지를 단순히 암호화하여 전송한다고 해서 문제가 끝나지는 않습니다. 실제 인터넷에서는 중간에서 메시지의 내용을 볼 수 없게 만들거나 변조하는 형태로 전송을 방해하는 공격이 존재합니다.

이러한 형태의 공격을 막기 위해 Letter Sealing에서는 메시지 인증 코드(Message Authentication Code, 이하 MAC)라는 기능을 추가했습니다. 메시지가 전송되기 전에 어떠한 형태인지 암호학적 형태로 요약한 후, 나중에 수신자가 이 MAC 값과 실제 메시지 값을 비교해 차이점이 있을 경우 조작이 발생하였는지를 탐지하는 기능입니다.
Letter Sealing의 경우 HMAC이라는 방식을 통해 이 기능을 구현하였습니다. 이 방식은 해시 함수(hash function)라는 단방향 함수(one-way function)를 통해 메시지에 대한 디지털 서명(digital signature)을 얻은 후 이 서명 값을 다시 암호화하여 전송하는 방식입니다. 이 방식을 활용하면 제 3자가 메시지를 멋대로 조작하는 것을 수신자가 디지털 서명을 통해 감지할 수 있고, MAC은 오직 공유 데이터를 가진 송신자와 수신자만 생성할 수 있기 때문에 중간에 메시지가 조작되지 않았음을 보장할 수 있게 됩니다.

[그림 7] Letter Sealing 전송

위와 같은 기술을 기반으로 Letter Sealing은 기능적으로도 기존의 방식과 차이가 있습니다. 대표적인 차이점은 Letter Sealing은 메시지를 암호화하는 등의 관리를 하는 주체가 서버에서 메시지 송신자(sender)로 바뀌었다는 것입니다. 이는 과거 서버에서 암호화를 처리하기 때문에 생길 수 있는 문제였던 암호화 해제 및 재암호화 과정이 기술적으로 불가능하게 되었고, 따라서 서버에서는 단 한 순간도 메시지의 평문이 유출되지 않습니다. 또한 메시지를 보호하는 데 필요한 것은 앞서 설명한 방식을 이용하여 서버의 관여 없이 송, 수신자 양쪽에만 안전하게 전달된 상태이므로 LINE 서버를 포함한 다른 사용자들에게 메시지 키가 유출되지 않아 메시지의 봉인을 풀 수 없게 됩니다.

따라서 새로운 암호화 방식을 이용할 경우 기존에 발생할 수 있었던 LINE의 서버가 공격을 당하는 경우라도 사용자의 메시지 내용이 유출될 가능성을 기술적으로 차단하는, 더 강력한 메시지 보호 기술을 적용하게 되어 안전하게 메시지를 전달하게 됩니다. 과거에 문서를 전송할 때 봉인을 사용하여 문서를 훔쳐보고 조작하는 것을 막은 것처럼 이 새로운 메시지 보호 방식은 디지털 봉인을 메시지에 씌워 상대방에게 도달할 때까지 메시지를 보호하게 됩니다.

Letter Sealing 사용하기

앞서 보신 Letter Sealing을 포함하여 같이 추가되는 보안 기능들은 일반적인 신규 서비스들과는 달리 한눈에 보기에는 기존의 기능과는 큰 차이가 없어 보일 수도 있습니다. 보이지 않는 영역에 존재하지만1 이 기능의 존재 여부가 보안의 강도에는 큰 영향을 미칩니다. Letter Sealing 기능을 사용하려면 다음과 같이 설정합니다.
LINE 5.3.0 이후 버전을 사용하는 사용자들은 더보기 > 설정 > 대화·통화에서 Letter Sealing 옵션을 볼 수 있습니다. LINE iOS, Android 버전에서 이 옵션을 켜는 것만으로 Letter Sealing 기능을 사용할 수 있습니다.

[그림 8] Letter Sealing 기능 설정

또한, Android 사용자들 중에서 Windows, Metro, Mac, iPad, Chrome용 LINE 버전을 사용한 적이 없는 사용자에 대해서는 9월부터 일부 국가에 대해 Letter Sealing 기능을 ON으로 확대 적용하고 있습니다. Letter Sealing을 옵션에서 설정하였거나, 기본으로 On으로 설정된 Android 사용자라면 1:1로 주고 받는 텍스트 메시지와 위치 정보를 전달할 때 항상 Letter Sealing 기능의 잇점을 누릴 수 있습니다. 다만 이 기능은 대화할 상대방도 On으로 설정해야 사용할 수 있습니다. 따라서 이 기능을 활용하고 싶다면 본인 뿐만이 아닌 대화를 하려는 상대방에게도 이 기능에 대해 알려주시고 사용할 수 있게 해야 합니다.

차후에는 추가적으로 다른 형태의 메시지나 그룹 채팅 등에도 적용될 예정이므로 앞으로도 LINE과 서비스 보안에 많은 관심을 가져주시길 기대합니다.

1: 현재 LINE 버전에서는 얘기 중인 대화창이 Letter Sealing 모드인지를 표시하지 않습니다. 향후 버전에 적절한 표시 방식을 추가하는 것을 고려하고 있습니다.

Related Post