What is HTTP?
HTTP는 Hyper Text Transfer Protocol의 약자로, 네트워크를 통해 데이터를 전송하기 위해 사용되는 프로토콜이다. 웹 사이트 콘텐츠 또는 API 호출을 포함해서 인터넷을 통해 전송되는 대부분의 정보는 HTTP 프로토콜을 사용한다. HTTP 메시지에는 요청과 응답의 두 가지 주요 유형이 있다.
서로 다른 종단 시스템에서 수행되는 클라이언트 프로그램과 서버 프로그램은 서로 HTTP 메시지를 교환하여 통신한다. HTTP는 메시지의 구조와 더불어 클라이언트와 서버가 메시지를 어떻게 교환해야 하는지에 대해 정의하고 있다.
HTTP의 문제점 & 해결 방법
1. 도청 가능
HTTP 전송은 TCP/IP를 통한 직선 연결인데, 이 연결은 암호화되지 않은 평문 통신이다. 따라서 중요한 데이터를 전송하는 경우 네트워크상에서 도청될 우려가 있다.
👉 통신을 암호화하지 않고 있는 그대로 전송해서 발생하는 문제이기 때문에 통신을 암호화함으로써 해결할 수 있다. 이때 SSL/TLS 프로토콜을 사용할 수 있고 이 프로토콜을 사용한 HTTP 통신을 HTTPS라고 한다. 또한, 통신 자체를 암호화하지 않고 딱 내용만 암호화하는 방법도 있다.
2. 위장 상대
HTTP는 통신하려는 상대의 신원을 확인하지 않는다. 따라서 악의적인 목적을 가진 상대가 요청을 보내는 경우에도 무조건 응답해야 한다.
👉 이 문제 역시 SSL 프로토콜을 사용해서 해결할 수 있다. SSL은 상대를 확인하는 수단으로 증명서를 제공하는데, 이 증명서는 SSL이 만드는 것이 아니라 신뢰할 수 있는 제 3자 기관에서 발행된 것이다. 이 증명서를 이용함으로써 통신 상대가 내가 통신하고자 하는 서버임을 나타내고, 이용자는 개인 정보 누설 등의 위험성이 줄어들게 된다.
3. 변조
HTTP는 송신측에서 보낸 데이터와 수신 측에서 받은 데이터의 일치성을 보장하지 않는다. 내가 전송한 데이터가 누군가에 의해 중간에 변조되더라고 송신 측과 수신 측 모두 서로의 데이터를 대조해보지 않기 때문에 변조되었다는 사실조차 알 수 없다. 이처럼 공격자가 통신 중간에서 요청이나 응답을 뺏어가는 것을 Man In The Middle Attack이라고 부른다.
👉 MD5, SHA-1 등의 해시 값을 확인하는 방법과 파일의 디지털 서명을 확인하는 방법이 존재하지만 확실히 확인할 수 있는 것은 아니다. 변조를 확실히 방지하기에는 HTTPS를 사용해야 한다.
HTTPS(HTTP Secure)
HTTPS의 S는 'secure'를 의미한다. HTTPS는 애플리케이션 계층과 전송 계층 사이에 보안을 제공하는 프로토콜인 SSL(Secure Socket Layer)/TLS(Transport Layer Security)을 사용한 신뢰할 수 있는 HTTP 요청을 말한다. 즉, HTTPS는 일반적인 HTTP 요청 및 응답을 암호화하고 이러한 요청 및 응답에 디지털 서명을 하기 위해 TLS(SSL)를 사용한다. 이를 통해 통신을 암호화하는 것이다.
SSL은 SSL 1.0 -> SSL 2.0 -> SSL 3.0 -> TLS 1.0 -> TLS 1.3까지 버전이 올라가며 마지막으로 TLS로 명칭이 변경되었지만 보통 그냥 이들을 합쳐서 SSL/TLS라고 부른다.
HTTPS의 SSL에서는 공통 키 암호화 방식과 공개키 암호화 방식을 혼합한 하이브리드 암호 시스템을 사용한다. 공통 키를 공개키 암호화 방식으로 교환한 다음에 다음부터의 통신은 공통 키 암호를 사용하는 방식이다.
HTTP 메시지가 아래와 같았다면
GET /hello.txt HTTP/1.1
User-Agent: curl/7.63.0 libcurl/7.63.0 OpenSSL/1.1.l zlib/1.2.11
Host: www.example.com
Accept-Language: en
HTTPS 메시지는 암호화되었기 때문에 텍스트 대신 임의의 문자가 많이 표시된다.
t8Fw6T8UV81pQfyhDkhebbz7+oiwldr1j2gHBB3L3RFTRsQCpaSnSBZ78Vme+DpDVJPvZdZUZHpzbbcqmSW1+3xXGsERHg9YDmpYk0VVDiRvw1H5miNieJeJ/FNUjgH0BmVRWII6+T4MnDwmCMZUI/orxP3HGwYCSIvyzS3MpmmSe4iaWKCOHQ==
HTTP를 사용하는 웹 사이트의 URL에는 http://가 있고 HTTPS를 사용하는 웹 사이트의 URL에는 https://가 있다.
모든 웹 페이지에서 HTTPS를 사용해도 될까?
평문 통신에 비해 암호화 통신은 CPU나 메모리 등 리소스를 더 많이 요구한다. 따라서 통신할 때마다 암호화를 하면 추가적인 리소스를 소비하기 때문에 서버 한 대당 처리할 수 있는 요청의 수가 상대적으로 줄어들게 된다.
하지만 최근에는 하드웨어의 발달로 인해 HTTPS를 사용하더라도 속도 저하가 거의 일어나지 않고, 새로운 표준인 HTTP 2.0을 함께 이용한다면 오히려 HTTPS가 HTTP보다 더 빠르게 동작한다. 따라서 웹은 과거의 민감한 정보를 다룰 때만 HTTPS에 의한 암호화 통신을 사용하는 방식에서 현재 모든 웹 페이지에서 HTTPS를 적용하는 방향으로 바뀌어가고 있다.
References
📖 컴퓨터 네트워킹 하향식 접근
'CS > 네트워크' 카테고리의 다른 글
DNS Round Robin (0) | 2022.10.24 |
---|---|
DNS (0) | 2022.10.24 |
TCP vs UDP (0) | 2022.10.08 |
TCP 3-way handshaking & 4-way handshaking (0) | 2022.10.08 |
HTTP GET vs POST (0) | 2022.10.08 |