HTTP vs HTTPS: 무엇이 다른가?
HTTPS는 암호화된 HTTP다. 두 프로토콜의 유일한 차이는 HTTPS는 일반 HTTP Request와 Response를 암호화 하기 위해 *TLS(SSL)를 사용한다는 것에 있다.
결과적으로 HTTPS는 HTTP보다 훨씬 더 안전하다. HTTP를 사용하는 웹사이트는 Url이 http://로 시작하는 반면, HTTPS를 사용하는 웹사이트는 https://로 시작한다.
그럼 HTTP란 무엇일까?
HTTP는 Hypertext Transfer Protocol의 약자이며 *프로토콜의 일종이다.
네트워크 상에서 데이터를 주고 받는데 쓰인다.
웹사이트의 내용이나 *API call을 포함한 인터넷 상에서 주고 받는 거의 모든 정보는 HTTP 프로토콜을 사용한다.
HTTP에는 두가지의 대표적인 메세지가 있고 그것은 바로 Request와 Response다.
*OSI model에서 HTTP는 Layer 7의 프로토콜이다.
평범한 HTTP는 어떻게 생겼을까?
HTTP request는 HTTP 프로토콜을 따르는 여러줄의 텍스트일 뿐이다.
GET request의 경우 아래와 같은 모양새일 수 있다.
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
사용자의 브라우저가 생성한 해당 부분은 인터넷을 통해 전송 된다.
하지만 문제는 해당 연결을 모니터링하고 있는 모든 이가 읽을 수 있는 평문 그대로 전송된다는 점이다.
이 문제는 특히 사용자들이 웹사이트를 통해 민감한 데이터를 전송할 때 큰 문제가 된다.
비밀번호나 카드 번호, 혹은 form에 입력된 여타 다른 정보들이 그 예가 될 수 있고 HTTP에서는 이러한 정보들이 누구나 읽을 수 있게 원문으로 전송 된다.
서버측에서는 HTTP request를 수신 시 HTTP response를 클라이언트 측에 전송하며 아래와 비슷하다.
HTTP/1.1 200 OK
Date: Wed, 30 Jan 2019 12:14:39 GMT
Server: Apache
Last-Modified: Mon, 28 Jan 2019 11:17:01 GMT
Accept-Ranges: bytes
Content-Length: 12
Vary: Accept-Encoding
Content-Type: text/plain
Hello World!
웹사이트가 HTTPS 대신 HTTP를 사용한다면 모든 Request와 Response는 해당 Session을 모니터링하고 있는 사람이라면 쉽게 읽을 수 있어 악의를 가진 이용자가 누군가가 어떤 정보를 요청하고 주고 받는지 정확히 알 수 있다.
HTTPS는 무엇일까?
HTTPS의 S는 Secure(안전한)의 앞글자이다. HTTPS는 HTTP request와 reponse를 암호화 하기 위해 TLS(SSL)을 사용하므로 위의 예시처럼 악의적인 사용자가 보게되는 것은 일반적인 텍스트가 아닌 무작위적으로 보이는 무수히 많은 글자들이다.
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
이런 텍스트 대신
t8Fw6T8UV81pQfyhDkhebbz7+oiwldr1j2gHBB3L3RFTRsQCpaSnSBZ78Vme+DpDVJPvZdZUZHpzbbcqmSW1+3xXGsERHg9YDmpYk0VVDiRvw1H5miNieJeJ/FNUjgH0BmVRWII6+T4MnDwmCMZUI/orxP3HGwYCSIvyzS3MpmmSe4iaWKCOHQ==
이런 것을 보게 될 것이다.
HTTPS에서 TLS/SSL은 어떻게 HTTP request와 response를 암호화할까?
TLS는 public key encryption이다. 공개 키 암호화 기법이라고도 불리는데 2개의 키(public key 공개 키, private key 비밀 키) 중 public key는 서버의 SSL 인증서를 통해 클라이언트 측 디바이스와 공유 된다.
클라이언트 측에서 서버 측과의 연결을 열 때 양 측은 공개 키와 비밀 키를 사용하여 세션 키라는 새로운 키를 만들어서 앞으로 주고 받을 통신을 암호화 하는데 사용한다.
ㅇ모든 HTTP request와 response는 세션 키로 암호화 되며 통신을 가로채는 그 누구도 원문이 아닌 무작위의 문자들을 보게 된다.
HTTPS는 어떻게 웹 서버들을 인증하는데 사용될까?
인증(Authentication)은 사람이나 장치의 정체를 입증하는 것을 말한다.
HTTP에서는 이 인증 절차가 없다. HTTP가 구조적으로 모든 웹 서버들을 신뢰한다고 볼 순 없다.
그저 당시에는 보안보다 더 우선적인 것들이 있었던 것 뿐이다.
하지만 현대 인터넷에서는 인증은 필수적이다.
주민등록증이 사람의 신분을 확인해줄 수 있는 것처럼 비밀 키가 서버의 신분을 확인해줄 수 있다.
클라이언트가 서버와 채널을 열 때(사용자가 웹사이트에 접속할 때) 해당 서버가 해당 웹사이트의 SSL 인증서의 공개 키와 매치되는 비밀 키를 갖고 있는 것이 해당 서버가 해당 웹사이트의 진짜 호스트라는 것을 입증한다.
이것은 인증 절차가 없을 경우 발생할 수 있는 많은 공격들을 방지한다.
TLS(SSL): 인터넷 상에서 주고받는 데이터를 암호화 하는 프로토콜(TLS는 SSL의 후속 프로토콜)
(참고)https://www.internetsociety.org/deploy360/tls/basics/
*프로토콜(Protocol): 정보를 주고 받기 위한 규칙 혹은 절차
(참고)https://www.britannica.com/technology/protocol-computer-science
*API Call: 클라이언트 어플리케이션에서 API에 Request를 제출하는 것
(참고)https://blog.hubspot.com/website/api-calls
*OSI model: 네트워크 시스템의 기능들을 설명하기 위한 개념적 모델임(Layer 7은 최상위 계층인 Application 계층)
(참고)https://www.forcepoint.com/cyber-edu/osi-model
(해당 포스트는 원문https://www.cloudflare.com/ko-kr/learning/ssl/why-is-http-not-secure/를 번역하여 작성 되었습니다.)
'IT 지식' 카테고리의 다른 글
| 경쟁상태(Race Condition)에 대해 (0) | 2021.12.16 |
|---|---|
| 데이터베이스 정규화(Normalization)란? (0) | 2021.12.16 |
| 프로세스(Process)와 스레드(Thread)의 차이 (0) | 2021.12.13 |