HTTPS

2 분 소요

HTTP의 약점

  • 평문 통신이기 때문에 도청 가능
  • 통신 상대를 확인하지 않기 때문에 위장 가능
  • 완전성을 증명할 수 없기 때문에 변조 가능

평문 통신이기 때문에 도청 가능 - 암호화로 도청을 피한다

  1. 통신 암호화
    1. SSL이나 TLS 같은 다른 프로토콜을 조합함으로써 HTTP의 통신 내용을 암호화 할 수 있다.
    2. SSL 등을 이용해 안전한 통신로를 확립하고 나서 그 통신로를 사용해서 HTTP 통신을 하는 것을 HTTPS 또는 HTTP over SSL이라고 한다.
  2. 컨텐츠 암호화
    1. 통신 자체를 암호화하지는 않고 HTTP 메시지 바디를 암호화 한다.
    2. 그러나 클라이언트와 서버가 컨텐츠의 암호화나 복호화 구조를 가지고 있어야 하므로 평상시 유저가 사용하는 브라우저와 웹 서버에서는 사용하기 어렵다.

통신 상대를 확인하지 않기 때문에 위장 가능 - 상대를 확인하는 증명서

HTTP는 통신 상대를 확인할 수 없지만, SSL로 상대를 확인할 수 있다. SSL은 암호화 뿐만 아니라 상대를 확인 할 수 있도록 증명서를 제공한다. 이 증명서를 이용함으로써, 통신 상대가 내가 통신하고자 하는 서버임을 나타내고 이용자는 개인 정보 누설 등의 위험성이 줄어든다. 클라이언트가 증명서를 가짐으로써 본인 확인을 하고, 웹 사이트 인증에서 이용할 수도 있다.

완전성을 증명할 수 없기 때문에 변조 가능

서버와 클라이언트 사이에 공격자가 리퀘스트나 리스폰스를 빼앗아 변조하는 공격(중간자 공격: Man-in-the-Middle)이 있을 수 있다. HTTP를 사용해서 완전성을 확인하기 위한 방법은 있지만, 확실하면서 편리한 방법은 현재 없다. 자주 사용되고 있는 방법은 MD5나 SHA-1 등의 해시 값을 확인하는 방법과 파일의 디지털 서명을 확인하는 방법이 있다.

그러나 이것도 불완전한 것이, MD5나 SHA-1 해시값들도 적절하게 수정해버린다면 이 또한 변조 가능성이 남아있다. 따라서 HTTPS를 통해 이를 방지해야 한다.

HTTPS

HTTP + 통신의 암호화 + 증명서 + 완전성 보호 = HTTPS (HTTP Secure)

HTTPS

SSL에서는 공개키 암호화 방식을 채용하고 있다. 간단하게 설명하면 암호화에 두 개의 키를 사용한다.

각 유저가 비밀키와 공개키를 하나씩 가지고 있고, 송신하는 측은 수신하는 측의 공개키를 사용해서 암호화 하고 보낸다. 그러면 수신측에서는 자신의 비밀키를 사용해서 복호화 한다.

이 경우엔 비밀키를 통신에 보낼 필요 자체가 없기 때문에 비밀키 노출을 걱정할 필요가 없다. - 공개키를 이용해 암호화 한 것을 복호화 하는 것은 소인수 분해 문제의 해결 방법을 알아내는 것

HTTPS는 공통키 암호와 공개키 암호의 양쪽 성질을 가진 하이브리드 암호 시스템이다. (공개키 암호는 공통키 암호보다 처리가 느리기 때문에..)

그래서 공통키 암호로 사용하는 키를 공개키 암호를 사용해서 안전하게 교환하고, 그 이후 통신에서는 공통키 암호로 통신을 한다.

그러나 공통키가 중간에 바꿔치기 당했는지는 어떻게 증명 할까? -> 이를 위해서 인증 기관(CA: Certificate Authority)과 공개키 증명서가 이용되고 있다. 유명한 인증기관에는 VeriSign이 있다.

인증 기관은 다음과 같이 이용된다.

  1. 서버의 운영자가 인증 기관에 공개키를 제출
  2. 인증 기관은 제출된 공개키에 디지털 서명을 하고 서명이 끝난 공개키를 만든다.
  3. 공개키 인증서에 서명이 끝난 공개키를 담는다.
  4. 서버는 이 공개키 인증서를 클라이언트에 보내고 공개키 암호로 통신을 한다.
  5. 공개키 인증서를 받은 클라이언트는 증명 기관의 공개키를 사용해서 서버의 공개키를 인증한 것이 CA라는 것과 서버의 공개키가 신뢰할 수 있다는 것을 알 수 있다.

SSL은 느리다

  1. 통신속도가 떨어진다.
  2. CPU나 메모리 등의 리소스를 다량으로 소비함으로써 처리가 느려진다.

HTTP를 사용하는 경우에 비해 2배에서 100배 정도 느려질 수 있다. 또 SSL은 반드시 암호화 처리를 하고 있기 때문에 서버나 클라이언트에서 암호화나 복호화를 위한 계산을 할 필요가 있다. 따라서 서버나 클라이언트의 리소스를 소비하게 되어 HTTP에 비해 부담이 커진다…

태그:

카테고리:

업데이트:

댓글남기기