[네트워크/Network] http와 https는 뭐가 다른거야?(feat. SSL, TLS)

kindof

·

2021. 9. 6. 20:35

💡 0. 들어가면서

1990년대 초, 우리가 많이 들어본 월드 와이드 웹(WWW)이 등장했습니다. 월드 와이드 웹은 온-디맨드(On-demand) 방식으로 동작하면서, 사용자들이 원할 때 원하는 것을 수신할 수 있도록 해주었죠.

 

웹을 통해 사람들은 어떤 정보에 대해 쉽게 접근할 수 있게 되었고, 모든 사람이 매우 낮은 비용으로 웹에 컨텐츠를 퍼블리시할 수 있게 되었습니다. 또한 웹과 관련된 프로토콜은 유튜브, 웹-기반 이메일, 인스타그램 등 대부분의 모바일 인터넷 애플리케이션을 위한 플랫폼을 제공하게 되었습니다.

 

월드 와이드 웹에 대해서 더 깊게 설명하는 것은 잠시 미뤄두고, 다음의 세 가지 기능으로 월드 와이드 웹을 요약할 수 있을 것 같습니다. 첫 번째 통일된 웹 자원의 위치 지정 방법 예를 들면 URL, 두 번째 웹의 자원 이름에 접근하는 프로토콜(protocol) 예를 들면 HTTP, 세 번째 자원들 사이를 쉽게 항해 할 수 있는 언어 예를 들면 HTML입니다.

 

이번 시간에는 이 세 가지 카테고리 중에서 HTTP에 대해 알아보고 http와 https의 차이점에 대해 한 번 살펴보려고 합니다.

 

 

 

🤔 1. HTTP가 뭡니까?

HTTP(HyperText Transfer Protocol)는 웹의 어플리케이션 계층 프로토콜입니다. OSI 7계층에 대해 포스팅을 썼을 때 다뤘었죠?

 

 

[네트워크/Network] 네트워크의 기본: OSI 계층 구조와 캡슐화

🤔 0. 개요 "OSI 7계층이 무엇인가요?" "컴퓨터 네트워크를 왜 7계층으로 나누나요?" "메시지, 데이터그램, 세그먼트의 차이와 캡슐화는 무엇인가요?" CS를 공부해본 사람이라면 한 번쯤은 OSI 7계층

studyandwrite.tistory.com

 

HTTP는 흔히 클라이언트와 서버 측 프로그램으로 구분할 수 있는데, 서로 다른 종단 시스템에서 수행되는 클라이언트와 서버 프로그램은 서로 HTTP 메시지를 교환하면서 통신을 하게 됩니다.

 

이를 위해 HTTP는 웹 클라이언트가 웹 서버에게 웹 페이지를 어떻게 요청하는지와 서버가 클라이언트로 어떻게 웹 페이지를 전송하는지를 정의하게 되죠. 사용자가 웹 페이지를 요청할 때 브라우저는 페이지 내부의 객체에 대한 HTTP 요청 메시지를 서버에게 보내고, 서버는 요청을 수신하고 객체를 포함하는 HTTP 응답 메시지로 응답합니다(웹 공부를 할 때 많이 들어봤을 기본적인 내용이죠).

 

이 때, HTTP는 TCP를 전송 프로토콜로 사용합니다. HTTP 클라이언트는 먼저 서버에 TCP 연결을 시작하고, 브라우저와 서버 프로세스는 그들의 소켓 인터페이스를 통해 TCP로 접속합니다. TCP는 HTTP에게 신뢰적인 데이터 전송 서비스를 제공하기 때문에 클라이언트 프로세스가 발생시킨 모든 HTTP 요청 메시지가 궁극적으로 서버에 잘 도착하게 해주며, 그 반대의 경우도 마찬가지입니다.

 

 

TCP가 무엇인지나 TCP와 UDP의 비교, 핸드셰이킹 등의 내용은 다른 포스팅에서 또 정리하겠습니다.

지금은 HTTP와 HTTPS의 차이를 살펴보는 시간이니까요..!!

 

 

하지만, 이렇게 우리의 삶을 편리하게 해준 HTTP 프로토콜에는 한 가지 치명적인 약점이 있었습니다. 바로 서버에서부터 브라우저로 전송되는 정보가 암호화되지 않는다는 것입니다. 쉽게 말해서 보안에 취약하다는 것이죠.

 

