본문 바로가기

Web | Network

Web - HTTP 그리고 HTTPS (HTTP and HTTPS)

HTTP

HTTP는 HyperText Transfer Protocol의 약자로, 80번 포트를 사용하는, 웹 상에서 정보를 주고 받을 수 있는 통신 규약 (Protocol) 이다. 주로 HTML (HyperText Markup Language) 문서를 주고 받을 때 사용된다. TCP와 UDP를 사용한다.

특징

1. 비연결 (Connectionless) - 클라이언트가 요청을 서버에 보내고 서버가 응답을 클라이언트에 보내면 바로 연결이 끊긴다.

2. 무상태 (Stateless) - 연결을 끊는 순간 클라이언트와 서버의 통신은 끝나며, 상태 정보를 유지하지 않는다.

동작과정

1. 사용자가 웹 브라우저에 URL 주소를 입력한다.

2. DNS 서버에 웹 서버의 호스트 이름을 IP 주소로 변경 요청한다.

3. 웹 서버와 TCP 연결 시도를 한다. (3-way handshake)

4. 클라이언트가 서버에게 요청한다.

 - 이 때, HTTP Request Message = Request Header + 빈 줄 + Request Body 이다.

 - Request Header에는 요청 메소드, 요청 URI, HTTP 프로토콜 버전, 그리고 Header 정보들이 들어간다 (예 - GET /background.png HTTP/1.0).

 - Request Body는 GET, HEAD, DELETE, OPTIONS와 같이 리소스를 가져오는 요청에는 포함되지 않고, 보통 데이터 업데이트 요청과 관련된 내용이 들어간다. (예 - HTML 폼 컨텐츠 등)

5. 서버가 클라이언트에게 데이터 응답을 한다.

 - 이 때, HTTP Response Message = Response Header + 빈 줄 + Response Body이다.

 - Response Header에는 HTTP 프로토콜 버전, 응답 코드, 그리고 응답 메시지가 들어간다. (예 - HTTP/1.1 404 Not Found.)

 - Response Body에는 응답 리소스 데이터가 포함되며, 201, 204 상태 코드는 바디를 미포함한다.

6. 서버 클라이언트 간 연결이 종료된다. (4-way handshake)

7. 웹 브라우저가 웹 문서를 출력한다.

 

HTTPS

HTTPS는 HyperText Transfer Protocol over Secure Socket Layer의 약자로, 443번 포트를 사용한다. HTTP와 기본적으로 같은 프로토콜이지만, 그 위에 Secure Socket Layer (SSL) 이 추가된 것을 볼 수 있다.

 

HTTPS는 통신의 인증과 암호화를 위해 개발되었다. 원어에서 알 수 있듯, 기본적으로 SSL (또는 TLS, Transport Layer Security) 프로토콜 위에서 HTTPS 프로토콜이 동작하게 된다. 보통 HTTP 보다 안전하다고 알려져있다. 그러나 HTTPS라고 하여 무조건적으로 안전한 것은 아니며, 웹 브라우저에서의 구현 정확도와 서버 소프트웨어, 지원하는 암호화 알고리즘에 따라 보안수준이 다르다.

 

보통 금융 정보나 메일 등 중요한 정보를 주고받는 것은 HTTPS를, 아무나 봐도 상관 없는 페이지는 HTTP를 사용한다. 주고 받는 정보에 주민등록번호/비밀번호와 같이 민감한 정보가 포함된 상태에서 네트워크 상에서 중간에 제 3자가 정보를 가로챈다면 보안 상 큰 문제가 발생한다. 따라서, 중간에서 정보를 볼 수 없도록 주고받는 정보를 암호화하는 방법인 HTTPS를 통해 보안을 강화하는 것이다.

SSL

1. 공개키 암호화 방식과, 공개키의 단점을 보완한 2. 대칭키 암호화 방식을 함께 사용한다. 공개키 방식으로 대칭키를 전달하고, 서로 공유된 대칭키를 통해 통신을 하게 된다.

 

이러한 SSL 방식을 적용하기 위해선 인증서를 발급받아서 서버에 적용시켜야 한다. 인증서는 사용자가 접속한 서버가 우리가 의도한 서버가 맞는지 보장해주는 역할을 한다. 이러한 인증서를 발급하는 기관을 CA (Certificate Authority) 라고 부른다. 공인인증기관의 경우, 브라우저는 미리 CA 리스트와 함께 각 CA의 공개키를 알고 있다.

 

TLS (Transport Layer Security) 프로토콜도 있으며, 이는 SSL 프로토콜에서 발전한 것이다.

 

공개키 방식

A키로 암호화를 하면 B키로 복호화할 수 있으며, B키로 암호화를 하면 A키로 복호화를 할 수 있다. 둘 중 하나를 비공개키 (private key) 혹은 개인키라 불리며, 이는 자신만 가지고 있고 공개되지 않는다. 나머지 하나는 공개키 (public key) 라고 불리며, 타인에게 제공한다. 공개키는 유출이 되더라도 비공개키를 모르면 복호화할 수 없기 때문에, 안전하다고 할 수 있다.

