CS/네트워크

HTTP/HTTPS

녱녱 2022. 11. 14.

정리정리정리

공부하며 정리한 내용입니다! 혹시 오류 사항이 있다면 둥글게 말씀해주세요 :)

1. HTTP(Hypertext Transfer Protocol)

web 상에서 클라이언트와 서버 간 통신을 위한 프로토콜

구글링해서 데려온 이미지

HTTP는 위의 그림에서도 알 수 있듯이 Application layer에서 작동하는 프로토콜이며,

이론상 신뢰성 있는 연결만 해줄 수 있다면 Tranport layer는 어떤 것을 사용해도 상관없다

그렇다면, Transport layer에서 사용하는 TCP/UDP 프로토콜에 대해 간단히 알아보자

 

TCP
(신뢰성은 확보, 지연은 줄이기 힘듦)
UDP
(데이터 전송에 집중한 설계)
연결형
연결방식
비연결형
가상 회선 방식
패킷 교환
데이터그램 방식
O
전송 순서 보장
X
높음
신뢰성
낮음
느림
전송 속도
빠름

즉, TCP는 신뢰성을 확보하지만 필연적으로 지연을 줄이기 힘든 구조이며,

UDP는 데이터 전송에 집중한 설계로 별도의 기능을 지원하지 않는다.

때문에, UDP는 원하는 기능의 구현이 가능하다

이제 HTTP의 버전별 특징을 알아보도록 하자

HTTP/1.0_TCP 기반

1번 request에 대한 response가 와야 2번 request를 보내는 방식이다.

connection 하나 당 한 개의 request/response만 처리 가능하다.

-> 당연히 성능이 저하되고 서버 부하 비용은 증가한다.

HTTP/1.1_TCP 기반

Persistnet connection이라는 개념을 도입했다.

-> 일정 timeout동안 커넥션을 닫지 않는 방식

+ pipelining 도입 : 하나의 connection에서 응답을 기다리지 않고 순차적인 request를 연속적으로 보내

그 순서에 맞춰 응답을 받는 방식으로 지연 시간을 줄인 방식

- Head of blocking : 첫번째 request를 서버에서 처리하는 시간이 너무 오래 걸리면 2, 3번째 request도

기다려야함

- 연속된 요청의 경우 header의 값이 같은 경우가 많음에도 불구하고, 중복된 내용을 그대로 전송함 -> 주고

받는 데이터의 양이 커짐

HTTP/2_TCP 기반

HTTP/1.1의 성능향상에 초점, 표준의 대체가 아닌 확장적 개념

HTTP 메시지 전송 방식의 변화 -> binary framing 계층 사용

+ 파싱/전송 속도가 향상 되고 오류 발생의 가능성이 낮아짐

스트림 안에 프레임들이 들어가 합쳐져서 request/response 메시지가 됨 -> 다중화가 가능해짐

+ 메시지가 프레임으로 쪼개짐 -> msg의 순서가 사라짐 -> head of blocking 문제가 사라짐

+ stream prioitization : 리소스간 우선 순위 설정이 가능

+ server push : client가 요청하지 않은 리소스를 서버에서 알아서 push 해서 보내줌

ex) html request가 왔으니 js랑 css request도 오겠지? 그냥 미리 줘버리자!라고 서버에서 판단

+ Header compression : 헤더의 크기를 줄여 페이지 로드 시간 감소

-> static dynamic table 개념 도입 : 중복을 검출해 중복된 부분은 인덱스만 뽑고 중복되지 않은 데이터는

허프만 인코딩으로 인코딩을 해서 압축

HTTP/3(QUIC)_UDP 기반

+ 전송속도 향상 : 첫 연결 설정에서 필요한 정보와 함께 데이터 전송

-> 연결 성공 시 설정을 캐싱해 다음 연결 때 바로 성립 가능

+ connection UUID라는 고유 식별자로 서버와 연결 : connection 재수립이 필요 X

+ TLS 기본 적용, IP spoffing/Replay Attack 방지 : 보안성 향상

