Https

Published: by Creative Commons Licence

Https

1. HTTP란?

HTTP는 웹 환경에서 브라우저와 웹 서버가 통신하는 프로토콜을 이야기 한다. HTTP 동작을 간략하게 살펴보면, 특정 웹사이트의 주소를 입력하고 엔터를 치면 웹 서버로 요청을 보내게 되고 웹 서버는 요청에 대한 페이지를 브라우저에게 응답하게 된다. 이때 요청하고 응답하는 내용은 HTTP 메세지 라고 하는 편지 형태로 주고 받는다.

HTTP의 치명적 단점

HTTP는 웹을 지탱하는 기술이지만 치명적인 단점이 있다. 브라우저와 웹 서버가 통신함에 있어 주고 받는 데이터가 암호화 되지 않고 전송되어진다는 점이다.

평문(암호화 하지 않은) 통신이기 때문에 도청이 가능하다.

통신 상대를 확인하지 않기 때문에 위장이 가능하다.

완전성을 증명할 수 없어 변조가 가능하다.

웹서버와 브라우저가 통신하는 중간 해커가 중간에 메세지를 탈취 할 수 있다. 또한, 아이디와 비밀번호 등 중요한 데이터라면 치명적일 수 있으며, 해커가 중간에서 악의적으로 데이터를 변조시킬수도 있다.

2. 그래서 HTTPS는 뭔데?

암호화 되지 않은 HTTP의 단점을 극복하고자 HTTP에 SSL이라는 기술을 더한 것이다.

HTTPS는 직접 TCP와 통신하지 않고 SSL과 통신을 하게 된다. HTTPS는 공개키와 대칭키 두 가지 방식을 사용하여 장점을 살린다. 키를 교환하는 곳에서는 공개키 암호를 사용하고, 그 후 통신에서 메세지를 교환하는 곳에서는 대칭키 암호를 사용한다.

3. SSL, 인증서, 인증 기관(CA)

SSL(Secure Sockets Layer)은 암호화 통신과 그 암호화 통신에 사용되는 키를 공유할 수 있도록 하는 기술.

인증기관(Certificate Authority)는 암호화 시 사용되는 키를 담은 인증서를 발급하고 관리한다. 따라서 인증기관은 보안상 매우 중요한 역활을 하기 때문에 전 세계적으로 신뢰받는 기관이 운영한다. 웹 서버를 운영하는 웹 사이트는 암호화키를 생성하여 자신이 하나는 보관하고 하나는 인증기관에 넘겨 인증서를 발급받는다.

HTTPS 통신 과정

  1. [Client Hello] : 클라이언트가 브라우저나 다른 TCP 통신을 통해 서버에게 접속한다.

    • 클라이언트는 랜덤한 데이터를 생성하여 서버에게 전달
    • 클라이언트는 SSL 통신을 하기 위해 현재 지원가능한 암호화 방식을 서버에게 전달
  2. [Server Hello] : Client Hello에 대한 응답으로 서버에서 Server Hello를 한다.

    • 서버에서 생성한 랜덤한 데이터를 클라이언트에게 전달
    • 클라이언트가 지원가능한 암호화 방식에 맞춰 현재 서버에서 제공할 수 있는 가장 안전한 암호화 수단 방식을 클라이언트로 전달
    • 서버가 클라이언트에게 인증서 전달
  3. 클라이언트는 서버가 보내준 인증서가 어떤 CA에 의해 발급된 것인지 확인하기 위해 클라이언트에 내장되어있는 CA리스트를 확인한다. CA 리스트에 없는 인증서라면 사용자에게 경고 메세지를 띄운다.

    이때, 인증서가 어떠한 CA에 의해 발급된 것인지 확인하기 위해 클라이언트에 내장된 CA의 공개키를 이용하여 복호화를 한다. 복호화를 정상적으로 했다면, 해당 인증서의 CA의 개인키로 암호화 한 문서임을 암시적으로 보증되었고 인증서를 통해 서버를 믿게 된다.

    클라이언트는 1단계를 통해 받은 서버의 랜덤 데이터와 클라이언트가 생성한 랜덤 데이터를 조합하여 pre master secret이라는 키를 생성한다. 이 키는 공개키 방식을 이용하여 서버로 전송한다.

  4. 서버는 클라이언트가 전송한 pre master secret값을 자신의 비공개키로 복호화를 한다. 이로서 서버와 클라이언트는 모두 pre master secret 값을 공유하게 되었고, 서버와 클라이언트는 일련의 과정을 거쳐 pre master secret 값을 master secret 값으로 만든다. master secret은 session key를 생성하는데, 이 session key를 이용하여 대칭키 방식으로 암호화하여 주고 받는다.

  1. [웹 서버] Public Key를 인증서와 함께 전송한다.
  2. [웹 브라우저] 인증서가 자신이 신용있다고 판단한 CA로부터 서명된 것인지, 유효한 것인지 확인한다.
  3. [웹 브라우저] Public Key를 이용하여 랜덤 대칭 암호화키를 비롯한 URL, HTTP 데이터들을 암호화해서 전송한다.
  4. [웹서버] Private Key를 이용해서 랜덤 대칭 암호화키와 URL, http데이터를 복호화한다.
  5. [웹 서버] 요청받은 URL에 대한 응답을 웹 브라우저로부터 받은 랜덤 대칭 암호화키를 이용하여 암호화해서 브라우저로 전송한다.
  6. 대칭 키를 이용하여 http 데이터와 HTML 문서를 복호화 하고, 화면 정보를 뿌려준다.

제 3자인 인증기관이 암호화 키를 인증서에 담아 관리하는 SSL을 이용하기 때문에 암호화 키를 분배하는 과정에서 탈취 당하지 않을 수 있으며, 분배된 암호화 키를 통해 암호화 통신이 가능하다.


https://dololak.tistory.com/541

https://blog.sonim1.com/99

https://opentutorials.org/course/228/4894

https://aileen93.tistory.com/119

https://swalloow.github.io/https-ssl

https://wayhome25.github.io/cs/2018/03/11/ssl-https/