Post

HTTPS 통신의 동작 원리를 알아보자

현대 사회에 인터넷은 우리 삶의 일부가 되었습니다. 채팅, 메일, 물품구매 등 우리 삶의 대부분의 활동을 인터넷을 통해 이루어 집니다. 저 역시도 앱을 통해 배달을 시키거나, 물건을 주문할 경우가 많습니다. 저의 이러한 요청은 인터넷망을 거쳐 최종 목적지 서버에 도달하게 될것입니다.

인터넷은 누구나 쉽게 접근할 수 있는 공간이라 할 수 있습니다. 그런데 여기서 주복할 점은 ‘누구나’ 접근이 가능하다라는 것입니다. 앞서 내가 요청한 주문정보를 ‘누구나’ 접근하여 확인 할 수 있다는 말이죠. 주문 정보에는 개인정보를 포함하여 내가 어떤 물건을 선택하였는지등의 데이터가 포함되어 있습니다.

인터넷이 어떤 공간이란 사실을 알게되면 나의 개인정보가 누군가에 의해 보여지지는 않을까 라는 걱정을 하는것은 너무나 당연합니다.

하지만 이러한 걱정은 이미 오래전 누군가 한것이고 그에대한 해결책을 어느정도 만들어 두었습니다. 해결책은 간단합니다. 인터넷에 데이터를 올리기전 암호화 시켜버리면 되는 것이죠. 언제나 그러하듯 방법은 쉽게 생각할 수 있지만 그래서 어떻게 그것을 구현하는데? 라고 물으신다면 지금부터 그 ‘어떻게’에대해 말해보도록 하겠습니다.

인증

TLS / SSL 인증서 를 통한 HTTPS 통신

가장 널리 많이 사용되는 방식은 대칭키와, 비대칭키 암호화 방식을 적절히 활용한 SSL(Secure Socket Layer) / TLS(Transport Layer Security) 인증서를 이용하여 전송 데이터를 암호화 하는 것입니다.

이 방식을 사용하기 위해서는 검증된 인증 기관으로부터 인증서를 발급받아야 합니다. 즉 서버와 클라이언트 사이를 검증해줄 제3의 기관이 등장하는 것입니다. 아래의 예시로부터 구체적인 작업 과정을 알아보겠습니다.

https 통신을 통해 데이터를 암호화 하기 위해선 인증서가 필요합니다. SSL / TLS 인증서를 구매하기 위해선 먼저 등록기관(RA)에 인증서 구매 의사를 밝힙니다. 요즘은 대부분 인터넷을 통해 신청이 가능 합니다. RA에서는 당신이 적법한 서비스를 제공하는지 검증을 거친후 인증기관(CA)에 SSL 인증서발급을 요청 합니다.

CA는 X.509 형식의 TLS 인증서를 발급하고 발급한 인증서를 RA를 통해 당신에게 전달 합니다. 당신은 전달받은 인증서를 서버에 설치 합니다. 이로서 클라이언트와 서버 사이에 https 통신을 할 수 있는 준비는 완료 되었습니다.

X.509 형식의 인증서

x509

  • 첫번째 블록에는 사용자 정보가 들어간다. 누가 인증서를 신청했는지 등드의 정보가 포함
  • 암호화를 위한 Public Key, 복호화를 위한 Private Key는 서버에 안전하게 저장된다.
  • 사용자 정보와, Public Key의 Hash결과를 CA Private Key로 암호화한 정보
    • OS에 저장되어 있는 CA의 인증서의 Public key키로 복호화.
    • A - 복호화된 Hash값 획득
    • B - User Info와 Public Key값으로 Hash 연산 진행
    • A 와 B 가 같은지 확인하여 같으면 해커가아닌 서버로부터 전달된 인증서로 신뢰

https 통신이 이루어 지는 과정

그실며다라 실클로이클라언이에서 서버에 어떠한 작업을 수행했을때 이 정보가 어떻게 암호화 되어 동작하는지 알아 보겠습니다. 예를들어 사용자가 어떤 커뮤니티사이트에 회원가입을 한다 가정해 보겠습니다.

  • 클라이언트는 서버에게 SSL 인증서를 요청 합니다.
  • OS에 저장되어 있는 CA의 인증서에서 CA Public key를 추출하고 CA Private key로 암호화된 해시 값을 복호화 합니다. 그리고 인증서에 대한 해시를 계산하고 같은지 비교합니다

    OS에 저장되어있는 CA 인증서란, CA 기관과 OS 회사 간의 협약을 통해 OS에 사전 배포된 CA 인증서 입니다.

  • 2의 검증이 완료되었다는 것은 서버로 부터 전달받은 인증서가 해커가 아닌 정말 서버가 보내준 인증서라는 것이 검증된 것입니다.
  • 클라이언트는 Session key 를 통해 서버로 전달할 데이터를 암호화 합니다. 그리고 인증서의 public key로 Session Key 를 암호화 합니다. 이로서 보내고자 하는데이터, Session Key 둘다 암호화가 완료 되었습니다. 모든 데이터가 암호화 되었음으로 인터넷을 통해 서버에 전달해도 큰 문제가 없을 것입니다.

    Session Key의 핵심은 예측 불가능한 아주 큰 난수를 얻는 것. 브라우저 실행 시 이미 하나 만들어두는 것

  • 클라이언트로부터 데이터를 받게되면 서버에서 가지고 있던 private key로 암호화된 Session Key 값을 복호화 합니다.
  • 그리고 Session Key 를 가지고 사용자가 전달할 데이터를 복호화 합니다.
  • 이로서 복호화 작업이 완료 되었고 안전하게 사용자 데이터가 서버에 전달 되었습니다.

결론

그동안 막연하게 알고있었던 https 통신에 대해 알아 보았습니다. 물론 여기서 설명한것들 말고 더 깊이 공부할 것들이 산더미겠지만 이정도의 지식만으로 개발을 하는데는 크게 문제가 없을 것입니다.

This post is licensed under CC BY 4.0 by the author.