-
[TIL] 스파르타) CS 강의 수강 (TCP/IP, HTTP, HTTPS)TIL-sparta 2024. 5. 10. 16:51
> CS 강의를 수강하고, 내용을 이해한대로 정리해보았다. 내배캠 시작 이전에 개인적으로 진행하던 웹 서버 프로젝트에서 시도했다가 잘 몰라서 넘어갔던 HTTPS 서버의 동작이나 구현에 대한 부분들이 나와서 개념을 이해하는데 도움이 많이 되었다.
학습 키워드: TCP/IP, handshake, UDP, HTTP, HTTPS, SSL, TLS
1. TCP/IP, UDP
1) What is it?:
- Packet: Header, payload, trailer(footer)의 구조로 이루어져 네트워크 계층(L3)에서 주고받는 정보 단위로, header에는 패킷의 길이나 IP주소, 프로토콜 등 패킷의 정보가 담겨있고, payload는 패킷의 본문, trailer는 패킷의 끝을 수신자에게 알리는 bit 정보가 담겨있다.
- IP (Internet Protocol): L3에서 동작하며, 패킷의 효율적인 전달을 위한 프로토콜. 패킷 전달 여부 및 순서를 보장하지 않는다.
- Port: 데이터가 목적지에 도달했을 때 어느 프로세스가 이 데이터를 받게 될 것인지를 알게 해준다. 0 부터 65535 까지의 번호가 존재하며, 앞 부분은 well-known ports라고 하여 대부분 용도가 정해져있다.
- DNS (Domain Name System): IP 주소를 알아보기 쉽게 문자로 표현하는 시스템이다. 인터넷 네트워크에서는 보통 ISP의 DNS 서버가 도메인 이름과 대칭되는 IP를 찾아서 변환해준다.
- TCP (Transmission Control Protocol): L4에서 동작하며, 패킷 전달이 reliable하고 error-less하게 이루어졌는지 및 전달되는 순서까지 보장한다. 송신측과 수신측의 데이터 처리 속도 차이를 극복하기 위한 '흐름 제어 (flow control)'와, 송신측과 네트워크 사이의 처리 속도를 조율하는 '혼잡 제어 (congestion control)' 역할도 한다.
- UDP (User Datagram Protocol): 마찬가지로 L4에서 동작한다. 규칙을 간소화하여 신뢰성(reliability)을 보장하지 않지만, 그 만큼 속도가 빠르다.
2) How does it work?:
- TCP/IP는 OSI model의 3, 4 layer에 해당하는 중간 구간에서 규칙으로만 동작한다.
- 동작을 이해하기 위해서는 handshake라는 개념을 알아야한다. TCP/IP의 송 수신자 간에 연결이 이루어질 때 벌어지는 일을 직관적으로 이해할 수 있도록 악수에 빗대어 표현한 것이다.
- 3-way handshake: 서버에 연결의 시작을 알리는 SYN, 수신 성공을 클라이언트에 알리는 SYN-ACK, 연결이 성립되었음을 최종적으로 서버에 알려주는 ACK의 세 단계로 구성되어있다. SYN은 Synchronize, ACK은 acknowlege의 앞 글자이며 각각이 패킷의 형태로 전달된다.
- 4-way handshake: TCP연결의 종료에 사용되는 handshake다. 한 쪽이 TCP 연결의 종료를 알리는 FIN 패킷을 보내고, 다른 한쪽이 종료를 확인한 ACK과 FIN 패킷을 돌려주면, 마지막으로 ACK 패킷을 보내주는 형식이다. 중간의 ACK과 FIN을 합쳐서 보내는 식으로 3-way로 구성할 수도 있다고 한다.
3) TCP vs UDP:
- UDP는 서버에서의 일방적인 정보 전달만 이루어지는 구조다. TCP에서는 연결의 신뢰성이 중요했다면, UDP는 데이터의 전송 자체에 초점이 맞추어져있다. 따라서 전송한 데이터가 일부 손실되더라도 그 사실을 확인할 방법이 없다. Header에 전송 기능만 추가되어있어 원하는 기능을 자유롭게 추가하여 사용한다. 대표적인 예시로는 HTTP/3과 그 기반이 되는 기술인 QUIC이 있다.
2. HTTP, HTTPS
1) What is it?:
- HTTP는 Hypertext Transfer Protocol의 약자로, hypertext를 전송하는 규약 (protocol)을 의미한다. 여기서 hypertext란, 디스플레이에 표시되는 텍스트나 이미지 등을 포괄적으로 의미하며, 이 hypertext가 담긴 문서(documnent)는 서로 간에 마우스 클릭이나 화면 터치 등으로 동작하는 hyperlink로 연결되어있다.
- HTTPS의 S는 secure의 약자다. 보안이 취약한 HTTP 대신 암호화를 통한 안전한 연결을 제공한다.
2) How does it work?:
- HTTP는 클라이언트의 Request와 그 요청을 처리하는 서버의 Response로 구성되며, request에는 5가지의 주요 method (GET: 조회, POST: 생성, PUT: 대체 및 생성, PATCH: 일부 변경, DELETE: 삭제)가 존재한다.
- 클라이언트의 요청이 없으면 서버가 응답을 먼저 보낼 수 없는 단방향의 구조다.
- 요청 후 연결하고, 서버의 응답과 함께 연결이 종료되기 때문에 'connectionless' 하다 라고 표현한다(비연결성).
- HTTP에도 버전이 있다. 전 세계적으로 가장 많이 사용되는건 HTTP/1 이며, 네이버, 인스타그램, 페이스북 등에서 사용하는 HTTP/2, 구글에서 사용하는 HTTP/3 도 존재한다. 크롬의 개발자 도구에서 Network 탭의 column에 protocol을 추가하면 나타나는 h2나 h3가 HTTP의 버전을 의미한다. 1과 2는 TCP, 3은 UDP 기반이다.
- HTTP에는 request의 처리 결과를 숫자로 알려주는 status code (status code 목록) 가 있는데, 가장 유명한 404 not found 처럼 상황에 맞게 돌려주는 번호들이 존재한다. 단순한 약속이나 가이드 같은 것이라서 코드 번호가 올바르지 않더라도 작동에는 문제가 없으나, 올바른 코드 번호를 설정해두면 문제가 생겼을 때 원인을 빠르게 파악하는데 도움이 된다.
- HTTP는 암호화 없이 평문으로 통신하며, 통신 상대를 검증하지 않기 때문에 보안에 취약하다.
3) Why use HTTPS?:
- HTTPS를 왜 사용하는가는 사실 HTTP의 보안 문제와 HTTPS의 존재 그 자체로 설명된다. HTTP의 보안상의 약점을 보완한 것이 바로 HTTPS기 때문이다. HTTPS는 브라우저와 웹사이트간의 암호화된 연결을 수립하는 SSL (Secure Sockets Layer) 기술이나, 거기서 더 발전되어 DigiCert의 보안 인증서를 도입하는 TLS (Transport Layer Security) 기술을 사용한다. 암호화와 복호화에 사용하는 키가 같으면 대칭키, 다르면 비대칭키 방식이라고 부른다.
- 비대칭키 방식은 공개키와 개인키를 사용하는데, 공개키로 암호화했다면 개인키로, 개인키로 암호화했다면 공개키로만 복호화할 수 있다. 서버에서는 서버의 개인키가 있는데, 이 키는 복호화에만 사용되며, 대중에게 공개되는 공개키로는 암호화만 진행할 수 있다. 따라서 어떤 데이터가 탈취 당하더라도 탈취자가 서버의 개인키를 알 방법이 없으므로 정보를 복호화할 수 없다. 보안이 뛰어나지만 구현이 어렵고, 암호화 복호화 과정에 시간이 걸린다는 단점이 있다. 전자 서명이나 메세지 전송등 탈취에 민감한 데이터를 주고받을 때 주로 사용된다고 한다.
- 비대칭키 방식의 SSL인증 과정: 클라이언트가 접속 요청 > 서버에서 공개키 전송 > 클라이언트가 수신한 공개키로 대칭키 암호화 > 서버에서 수신한 대칭키를 개인키로 복호화 > 이 후 주고받는 데이터는 대칭키를 이용
- SSL handshake: 대칭키, 비대칭키 방식을 모두 사용하여 요청과 응답을 암호화하며, 서버가 인증서를 발급받은 외부 기관(DigiCert 등, CA라고 칭함)에서 공개 키의 유효성을 검증/보증 해주는 방식이다.
--
REFERENCES:
> 강의 노트, 10강. HTTP/HTTPS
> Wikipedia, Hypertext
> Wikipedia, TCP (Transmission Control Protocol)
> MDN, TCP handshake
728x90'TIL-sparta' 카테고리의 다른 글
프로그래머스) 햄버거 만들기 풀이 (Java) (0) 2024.05.12 [TIL] 스파르타) Node.js 강의 수강 (0) 2024.05.11 [TIL] 스파르타) CS 강의 수강 (OSI model), 프로젝트 복기 조금 (0) 2024.05.09 [TIL] CSS 기능들 (custom variable, transition) (0) 2024.05.08 [TIL] 스파르타) Project3 마무리 (Dependency Injection) (0) 2024.05.07