대칭키 방식

암호화를 할 때 사용하는 비밀번호를 키 (key) 라고 한다. 대칭키는 동일한 키로 암호화, 복호화가 가능하다. 대칭키는 매번 랜덤으로 생성되기 때문에, 누출되더라도 다음번에 사용할 때에는 다른 키가 사용되기 때문에 안전하다. 또한, 공개키보다 빠르게 통신할 수 있다는 점이 있다.

인증서 발급 과정

  1. 인터넷 사이트는 자신의 정보와 공개키를 인증기관에 제출한다.
  2. 인증기관은 제출된 데이터를 검증절차를 거쳐 개인키로 사이트에서 제출한 정보를 암호화한다. 이후 인증서를 발급한다.
  3. 인증 기관은 웹 브라우저에게 자신의 공개키를 제공한다.

사이트 접속 후 인증 과정

  1. 사용자가 사이트에 접속하면 사이트는 자신의 인증서를 웹 브라우저에 보낸다.
  2. 웹 브라우저는 미리 받았던 인증기관의 공개키로 인증서를 해독하여 검증한다. 그러면 사이트의 정보와 사이트의 공개키를 알 수 있다.
  3. 이렇게 얻은 사이트 공개키로 대칭키를 암호화하여 다시 사이트에 보낸다.
  4. 사이트는 개인키로 암호문을 해독하여 대칭키를 얻게 되고, 이제 웹 브라우저와 사이트는 대칭키로 서로 데이터를 안전하게 주고받을 수 있게 된다.
  5. 이후 세션이 종료되면 대칭키는 폐기된다.

HTTPS의 단점

HTTPS의 장점은 당연히 네트워크 상에서 열람, 수정이 불가능하므로 안전하다는 점이다. 그러나 단점 역시 존재하는데,

 

1. 암호화를 하는 과정이 웹 서버에 부하를 준다.

2. HTTPS는 설치 및 인증서를 유지하는 데 추가 비용이 발생한다.

3. HTTP에 비해 느리다.

4. 인터넷 연결이 끊긴 경우, 재인증 시간이 소요된다. 이는 HTTP의 경우 비연결형으로 인터넷 연결이 끊겼다가 다시 연결되어도 페이지를 계속 볼 수 있는 반면, HTTPS는 소켓 자체에서 인증을 하기 때문에 인터넷 연결이 끊기면 소켓도 끊어져 다시 HTTPS 인증이 필요하기 때문이다.

HTTPS 동작 과정 (공개키/대칭키 하이브리드 방식)

1. 클라이언트가 서버 접속하여 Handshaking 과정에서 서로를 탐색한다.

 - 먼저, Client Hello: 클라이언트가 서버에 1. 클라이언트 측에서 생성한 랜덤 데이터, 2. 클-서 암호화 방식 통일을 위해 클라이언트가 사용할 수 있는 암호화 방식, 그리고 3. 이전에 이미 handshaking 기록이 있다면 자원 절약을 위해 기존 세션을 재활용하기 위한 세션 아이디를 보낸다.

 - Server Hello: Client Hello에 대한 응답으로 1. 서버 측에서 생성한 랜덤 데이터, 2. 서버가 선택한 클라이언트의 암호화 방식, 3. SSL 인증서를 보낸다.

 - Client 인증 확인: 서버로부터 받은 인증서가 CA에 의해 발급되었는지 본인이 갖고 있는 목록에서 확인하고, 목록에 있다면 CA 공개키로 인증서를 복호화한다. 클-서 각각의 랜덤 데이터를 조합하여 pre master secret 값을 생성하고 (데이터 송수신 시 대칭키 암호화에 사용할 키) 그 값을 공개키 방식으로 서버에 전달한다 (이 때, 공개키는 서버로부터 받은 인증서에 포함돼있다). 그 후 일련의 과정을 거쳐 session key를 생성한다.

 - Server 인증 확인: 서버는 비공개키로 복호화하여 pre master secret 값을 취득한다 (대칭키 공유 완료). 이후 일련의 과정을 거쳐 session key를 생성한다.

 - Handshaking이 종료된다.

2. 데이터 전송

 - 서버와 클라이언트는 session key를 활용해 데이터를 암복호화하여 데이터를 송수신한다.

3. 연결 종료 및 session key 폐기 

출처

https://devdy.tistory.com/14

https://github.com/WeareSoft/tech-interview/blob/master/contents/network.md#rest%EC%99%80-restful%EC%9D%98-%EA%B0%9C%EB%85%90

 

'Web | Network' 카테고리의 다른 글

Web - 쿠키와 세션 (Cookie and Session)  (0) 2022.03.26
Network - TCP와 UDP  (0) 2022.03.23
Network - TCP/IP  (0) 2022.03.23
Network - OSI 7 계층 (OSI 7 Layers)  (0) 2022.03.22
Web - CDN (Content Delivery/Distribution Network)  (0) 2022.03.19