지금 우리가 사용하는 인터넷 프로토콜, 즉 IP 기반의 네트워크는 미 국방성에서 1969년 진행했던 아르파넷(ARPANET) 프로젝트에서 시작되었다. 이때 기존에 사용되었던 회선교환 방식이 아닌 패킷교환 방식으로 네트워크를 구축하게 되는데 이를 토대로 현재의 인터넷 통신 방식의 기반이 세워졌다.
IP(인터넷 프로토콜) 주소를 컴퓨터에 부여하여 패킷(Packet)이라는 통신 단위로 데이터를 전달한다.
IP 패킷에서 패킷은 pack과 bucket이 합쳐진 단어로 소포처럼 출발지 IP, 목적지 IP와 같은 정보가 포함되어 있다.
패킷 단위로 전송을 하면 서버 컴퓨터들은 목적지 IP로 서로 데이터를 전달한다.
서버에서 무사히 데이터를 전송받는다면 서버도 이에 대한 응답을 돌려준다.
1. HTTP 메시지가 생성되면 Socket을 통해 전달
- 네트워크 소켓(Socket): 프로그램이 네트워크에서 데이터를 송수신할 수 있도록, 네트워크 환경에 연결할 수 있게 만들어진 연결부
2. TCP 세그먼트를 생성
3. IP패킷 생성
4. 생성된 TCP/IP 패킷은 LAN 카드와 같은 물리적 계층을 지나기 위해 이더넷 프레임 워크에 포함되어 서버로 전송
데이터 전송: 상위 계층에서 하위 계층으로 데이터를 전달
이때 데이터를 상대방에게 보낼 때 각 계층에서 필요한 정보를 데이터에 추가하는데 이 정보를 헤더(데이터링크 계층에서는 트레일러)라고 한다. 그리고 이렇게 헤더를 붙여나가는 것을 캡슐화라고 한다.
마지막 물리 계층에 도달하며 송신 측의 데이터링크 계층에서 만들어진 데이터가 전기 신호로 변환되어 수신 측에 전송된다.
데이터 수신: 하위 계층에서 상위 계층으로 데이터를 받음
이때 상위 계층으로 데이터를 전달하며 각 계층에서 헤더(데이터링크 계층에서는 트레일러)를 제거해 나가는 것을 역캡슐화라고 한다. 역캡슐화를 거쳐 마지막 응용 계층에 도달하면 전달하고자 했던 원본 데이터만 남게 된다.
HTTP/1.1, HTTP/2는 TCP 기반이며 HTTP/3는 UDP 기반 프로토콜이다.
클라이언트 서버 구조
클라이언트가 서버에 요청을 보내면 서버는 그에 대한 응답을 보내는 클라이언트 서버 구조이다.
무상태성
서버가 클라이언트의 상태를 보존하지 않고 클라이언트가 상태를 가지고있는 무상태 프로토콜이다.
장점: 서버 확장성 높다(서버 증설 쉬움)
단점: 클라이언트가 추가 데이터 전송해야함
비연결성
HTTP 1.0 기준으로, HTTP는 연결을 유지하지 않는 모델이다. 실제로 요청 주고받을 때만 연결 유지하므로 최소한의 자원으로 서버 유지가 가능하다. 하지만 매번 자원을 보낼 때마다 연결 끊고 다시 연결하고를 반복하는 것은 비효율적이기 때문에 지금은 HTTP 지속 연결(Persistent Connections)로 문제를 해결한다.
HTTP 1.0: 요청시 마다 연결 종료 반복
HTTP 1.1(지속 연결): 순차적으로 모든 요청과 응답이 끝나고 난 후 연결 종료
HTTP 1.1(파이프라인): 모든 요청을 한번에 보내면 순차적으로 응답 받음
HTTP 1.0(멀티플렉싱): 요청과 응답 모두 한번에 보내고 받음
HTTP 메세지
단순함, 확장 가능
클라이언트가 선호하는 표현 요청(우선순위도 표현 가능)
협상 헤더는 요청 시에만 사용
1. 서버는 인증서를 발급받기 위해서 CA로 서버의 정보와 공개 키를 전달한다.
2. CA는 서버의 공개 키와 정보를 CA의 비밀 키로 암호화하여 인증서를 발급해 준다.
3. 서버는 클라이언트에게 요청을 받으면 CA에게 발급받은 인증서를 보내준다.
4. 사용자가 사용하는 브라우저는 CA들의 리스트와 공개 키를 내장하고 있으므로 해당 인증서가 리스트에 있는 CA가 발급한 인증서인지 확인하고, 리스트에 있는 CA라면 해당하는 CA의 공개 키를 사용해서 인증서의 복호화를 시도한다.
CA의 비밀 키로 암호화된 데이터(인증서)는 CA의 공개 키로만 복호화가 가능하므로, 정말로 CA에서 발급한 인증서가 맞다면 복호화가 성공적으로 진행되고 실패했다면 신뢰할 수 없는 인증서임을 확인하게 된다.
5. 서버의 인증서를 성공적으로 복호화하여 서버의 공개 키를 확보한 후 클라이언트와 서버가 함께 사용할 대칭키를 서버의 공개 키로 암호화하여 서버에게 보내준다.
클라이언트가 서버로 대칭 키를 보낼 때 서버의 공개 키를 사용해서 암호화하여 보내준다면, 서버의 비밀 키를 가지고 있는게 아닌 이상 해당 대칭 키를 복호화할 수 없으므로 탈취될 위험성이 줄어든다.
대칭키를 사용하는 이유는 공개 키 암호화 방식은 보안은 확실하지만, 복잡한 연산이 필요하여 더 많은 시간을 소모하기때문이다.