HTTP vs HTTPS (feat. 대칭키, 공개키)
CS

HTTP vs HTTPS (feat. 대칭키, 공개키)

1. HTTP란?

1) 개요

HTTP(HyperText Transfer Protocol)는 두 네트워크 장치 간 하이퍼텍스트 전송을 위한 프로토콜이다.

주로 웹 브라우저와 서버가 웹 페이지(HTML) 문서를 주고 받을때 사용된다.

HTML (HyperText Markup Language)
태그를 사용해 하이퍼텍스트로 이루어진 문서 또는 데이터를 구조화한 형식

응용 계층 프로토콜로서 TCP/IP를 사용하며 80번 포트를 사용한다.

전송 과정에서 평문으로된 데이터가 제3자에게 노출될 수 있어 보안에 취약하다.

2) 특징

A. 서버-클라이언트 구조

클라이언트가 요청하면 서버가 응답하는 단방향 통신이다.

서버가 먼저 클라이언트에게 요청 메시지를 보낼 수 없다.

B. 무상태성 (Stateless)

서버는 클라이언트의 상태를 저장하지 않기 때문에 모든 요청을 독립적으로 처리한다.

즉, 이전에 처리한 요청들은 현재 요청에 어떤 영향도 끼치지 않는다.

만약 서버가 클라이언트의 상태를 유지한다면, 서버가 여러대일 때
클라이언트의 요청을 처리하기 위해 모든 서버가 상태를 공유해야하는 비용이 발생한다.

C. 비연결성

서버와 클라이언트는 메시지를 주고 받을때만 연결된다.

즉, 불필요한 연결을 최소화하여 자원 낭비를 최소화할 수 있다.

HTTP 1.1에서 추가된 Keep-Alive 기능을 사용하면 일정 시간 또는 횟수 동안 연결을 유지할 수 있다.

D. 멀티미디어 지원

HTML뿐 아니라 이미지, 텍스트, 동영상, JSON, XML 등 다양한 멀티미디어 형식을 전송할 수 있다.


2. HTTPS란?

1) 개요

HTTPS(HTTP Secure)는 HTTP에 SSL, TLS같은 프로토콜을 사용해 데이터를 암호화하는 프로토콜이다.

또한 인증서를 통해 사용자는 서버를 신뢰할 수 있는지 판단할 수 있다.

SSL(Secure Sockets Layer)은 HTTPS 이전의 프로토콜로서, 보안의 취약점이 있어 잘 사용되지 않는다.
따라서 SSL의 취약점을 개선시키고 보안성이 강화된 TLS(Transport Layer Secure)를 더 많이 사용한다.

2) 대칭키와 공개키(비대칭키) 암호화

HTTPS는 대칭키 및 공개키 암호화를 모두 사용한다.

A. 대칭키 암호화 

클라이언트와 서버가 데이터 암호화/복호화에 동일한(대칭) 키를 사용하는 암호화 방식이다.

암호화/복호화 속도가 빠르지만 키가 탈취당할 경우 보안에 위험이 생길 수 있어서 키 관리가 중요하다.

대표적으로 AES 암호화 알고리즘이 있다.
보통 비밀키는 송신측에서 생성하고 인증서를 이용해 수신측과 공유한다.

B. 공개키(비대칭키) 암호화

대칭키 암호화와 다르게 클라이언트와 서버가 서로 다른 키를 사용하는 암호화 방식이다.

서버 클라이언트 중 한 쪽이 가진 키가 암호화를 하면 다른 쪽이 가진 키는 복호화만 가능하다.

 

암호화/복호화 키는 모두에게 공유되는 공개키와 자신만 가지는 개인키로 나뉜다.

공개키로 암호화하면 나만 데이터를 볼 수 있고, 개인키로 암호화하면 나의 신원을 증명할 수 있다.

 

대칭키 암호화보다 속도는 비교적 느리지만 비밀키를 사용하지 않기 때문에 키 관리가 용이하다.

대표적으로 RSA 암호화 알고리즘이 있다.

3) 연결 과정

HTTPS 전체 연결 과정

  1. 클라이언트(주로 웹 브라우저)가 "https://"로 시작하는 URL을 서버에게 요청한다.
  2. 서버는 공개키와 CA(인증 기관) 정보가 담긴 인증서를 클라이언트에게 전송한다.
  3. 클라이언트는 인증 기관의 공개키로 인증서의 유효성을 검증한다. (서버 신뢰성 확인)
  4. 클라이언트는 서버의 공개키를 사용해 무작위의 세션키를 생성한다.
  5. 세션키를 서버의 공개키로 암호화하여 서버에 전송한다.
  6. 서버는 받은 세션키를 자신의 개인키로 복호화하고, 세션키를 사용해서 연결을 설정한다.
  7. 클라이언트와 서버가 각자의 세션키로 데이터를 암호화/복호화하여 주고 받는다.
이 중에서 클라이언트와 서버의 상호 인증 및 세션키 생성, 교환 과정을 SSL Handshake라고 한다.
위 과정에서 알 수 있듯이, 대칭키와 공개키 암호화 방식을 모두 사용해서 속도와 보안성을 모두 확보했다.

서버와 클라이언트가 동일한 세션키로 데이터를 암호화/복호화하기 때문에 속도가 빠르고,
세션키가 중간에 탈취돼도 세션키의 복호화는 서버만 할 수 있기 때문에 데이터가 유출되지 않는다.

4) 인증서 발급 과정

  1. 서버는 RSA, DSA 등의 공개키 알고리즘으로 공개키 및 개인키를 생성한다.
  2. CA(인증 기관)에 서버 도메인, 조직, 국가, 공개키가 포함된 인증서 발급 요청서(CSR)를 제출한다.
  3. CA는 서버의 정보를 검증하고 서버 정보, 공개키, 서명 알고리즘이 포함된 인증서를 발급해준다.
  4. 서버는 요청에 따라 CA의 개인키로 암호화된 인증서를 클라이언트에게 전송한다.
  5. 클라이언트는 브라우저가 가지고 있는 CA의 공개키로 인증서를 복호화하고 서버의 공개키를 획득한다.

3. HTTP vs HTTPS 정리

  • HTTP
    • 암호화되지 않은 평문 통신 방식
    • 80번 포트 사용
    • 데이터가 제3자에게 노출될 가능성 존재
    • 처리 속도가 빠름
    • 모든 웹사이트에서 사용 가능
  • HTTPS
    • SSL/TLS 프로토콜로 암호화된 통신 방식
    • 443번 포트 사용
    • 데이터를 암호화하기 때문에 보안성 강화
    • 암호화/복호화 처리로 인해 비교적 느린 속도
    • 인증서가 발급된 웹사이트에서만 사용 가능

참고 문서

http의 특징

HTTP와 HTTPS의 개념 및 차이점

'CS' 카테고리의 다른 글

HTTP 버전별 특징 정리  (0) 2023.03.02
HTTP 메시지와 구성 요소  (0) 2023.03.01
TCP vs UDP  (0) 2023.02.26
OSI 7계층에 대하여  (0) 2023.02.24
데드락(Deadlock)에 대하여  (0) 2023.02.22