+ 독립 stream -> 향상된 멀티 stream

하지만, HTTP는 암호화 되지 않음 -> 서버와 클라이언트가 주고 받는 msg 감청이 매우 쉽다

때문에 HTTPS 가 등장하게 되었다

2. HTTPS_HTTP over Secure socket layer

HTTPS에서 마지막 S는 Secure socket layer의 약자로, 보안이 강화된 HTTP를 의미한다

그렇다면 HTTPS와 SSL은 무슨 관계일까?

같다면 같고 다르다고 생각하면 다르다고 볼 수 있다.

SSL위에서 HTTPS가 동작하기 떄문이다.

쉽게 말해서 SSL이라는 보안 체계 위에서 동작하는 HTTP라 생각 하면 된다.

(이 SSL 위에서 HTTP가 동작하면 HTTPS, FTP가 동작하면 SFTP가 된다)

그렇다면 어떠한 원리로 정보를 더 안전하게 주고 받을 수 있을까?

여기서 바로 public key cryptography 개념이 등장한다.

암호화를 위해선 public-private key 쌍이 필요한데 어떻게 안전하게 공유할 수 있을까? 라는 생각에서 출발하게 되는 것!

클라이언트와 서버의 신뢰성 있는 connection을 위해 사용된다(handshake)

  1. 클라이언트가 서버에게 무작위 데이터를 보낸다
  2. 서버도 무작위 데이터를 생성해 인증서와 함께 클라이언트에게 보낸다
  3. 무작위 데이터와 인증서를 받은 클라이언트는 받은 인증서가 진짜인지 브라우저에 내장된 CA로 확인
  4. CA의 인증을 받은 인증서들은 해당 CA의 개인키로 암호화 되어있다/CA 리스트에 해당하는게 없다면 브라우저에 not secure가 뜸
  5. 성공적으로 인증이 된다면 서버의 public key를 알 수 있다
  6. 서버의 public key로 받은 데이터를 복호화 했을 때, 클라이언트가 보낸 무작위 데이터와 동일하다면

클라이언트와 서버는 신뢰성 있는 연결을 맺게 되는 것이다(안전한 키교환에 성공한다)

이 후, asymmetric/symmetric 방식이 혼용된다

모든 데이터에 asymemtric한 방식을 사용한다면, 컴퓨터에 무리가 가기 떄문이다.

때문에 symmetiric key를 공유할때 asymmetirc한 방식을 사용하고

handshake 시 사용한 무작위 데이터를 혼합해 임시 키를 만든다.

임시키는 서버의 public key로 암호화 돼 서버로 보내진 다음 동일한 대칭키가 만들어 지게 된다

이 과정이 지나면 asymmetric key를 서버/클라이언트만 가지고 있기 때문에

안전하게 데이터 교환이 가능하다

또한 이 키교환 과정에 Diffie-Hellman 방식이 많이 사용되는 추세이다.

* Diffie-Hellman (암호화 목적X, just key exchange algorithm)

- 이산 수학 문제에서 기인

- g, p 그리고 gk mod p가 주어졌을 때,

- k를 찾아 내는 문제

- 공격자에게 모든 정보를 알려줘도 k를 찾기 위해선 brute force attack 뿐


 

https://developer.mozilla.org/en-US/docs/Web/HTTP

https://developer.mozilla.org/ko/docs/Web/HTTP

https://www.youtube.com/watch?v=H6lpFRpyl14&feature=share&si=ELPmzJkDCLju2KnD5oyZMQ

MDN이야 뭐 워낙 교과서 느낌이니까 잘 봤구

일단 원문 다큐먼트 읽고 이해 안되면 번역 보는게 좀 더 매끄러운 것 같다

유튜브 이 분은 암호화 방식도 되게 이해하기 쉽게 설명해주셔서 편하게 봤다!

나는 보안 강의 시간에 머리 싸매면서 이해했는데

역시 세상이 발전하면서 떠먹여주시는 고마운 분들이 늘었다

 

댓글