이러한 보안 상의 문제점을 이유로, 2014년 구글에서는 HTTP를 HTTPS로 바꾸기를 권고하게 됩니다.

 

 

 

 

⭐️ 2. HTTPS의 등장

HTTPS는 하이퍼 텍스트 전송 프로토콜 보안(HyperText Transfer Protocol Secure)의 약자로, HTTPS 프로토콜은 SSL(보안 소켓 계층), TLS(전송 계층 보안)를 사용함으로써 HTTP가 가지고 있던 보안 취약점을 해결하게 됩니다. 그렇다면 SSL과 TLS는 무엇일까요?

 

 

✅ 2-1) 보안 소켓 계층(Secure Sockets Layer, SSL)

SSL은 웹사이트와 브라우저(혹은, 두 서버) 사이에 전송된 데이터를 암호화하여 인터넷 연결을 보안을 유지하는 표준 기술입니다.

 

SSL 인증서

위 그림에서 제가 현재 개발하고 있는 웹 페이지를 서버라고 해보겠습니다. 그러면 제가 만든 서버가 안전한 서버라는 것을 어떻게 다른 사람들에게 알려줄 수 있을까요?

 

이를 위해서는 공인 인증기관(CA)에게 나의 사이트 정보를 보내고, 안전한 사이트인지를 확인받아야 합니다.

 

인증기관(CA)은 제 서버에게 SSL 인증서를 발급해주게 되고, 이 다음부터 클라이언트들이 제가 만든 서버를 방문하면 그들에게 SSL 인증서를 전달합니다. 이 때, 클라이언트들이 이 SSL 인증서가 진짜인지 알기 위해서는 인증기관(CA)에게 SSL 인증서 검증을 요청하고, 검증이 되면 제가 만든 서버를 신뢰하게 되는 것이죠.

 

자, 그런데 이 과정에서 공개키 방식(PKI,Public Key Infrastructure)이라는 개념이 등장하는데요.

 

공개키는 두 개의 키를 갖게 되며, A키로 암호화 하면 B키로 복호화가 가능하며, 반대로 B키로 암호화 하면 A키로 복호화가 가능한 암호화 방식입니다. 여기 두 개의 키 중에서 하나는 공개키(public key)가 되며, 하나는 비공개키(private key)라고 합니다.

 

SSL 인증서를 발급하는 인증기관은 해당 서버에 대한 공개키(Public key)와 비공개키(Private Key)를 생성하고, 서버에는 비공개키로 암호화한 SSL 인증서를 보내줍니다. 그러면 서버가 클라이언트에게 자신이 받은 "비공개키로 암호화된 SSL 인증서"를 보내주면, 클라이언트는 인증기관이 공개한 공개 키를 가지고 SSL 인증서를 복호화하여 서버 인증을 마치게 되는 것입니다.

 

공개키 방식

 

 

2-2) TLS

한편, 최근에(?) HTTPS는 TLS(전송 계층 보안) 프로토콜을 통해서 보안을 유지합니다.

 

TLS는 데이터 무결성을 제공하기 때문에 데이터가 전송 중에 수정되거나 손상되는 것을 방지하고 사용자가 자신이 의도하는 웹사이트와 통신하고 있음을 입증하는 인증 기능을 제공하죠.

 

TLS는 데이터 무결성을 유지하기 위해 메시지 인증 코드(Message Authentication Code, MAC)을 이용합니다. 쉽게 설명하자면 A가 B에게 메시지를 보낼 때 원본 메시지(M)과 해시함수로 암호화한 메시지(hash(M))을 보내고, B는 M을 A와 공유하고 있는 해시함수로 암호화해서 그 값이 A가 보낸 암호화 메시지랑 같은지 확인하는 것입니다. 만약 다르다면 중간에 누군가 메시지 내용을 변조한 것이겠죠?

 

MAC(Message Authentication Code)

 

 

.

.

.

 

 

이것으로 HTTP가 무엇이고 HTTPS는 왜 탄생했는지, 그리고 HTTPS가 보안을 유지하는 방식인 SSL, TLS에 대해 공부해봤습니다. 암호화 방식에 대해 사전지식이 전혀 없으면 약간 어려운 내용일 수 있지만, 천천히 읽어보면서 이해해보면 좋을 것 같습니다.

 

감사합니다.