[F-Lab 모각코 챌린지] 18일차 - HTTP 와 TCP
F-Lab 모각코 챌린지 18일차를 진행하며 정리한 내용입니다 HTTP, HTTPS, 3/4way handshake, Keep-Alive, HTTP2 에 대해 학습 하였으며 해당 내용들을 정리하였습니다
![[F-Lab 모각코 챌린지] 18일차 - HTTP 와 TCP](/content/images/size/w1200/2023/06/-------_--------_-------12.png)
HTTP 특징
- 비연결성(Connectionless)
HTTP 요청 후 응답을 받으면 그 연결은 끊어진다 - 상태없음(Stateless)
서버에 상태를 저장하지 않는 것을 지향한다. 그로 인해 많은 장점이 있다
- 확장성: scale-out 이 용이함
- 결함 격리: 각 요청이 독립적이므로 다른 요청에 영향을 미치지 않음
- 단순성: 상태 저장을 고려하지 않기 때문에 시스템 설계가 단순해짐
- 자원 효율성: 서버가 클라이언트 상태를 저장하지 않으므로 메모리 절약 - 단순함
요청이 단순한 구조를 가지고 있다.
- 요청-응답 모델 구조: 직관적이며 이해하기 쉽다
- 텍스트 기반: 사람이 읽을 수 있기 때문에 디버깅이 쉽다
- 표준 메소드: 메소드로 행위를 나타낼 수 있으며 학습하기 쉽다
- 상태 코드: 상태코드로 응답의 결과를 명확하게 표현할 수 있다
- 자기 설명적(Self-descriptive): 프로토콜 안에 모든 정보를 포함하고 있으며 다른 컨텍스트가 없더라도 쉽게 이해 할 수 있다
- 표준화 - 텍스트 기반
ASCII 코드 기반의 문자로 이루어져 있기 때문에 사람이 읽을 수 있고 디버깅 및 트러블 슈팅이 상대적으로 쉽다 - 상태 코드
- 멀티미디어 지원
HTTPS
특징
- 암호화(Encryption)
HTTPS 는 데이터를 암호화 하여 전송한다
데이터가 전송되는 동안 제 3자에 의해 탈취되더라도 비교적 안전하다 - 데이터 무결성(Data Integrity)
데이터가 변조되지 않고 그대로 전송됨을 보장 - 인증(Authentication)
SSL 인증 메커니즘을 통해 사이트가 안전함이 인증된다
요청 흐름
- 클라이언트가 서버로 연결 시도
- 서버는 자신의 공개 키를 포함하는 인증서를 클라이언트에게 제공
- 서버로부터 받은 인증서를 검증
(Certificate Authority 기관 서명 확인, 유효기간 만료 확인, 도메인 확인) - 인증서에서 서버의 공개 키를 추출
- Pre-master Secret 생성 (Pre-master Secret: 임의의 랜덤값)
- Pre-master Secret 를 서버의 공개키로 암호화 하여 서버에게 전송
- 클라이언트와 서버가 대칭 키를 생성
클라이언트: Pre-master secret 을 사용하여 대칭 키를 생성
서버: 암호화된 Pre-master secret 를 개인키로 복호화 하고 대칭 키를 생성 - 통신
7번에서 만든 대칭 키를 사용하여 데이터를 암호화 하고 복호화 수행
3way handshake
TCP 연결 시 진행되는 연결 프로세스
- SYN 패킷 (클라이언트 -> 서버)
클라이언트가 서버에게 SYN 패킷과 함께
이 패킷에는 클라이언트 초기 시퀀스 데이터를 포함한다 - SYN-ACK 패킷 (서버 -> 클라이언트)
SYN 패킷 수신 후 연결을 수락한다
서버는 자신의 시퀀스 번호를 포함한 SYN 패킷과 클라이언트의 SYN 패킷에 대한 응답으로 ACK 패킷을 함께 클라이언트로 보낸다 - ACK 패킷 (클라이언트 -> 서버)
클라이언트는 서버로부터 SYN-ACK 패킷을 수신한다
서버에게 ACK 패킷을 보내 연결을 완료한다
4way handshake
TCP 연결 해제 시 진행되는 연결 해제 프로세스
아래 설명에서 '초기화하는 측' 은 서버가 될수도 있고 클라이언트가 될 수도 있다.
단, 일반적인 경우에서는 클라이언트 이
- FIN 패킷 (송신 측 -> 수신 측)
연결 종료를 희망하는 쪽에서 FIN 패킷을 송신하여 연결 종료 의사를 표현한다 - ACK 패킷 (수신 측 -> 송신 측)
FIN 패킷을 수신 측에서 ACK(확인) 를 응답한다
이는 '종료 처리중' 이라는 의미를 가진다 - FIN 패킷 (수신 측 -> 송신 측)
수신 측에서 FIN 패킷을 송신 측으로 보내어 연결 종료가 준비되었음을 표현한다 - ACK 패킷 (송신 측 -> 수신 측)
송신측은 FIN 패킷을 수신하고 마지막으로 ACK 패킷을 수신측으로 보내어 연결 종료에 대한 최종 확인을 수행한다
Keep-Alive
HTTP/1.1 이상에서 사용되는 기능
클라이언트와 서버 사이의 연결을 재사용 함으로서 네트워크 효율성을 향상시킨다
- 클라이언트와 서버 사이의 TCP 연결을 재사용한다
HTTP 에서는 기존의 연결을 사용하여 3way handshake 라는 전처리 리소스를 최소화 한다 - HTTPS 에서도 Keep-Alive 기능이 중요하다.
SSL/TLS 를 사용하여 암호화된 연결을 설정한다.
이 과정은 재사용하는 리소스를 감소할 수 있다.
HTTP 헤더에 Connection: keep-alive
를 포함하여 해당 기능을 사용 할 수 있다
HTTP2
웹 성능 향상을 목표로 HTTP/1.1 에서 발전된 프로토콜
특징
- 다중화(Multiplexing)
단일 TCP 연결을 통해 여러 요청과 응답을 동시에 전송 할 수 있다 - 헤더 압축(Header Compression)
HTTP/2 는 헤더를 압축하여 전송한다.
이로 인해 데이터 전송량이 줄고 전송 속도가 향상된다 - 서버 푸시(Server Push)
서버는 클라이언트의 요청에 대한 응답 외에 추가 리소스를 능동적으로 전송할 수 있다.
클라이언트가 요청하지 않아도 필요한 리소스를 미리 받을 수 있다 - 스트림 우선순위(Stream Prioritization)
리소스 전송 우선순위를 지정 할 수 있다.
이를 통해 중요한 리소스를 먼저 전송하고 페이지 로드 시간을 개선할 수 있다 - 암호화(Encryption)
기본적으로 SSL/TLS 를 사용하여 데이터를 암호화 한다
장점
- 성능향상
다중화, 헤더 압축, 서버 푸시 기능들로 페이지 로드 시간이 단축되고 네트워크 효율성 증가 - 보안 강화
기본적으로 암호화를 사용 - 리소스 사용 최적화
단일 TCP 연결로 여러 요청과 응답을 처리.
네트워크 리소스 사용이 최적화된다
단점
- 복잡성
HTTP/1.1 에 비해 더 복잡한 프로토콜. 구현과 디버깅이 어려울 수 있다 - 암호화 오버헤드
기본적으로 암호화를 수행해야 하기 때문에 CPU 사용량 증가 - 호환성
일부 레거시 시스템과 장비에서는 HTTP/2 를 지원하지 않을 수 있다