배달하는 비둘기로 설명하는 HTTPS
By Aria on November 1, 2018
암호화(Cryptography)는 이해하기 어려운 주제일 수 있다. 수학적인 증명들로 가득 차있다. 하지만, 당신이 암호화 시스템을 개발하는게 아니라면, 내부에서 무슨 일이 일어나고 있는지 고도의 수준으로 복잡한 것들을 이해할 필요는 없다.
만약 차세대 HTTPS 프로토콜을 만들기 위해 이 글을 열었다면, 비둘기로는 충분하지 않을 것이다. 그런 분이 아니라면, 커피를 끓이고 이 글을 즐겨보자.
Alice, Bob 그리고… 비둘기?
인터넷 상에서 당신이 하는 모든 활동(이 글을 읽거나, Amazon에서 물건을 사거나, 고양이 사진을 업로드 하는 것)은 서버와 메세지를 주고받는 것이라고 할 수 있다.
조금 추상적일 수 있으니, 서버와 주고 받는 메세지들은 비둘기(carrier pigeons) 에 의해 배달된다고 상상해보자. 이게 매우 근거 없어보일 수 있다는 걸 알지만, 훨씬 빠르다는 것을 제외하고는 HTTPS와 같은 방식으로 동작하니 나를 믿어보자.
또한 서버나 클라이언트, 해커에 대해 이야기 하는 대신에, 우리는 Alice, Bob, Mallory에 대해 이야기 할 것이다. 만약 이번이 암호화의 개념을 이해하려는 첫 시도가 아니라면, 아마 이 이름들을 들어보았을 것이다. 왜냐하면 기술적인 글에서 자주 등장하기 때문이다.
최초의, 순진한 소통
Alice가 Bob에게 메세지를 보내려고한다면, 비둘기의 다리에 메세지를 붙여 Bob에게 보낼 것이다. Bob은 메세지를 받고 읽으면 된다. 다 좋다.
그런데 만약 Mallory가 Alice의 비둘기를 중간에 가로채고 메세지를 변경한다면? Bob은 Alice가 보낸 메세지가 배달 중에 변경 되었다는 것을 알 길이 없다.
이게 HTTP가 동작하는 방식이다. 꽤나 무섭지 않은가? 나는 HTTP 상에서 은행 계좌 정보를 보내지 않을 것이고, 당신도 그래야 한다.
비밀 코드
이제 Alice와 Bob이 매우 교활해졌다면 어떻게 될까. 그들은 ‘비밀 코드’를 이용해 메세지를 작성하기로 했다. 그들은 각 알파벳을 3 개씩 이동시킬 것이다. 예를 들면, D -> A, E -> B, F -> G와 같다. 평문인 “secret message”는 “pbzobq jbppxdb”로 암호화 될 것이다.
이제 Mallory가 비둘기를 중간에 가로채더라도, 그녀는 ‘비밀 코드’를 모르기에 메세지 내용을 이해할 수도, 의미 있게 바꿀 수도 없을 것이다. 하지만 Bob은 코드를 역으로 이용해 메세지를 간단히 해독할 수 있다(A -> D, B -> E, C -> F). 암호문 “pbzobq jbppxdb”은 “secret message”로 다시 해독될 것이다.
성공!
당신이 메세지를 암호화 하는 방법, 해독하는 방법 모두를 알고 있기 때문에, 이는 대칭 키 암호화(Symmetric key cryptography)라고 불린다.
위에 작성된 코드는 일반적으로 시저 암호(Caesar cipher) 라고 알려져 있다. 실제로는 더 복잡한 코드를 사용하지만, 기본 개념은 같다.
키를 어떻게 결정할까?
대칭 키 암호화는 무슨 키가 사용되었는지 수신자-송신자 사이에 누구도 알지 못할때, 매우 안전하다. 시저 암호에서의 키는 몇 글자씩 이동(shift)시켰는지에 대한 오프셋이다. 우리 예시에서는 오프셋이 3이지만, 4나 12도 사용할 수 있다.
문제는 여기에 있다. Alice와 Bob이 비둘기를 통해 메세지를 보내기 시작하기 전에 만나지 않았다면, 키를 안전하게 발행할 방법이 없을 것이다. 그들이 메세지 자체에 키를 보낸다면, Mallory가 중간에 메세지를 가로채서 키를 알 수 있게 된다. 이것으로 인해 Mallory가 원하는대로 전처럼 메세지를 읽고 변경할 수 있게 된다.
이것이 Man In the Middle Attack의 전형적인 예시이고, 이것을 피하는 유일한 방법은 암호 시스템을 전부 변경하는 것이다.
상자를 운반하는 비둘기
그래서 Alice와 Bob은 더 나은 시스템을 생각한다. Bob이 Alice에게 메세지를 보내면, Alice는 아래와 같은 절차를 따를 것이다.
- Bob은 어떤 메세지도 없이 Alice에게 비둘기를 보낸다.
- Alice는 키를 가지고 있고, 비둘기에게 열려있는 상자를 매달아 Bob에게 돌려보낸다.
- Bob은 상자에 메세지를 넣고, 상자를 잠가서 Alice에게 보낸다.
- Alice는 상자를 받고, 가지고 있던 키로 열어 메세지를 읽는다.
이렇게 되면, Mallory는 비둘기를 중간에 가로채는 것으로는 메세지를 변경할 수 없다. Mallory는 키를 가지고 있지 않기 때문이다. Alice가 Bob에게 메세지를 보낼 때에도 같은 방식으로 진행된다.
Alice와 Bob가 방금 사용한 방법은 비대칭 키 암호화(Asymmetric key cryptography)로 알려져 있다. 이것이 비대칭(asymmetric)이라고 불리는 이유는, 당신이 메세지를 암호화 시킬 수 있어도(상자를 잠글 수 있어도), 해독 할 수는 없기 때문이다(잠긴 상자를 열 수 없기 때문이다). 기술적인 용어로 이 상자는 공개 키(public key) 로 알려져 있으며, 상자를 열기 위한 키는 개인 키(private key) 라고 알려져 있다.
상자를 어떻게 믿지?
당신이 이 글을 집중하며 읽었다면 우리가 아직도 문제를 가지고 있다는 것을 알아챘을 지도 모르겠다. Bob이 열린 상자를 받았을 때, 그 상자가 Alice가 보냈다는 것과 Mallory가 중간에 자신의 상자로 바꾸지 않았다는 것을 어떻게 확신 할 수 있을까? (Mallory가 중간에 자신의 상자로 바꾸면 Mallory가 가지고 있는 키로 상자를 열 수 있다.)
Alice는 상자에 서명을 하기로 결정한다. Bob은 상자를 받았을 때 서명을 확인해서 Alice가 상자를 보낸 상자임을 알게 된다.
이런 생각을 하는 사람이 있을 수 있겠다. Bob은 Alice의 서명을 처음에 어떻게 구분할 수 있을까? 좋은 질문이다. Alice와 Bob도 이 문제를 가지고 있었다. 그래서 Alice가 서명하는 대신, Ted가 상자에 서명을 할 것이다.
Ted는 누구인가? Ted는 아주 잘 알려지고 신뢰할 수 있는 유명한 사람이다. Ted는 그의 사인을 모두에게 주고, 사람들은 그가 적법한 사람들의 상자에만 사인할 것이라고 믿는다.
Ted는 서명을 요구하는 사람이 Alice라고 확신할 경우에만 Alice의 상자에 서명한다. 그래서 Mallory는 Ted가 대신 서명한 Alice의 상자를 가져가지 못하게 된다. Ted는 그들의 신원을 확인한 후에만 서명을 하기 때문에, (Mallory의 상자에는 Ted의 서명이 없을 것이고) Bob이 상자가 가짜임을 알게될 것이기 때문이다.
기술적인 용어로 Ted는 일반적으로 인증 기관(Certification Authority) 이라고 불리며, 이 글을 읽고있는 브라우저에는 다양한 인증 기관의 서명이 함께 제공된다.
따라서 당신이 어떤 웹사이트에 처음 접속할 때, 당신은 그 사이트의 상자를 신뢰한다. 왜냐면 당신은 Ted를 믿고 Ted는 이 상자가 적법하다고 말하기 때문이다.
상자는 무거워
Alice와 Bob은 이제 소통 하기에 안정적인 시스템을 가지고 있지만, 상자를 배달하는 비둘기들이 메세지만 전달하는 비둘기들보다 느리다는 것을 깨닫는다.
그들은 대칭 암호화 방식의 메세지(Caesar cipher 기억하죠?)를 암호화 하기 위한 키를 선택할 때에만 상자 방식(비대칭 암호화)을 사용하기로 결정한다.
이런 방식으로 그들은 두 세계의 장점들을 얻는다. 비대칭 암호화의 안정성과 대칭 암호화의 효율성 말이다.
실제 상황에서 느린 비둘기는 없지만, 그럼에도 불구하고 비대칭 암호화 방식을 이용한 메세지 암호화는 대칭 키 방식을 이용한 것에 비해 느리다. 그래서 비대칭 암호화 방식은 암호 키들을 교환할 때에만 사용한다.
이제 당신은 HTTPS 가 어떻게 동작하는지 알고, 커피 또한 준비 되어 있을 것이다. 이제 커피를 마시러 가보자.
이 글은 원문(HTPS explained with carrier pigeons)을 번역한 것입니다.