HTTP는 HyperText Transfer Protocol의 약자로 주로 HTML과 같은 HyperText 형식의 문서를 주고 받기 위해 만들어졌다. 또한, 인터넷에서 데이터를 주고받을 수 있는 프로토콜이다.
컴퓨터 또는 전기기기간의 원활한 통신을 위해 지키기로 약속한 규약이다.
간단히 만해 어떻게 통신할지 약속한 규칙 이라고 생각하면 된다.
Uniform Resource Locator의 약자로, 웹에서 특정 자원이나 웹 페이지의 위치를 지정하는 주소다. 사용자가 웹 브라우저에 URL을 입력하면, 해당 자원에 접근할 수 있다.
자세한 내용은 https://velog.io/@mer1-97/URL이란 해당 블로그 참고.
네트워크를 통해 클라이언트에게 서비스를 제공하는 시스템이다. 서버는 클라이언트의 요청에 응답하여 데이터나 자료를 전달한다.
서버의 서비스를 받아 사용하는 장치나 프로그램을 말한다. 예를 들어, 웹 브라우저는 서버에서 받은 웹 페이지를 사용자에게 보여주는 클라리언트 프로그램이다.
클라이언트(Client) 즉, 사용자가 웹 브라우저(Chrome, Safarie 등)를 통해서 URL(http://example.com) 정보 등을 요청(Request)을 하면 서버에서는 해당 요청에 맞는 결과 정보를 찾아서 사용자에게 응답(Response)하는 형태로 동작한다.
간단히 동작 과정을 표시해보자면 다음과 같다.

클라이언트인 사용자가 서버에게 데이터를 받고자 할떄 보내는 것이 요청(Request) 이라고 하며 요청을 보낼때는 요청에 대한 정보를 담아 서버로 보낸다. 요청 메시지에는 다음의 정보들이 포함된다.

클라이언트가 수행하고자 하는 동작을 정의한 것이 메소드이다.
GET : 데이터를 요청할 때 사용
POST : 데이터의 생성을 요청할 때 사용
PUT : 데이터의 수정을 요청할 때 사용
DELETE : 데이터의 삭제를 요청할 떄 사용
서버에서 요청하는 데이터의 주소를 의미한다. 예를 들어, /는 웹 서버의 기본 페이지 를 나타내며, 웹 사이트에는 다양한 경로(Path) 가 있을 수 있다.
각 경로는 서버에서 다른 리소스(예: 페이지, 이미지, 파일 등)를 제공하도록 설정된다. 예를 들어, /about은 소개 페이지를, /images/logo.png는 logo image를 가리킨다.
즉, 요청하는 경로에 따라 서버는 그에 맞는 데이터를 응답으로 보내준다.
HTTP Protocol의 버전을 나타낸다. 예를 들어, HTTP/1.1에서 1.1은 사용된 HTTP의 버전 번호이다. 이 버전 정보는 클라이언트와 서버가 어떻게 통신할지 정의하는 중요한 요소인데, 각각의 버전은 다양한 기능과 성능 개선을 포함하고 있다.
HTTP/1.0
- 초기 HTTP 프로토콜이다.
- 클라이언트와 서버 간에 단일 연결에서 하나의 요청만 처리할 수 있다.
- 한 번의 요청에 대해 응답이 오면 연결이 끊어진다. 그래서 여러 리소소(데이터)를 요청하려면 매번 새로운 연결을 열어야 한다,
HTTP/1.1
- 한 번의 연결로 여러 요청과 응답을 주고받을 수 있어, 연결을 유지한 상태에서 여러 리소스를 처리할 수 있다. 이를 Keep-Alive로 불린다.
- 데이터를 조각으로 나눠서 전송할 수 있어서 서버가 완전히 준비되지 않은 데이터도 바로 전송할 수 있다.
HTTP/2
- 하나의 연결에서 여러 요청을 동시에 처리할 수 있어 페이지 로딩 속도가 비교적 빨라졌다. 이를 Multplexing 이라 한다.
- 서버가 클라이언트가 요청하지 않은 리소스를 미리 전송해 성능을 향상시키는데. 이를 Server Push라고 한다.
헤더는 요청 메시지나 응답 메시지의 본문(데이터) 이외에 중요한 정보를 전달한다. 각 헤더는 key: value 형식으로 이루어져 있다. 또한, 클라이언트가 서버에 요청을 보낼 때 추가적인 정보를 포함함으로써 서버가 적절한 응답을 제공하도록 도와준다.
Host : 서버의 도메인 이름이나 IP 주소를 명시한다. HTTP/1.1 버전부터 필수로 포함된다.
Host: www.example.comUser-Agent : 요청을 보내는 클라이언트의 정보를 포함한다.
Mozilla/5.0 (Macintosh; Intel Maac OS X 10.157)Accept : 클라리언트가받을 수 있는 데이터의 콘텐츠 타입을 지정한다. 서버는 이 헤더를 참고해 적절한 형식의 응답을 보낸다.
Accept: text/html, application/jsonCookie : 서버가 클라이언트에게 저장하도록 한 쿠키 데이터를 다시 서버에 전달하는 데 사용된다.
Cookie: session_id=abc134Content-Type : 요청 본문에 담긴 데이터의 형식을 명시할 때 사용되는데, 주로 POST 메소드 요청에서 사용된다.
Content-Type: application/jsonReferer : 이전 페이지의 URL(요청 페이지)을 서버에 알린다.
Referer: http://www.example.com/homeConnection : 클라이언트와 서버 간 연결을 유지할지, 요청 후 끊을지 여부를 설정 한다.
Connection: keep-alive
서버가 클라이언트가 보낸 요청에 대한 대답을 다시 클라이언트에게 보내는 것을 응답(Response) 이라고 한다.

HTTP 응답 메시지는 Status Line(상태 줄), Headers, Body 구조를 가지고 있다.
상태 코드는 굉장히 많은 종류가 있다. 모두 숫자 세 자리로 이루어져 있으며, 아래와 같이 크게 다섯 부류로 나뉜다.
1XX (조건부 응답) : 요청을 처리 중임을 나타내며, 최종 응답이 오기 전에 임시 응답으로 보내진다.
100 Continue (클라이언트가 요청을 계속 진행해도 됨)2XX (성공) : 클라이언트가 요청한 동작을 수신하여 이해했고 승낙했으며 성공적으로 처리했음을 의미한다.
200 OK (요청이 성공적으로 처리됨)
201 Created (새 리소스가 성공적으로 생성됨)3XX (리다이렉션 완료) : 클라이언트는 요청을 완료하기 위해 추가 동작을 해야 할때 발생한다.
301 Moved Permanently (요청한 리소스가 새로운 URL로 영구적으로 이동됨)
302 Found (리소스가 임시로 다른 URL에 있음)4XX (요청 오류) : 클라이언트의 오류로 인해 요청이 처리되지 않음을 나타낸다.
400 Bad Request (잘못된 요청)
401 Unauthorized (인증이 필요함)
404 Not Found (요청한 리소스를 찾을 수 없음)5XX (서버 오류) : 서버의 문제로 인해 요청을 처리하지 못했음을 나타낸다.
500 Internal Server Error (서버 내부 오류)
503 Service Unavailable (서버가 요청을 처리할 수 없는 상태)
요청 메시지의 헤더와 같은 구조를 가지고 있으며, 응답 헤더도 다양한 정보를 포함한다.
Content-Type : 서버가 응답으로 보내는 데이터의 타입을 나타낸다.
Content-Type: text/html; charset=UTF-8Content-Length : 응답 본문의 크기를 바이트 단위로 나타낸다.
Content-Length: 3495Date : 응답이 서버에서 생성된 날짜와 시간을 포함한다.
Date: Sun, 13 Oct 2024 10:00:00 GMTServer : 응답을 보내는 서버의 소프트웨어 정보를 포함한다.
Server: Apache/2.4.41 (Ubuntu)Set-Cookie : 서버가 클라이언트에 쿠키를 설정하려고 할 때 사용하는 헤더이다.
set-Cookie: sessionid=abc123; HttpOnly
응답 메시지의 본문은 선택 사항 이며, 주로 서버가 클라이언트에 전달할 데이터를 포함한다. 요청된 리소스나 문서가 이 부분에 포함되며, HTML 페이지, JSON 데이터, 이미지 파일 등 다양한 형태일 수 있다. 상태 코드에 따라 본문이 포함되지 않을 수도 있다.
Hypetext Transfer Protocol Secure는 HTTP의 보안 강화 버전으로, 클라이언트와 서버 간의 통신을 암호화하여 데이터를 안전하게 전송하는 프로토콜이다. 기본적인 동작은 HTTP와 같지만, HTTPS는 데이터가 네트워크를 통해 전송될 때 이를 보호하기 위해 SSL/TLS프로토콜을 사용한다.

Client Hello
클라리언트가 서버에 연결 요청을 보내면서, 지원하는 SSL/TSL 버전, 암호화 방식 목록, 난수 등의 정보를 전달한다.
Server Hello
서버는 클라이언트의 요청에 응답하며, 선택된 암호화 방식과 서버의 공개키를 포함한 인증서를 클라이언트에 전달한다.
서버 인증
클라이언트느 서버의 인증서를 확인하여, 신뢰할 수 있는 인증기관에서 발급 된것인지 검증한다.
세션 키 교환
클라이언트는 자신의 대칭키를 생성하고, 이를 서버의 공개키로 암호화하여 서버에 전달한다. 서버는 자신의 개인키로 이 대칭키를 복호화하여 얻는다.
암호화 설정
클라이언트와 서버는 공유된 대칭키를 사용하여 데이터 전송을 암호화한다. 이후의 통신은 이 대칭키를 사용하여 안전하게 처리된다.
암호화/복호화란?
암호화는 사용자가 입력한 데이터를 쉽게 알아볼 수 없는 데이터로 변경하는 과정이다.
복호화는 암호화된 데이터를 알아볼 수 있도록 정상적인 데이터로 변경하는 과정이다.
대칭키 암호화
빠르고 효율적인 암호화 방식으로, 동일한 키로 데이터의 암호화와 복호화를 수행한다.
비대칭키(공개키) 암호화
공개키와 개인키 쌍을 사용하여 대칭키를 안전하게 전달한다. 공개키로 대칭키를 암호화하고, 개인키로 이를 복호화하여 보안성을 유지한다.
위와 같은 절차를 통해 HTTPS는 사용자의 데이터와 통신을 안전하게 보호하며, 민감한 정보를 보호하기 위한 중요한 역할을 수행한다.
HTTP는 네트워크 통신을 작동하게 하는 기본 기술이다. 반면에 HTTPS는 HTTP의 확장 버전으로, 브라우저와 서버간 데이터를 전송하기 전에 안전하고 암호화된 연결을 설정한다.
한 문장으로 요약하면, HTTPS가 보안성이 더 뛰어나다. 그러므로 현재 대부분의 웹 사이트는 HTTPS 프로토콜을 사용한다.
image by BORAMAE