HTTPS 통신과정 쉽게 이해하기 #2(Key가 있어야 문을 열 수 있다)
HTTPS 통신과정 쉽게 이해하기 #1(HTTPS의 개요)에서 'SSL 인증서'를 이용하여 웹브라우저와 서버가 서로를 신뢰하고 통신을 한다고 설명했습니다. 이제 조금 더 깊게 들어가 어떻게 SSL 인증서를 생성하는지, 웹브라우저는 이 SSL 인증서가 어떻게 진짜임을 알게 되는지, 웹브라우저와 서버는 데이터를 어떻게 암호화하는지에 대해 알아보고자 합니다.
들어가기에 앞서 암호화, 복호화, 공개키, 개인키 등에 대한 개념을 확실히 잡고 넘어가야 합니다. 이 개념들이 확실히 잡히지 않으면 이해가 되지 않고 더욱 어렵게 느껴질 거라고 생각합니다.
암호화
데이터를 알아볼 수 없는 모습으로 변경하여 감추는 것을 암호화라고 합니다. HTTPS에서는 후술할 'Key'들을 이용하여 데이터를 암호화합니다.
복호화
암호화된 데이터를 해독이 가능한 평문 데이터로 되돌리는 것을 복호화라고 합니다. HTTPS에서는 후술할 'Key'들을 이용하여 데이터를 복호화합니다.
Key
열쇠가 없으면 문을 열 수 없습니다. HTTPS에서는 'Key'가 없으면 데이터를 암호화할 수도 없고, 암호화된 데이터를 다시 풀어서 보는 작업인 복호화도 할 수 없습니다. 그만큼 'Key'의 존재는 중요합니다. 그리고 Key에는 여러 종류가 있습니다.
공개키
Public Key, 직역하면 공개 가능한 키입니다. 암호화 과정에 참여하는 웹브라우저, 서버 같은 'Key 발행자'뿐만 아니라 해커 등도 알아도 상관없는 존재입니다. 개인키와 쌍을 이루어 존재합니다. 보통 데이터를 암호화하는데 사용합니다. 그렇다고 해서 복호화에 사용할 수 없다는 뜻은 결코 아닙니다. 개인키로 암호화된 데이터는 공개키로 복호화할 수 있습니다.
개인키
Private Key, 직역하면 사적인 열쇠이므로 오로지 'Key 발행자'만이 갖는 키입니다. 개인 정보를 남에게 넘겨줄 수 없듯이 말이죠. 공개키와 쌍을 이루어 존재합니다. 보통 데이터를 복호화하는데 사용합니다. 그렇다고 해서 암호화에 사용할 수 없다는 뜻은 결코 아닙니다. 개인키로 데이터를 암호화할 수 있습니다.
대칭키
위의 공개키/개인키처럼 암호화/복호화에 각기 다른 키를 사용하는 것이 아닌, '대칭키'는 암호화/복호화에 동일한 하나의 키를 사용합니다. 보통 실제 데이터를 암호화/복호화하는 데 사용합니다.
HTTPS 통신과정 쉽게 이해하기 #1(우리는 구글에 어떻게 들어가는가)에서 보았던 그림을 다시 불러왔습니다! 위 그림에 'Key'를 더하여 웹브라우저와 서버가 어떻게 SSL 인증서를 검증하고 데이터를 암호화/복호화하는지 살펴보겠습니다.
1. 서버 : 한 쌍의 서버의 공개키와 개인키를 생성합니다. 그리고 서버 내 사이트의 각종 정보와 함께 자신(서버)의 공개키를 인증기관에 전달하여 SSL 인증서 생성을 요청합니다.
2. 인증기관(CA) : SSL 인증서를 발급합니다. 이 인증서에는 서버의 도메인을 비롯하여 서버임을 인증하는 각종 정보를 담고 있습니다. 이때 인증기관은 자신만의 한 쌍의 '공개키'와 '개인키'를 생성하고, SSL 인증서를 인증기관의 '개인키'로 암호화하여 서버에게 전달하고, 서버는 이 SSL 인증서를 게시합니다.
3. 웹브라우저 : 인증기관의 '개인키'로 암호화된 SSL 인증서를 서버로부터 전달받았습니다. 이 SSL 인증서가 진짜인지 검증해보고 싶습니다.
4~5. 웹브라우저 : 인증기관에서 공개하고 있는 인증기관의 '공개키'를 가져와 이 SSL 인증서를 복호화해봅니다. 만약 복호화되어 서버의 정보를 확인할 수 있다면, 이 SSL 인증서는 진짜입니다. 이 인증서를 보유한 서버가 진짜임을 밝힘과 동시에 발급한 대상이 인증기관임을 알 수 있습니다. 그리고 웹브라우저는 서버의 공개키를 확보했습니다.
6. 웹브라우저, 서버 : 웹브라우저가 서버를 신뢰하고 있습니다. 방금 전달받은 서버의 공개키로 실제 데이터 암호화에 사용할 비밀키를 암호화하여 서버에게 전송합니다.
7. 서버 : 서버는 웹브라우저가 자신(서버)의 공개키로 암호화하여 전달한 비밀키(대칭키)를 자신의 개인키로 복호화합니다. 이로써 웹브라우저와 서버는 동일한 비밀키(대칭키)를 보유하게 되었습니다.
이제 웹브라우저와 서버는 동일한 비밀키를 갖고 있으므로 데이터를 암호화/복호화하는 데 사용할 것입니다. 그 비밀키는 웹브라우저와 서버만이 알 테니 데이터가 유출될 일이 없겠죠? 비밀키를 탈취당할 일만 없다면 말입니다. 구글링 해보니 이를 만화로 쉽게 설명하신 '미닉스 김인성 님' 만화가 있어 가져와 보았습니다.
다음 글에서는 좀더 깊이 들어가서 위의 과정을 SSL Handshake에 접목시켜 설명해보겠습니다. 감사합니다.