1. HTTP(HyperText Transfer Protocol)
네트워크는 어떻게 클라이언트의 요청을 받고 요청받은 데이터, 즉 정보를 서버에게 전달할 수 있을까?
--> 바로 데이터 통신을 위해 정해진 규칙의 집합, 즉 프로토콜을 통해 통신한다.
HTTP는 인터넷에서 데이터를 주고받기 위한 통신규약이다. HTTP는 클라이언트-서버 모델을 따른다. 클라이언트가 서버에 요청(request)을 보내면, 서버는 해당 요청에 대한 응당(response)를 반환한다. 이때 요청과 응답은 일련의 규칙에 따라 전송되는데, 이를 HTTP 프로토콜이 제어한다.
HTTP의 간략한 역사:
HTTP는 웹의 아버지라 불리는 팀 버너스리라는 분이 만들었다. 만들게 된 계기는 팀 버너스리가 연구소에서 일할 때 연구원들이 논문을 읽고 해당 논문에 쓰여있는 참고논문을 보고 싶어 했는데 그러기 위해서는 해당 참고논문을 또다시 요청해야 했다. 매우 번거로웠어서 참고문서들을 모두 연결시킬 수 있다면 어떨까?라는 생각에서 시작된 것이 현재까지 발전하게 되었다. HTTP의 처음 목적은 링크(연결)를 기반으로 하여 문서(HTML)의 전달이었지만 확장성이 매우 뛰어났기에 지금은 문서뿐만 아니라 이미지, 동영상, 오디오 등의 데이터들을 전달이 가능해졌다.
처음에는 따로 정해진 규칙 및 약속이 없었기에 HTTP의 사용방법이 전부 상이했다. 그래서 개발자들은 HTTP를 통해 들어오는 모든 요청에 대해 분기처리를 계속해서 추가해야 했다. 끝이 없는 동굴을 파는 느낌이었을 거라고 한다.. 결국 이러한 문제를 해결하기 위해 1996년 사양을 정리하여 발표했는데 표준이 생긴 이후 우리는 HTTP를 HTTP/1.0이라 부르게 되었고 지금까지 발전하고 있다.
HTTP는 웹 브라우저가 웹 서버로 웹 페이지를 요청하고, 서버가 해당 페이지를 반환하는 데 사용된다. 또한, HTTP는 웹 페이지를 로드할 때 사용되는 자원(이미지, 스크립트, 스타일시트 등)을 가져오는 데에도 사용된다.
최근에는 보안을 강화하기 위해 HTTPS(secure HTTP)가 많이 사용되고 있는데 HTTPS는 HTTP에 암호화 기능을 추가하여 보안성을 높인 것이다. 따라서 HTTPS를 사용하면 데이터의 안정성을 보장할 수 있다.
2. HTTP 요청 구조
HTTP 요청은 보통 다음과 같은 구조를 가지며, 크게 Start Line, Headers, Body 3가지 요소로 나눌 수 있다.
Start Line:
Start Line은 요청 메소드, 요청 URL, HTTP 버전 정보로 구성된다.
GET /index.html HTTP/1.1
Headers:
Headers는 클라이언트가 서버에게 전달하는 추가 정보를 담고 있다. 요청 메시지의 속성을 지정하는 데 사용된다.
Host: localhost:8080
User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/110.0.0.0 Safari/537.36
Accept-Language: ko-KR,ko;q=0.9,en-US;q=0.8,en;q=0.7
Body:
Body는 HTTP 요청과 관련된 데이터를 담는다. Body는 필수 요소는 아니며, 요청에 따라 전송되지 않을 수도 있다.(GET 요청은 Body가 없음)
3. HTTP 응답 구조
HTTP 응답도 HTTP 요청과 유사한 구조를 가지며, 크게 Start Line, Headers, Body 3가지 요소로 나눌 수 있다.
Start Line:
Start Line은 HTTP 버전, 응답 상태 코드, 상태 코드에 대한 설명으로 구성된다.
HTTP/1.1 200 OK
Headers:
Headers는 서버가 클라이언트에게 전달하는 추가 정보를 담고 있다. 응답 메시지의 속성을 지정하는 데 사용된다.
Content-Type: text/html; charset=utf-8
Content-Length: 1234
Body:
Body는 HTTP 응답과 관련된 데이터를 담는다. HTTP 응답 메시지가 HTML 페이지라면, Body는 HTML 코드를 담게 된다.
4. HTTP와 포트
HTTP는 보통 80번 포트를 사용하며, HTTPS(SSL/TLS)를 사용할 경우 443번 포트를 사용한다.
그러므로 웹 서버에 접속할 때는 HTTP 요청의 목적지 주소(URL) 뒤에 포트 번호를 생략하면, 자동으로 80번 포트가 사용된다.
5. HTTP Method
HTTP Method는 HTTP 프로토콜을 이용하여 서버에게 요청하는 메서드, 즉 기능을 말한다. 이를 통해 클라이언트가 서버에게 요청하는 데이터의 종류나 목적에 따라 적절한 메서드를 선택하여 요청을 보낼 수 있다. HTTP Method는 다양하게 존재하지만 크게 GET, POST, PUT, PATCH, DELETE, 이렇게 5가지로 나눌 수 있다.
GET
GET 메서드는 서버로부터 특정 리소스(HTML 파일, 이미지, 동영상 등)를 요청할 때 사용한다. GET 요청을 보내면 서버는 요청한 리소스를 응답으로 반환한다.
GET /index.html HTTP/1.1
Host: www.yeongmee.com
POST
POST 메서드는 서버에 데이터를 제출하기 위해 사용된다. 주로 웹 form을 사용하여 데이터를 제출할 때 사용하며, 데이터를 Body에 담아서 서버로 전송한다.
POST /submit-form HTTP/1.1
Host: www.yeongmee.com
Content-Type: application/x-www-form-urlencoded
username=yeongmee&password=1234
PUT
PUT 메서드는 서버에 새로운 리소스를 생성하거나, 기존의 리소스를 갱신할 때 사용한다. PUT 요청을 보내면 서버는 요청한 리소스를 생성하거나 갱신한다.
PUT /new-resource HTTP/1.1
Host: www.yeongmee.com
Content-Type: text/plain
Hello! I am yeongmee!
PATCH
PATCH 메서드는 서버에 존재하는 리소스의 일부를 수정할 때 사용한다. PATCH 요청을 보내면 서버는 요청한 리소스의 일부를 수정한다.
PATCH /update-resource HTTP/1.1
Host: www.yeongmee.com
Content-Type: application/json
[
{ "username": "yeongmee1",
"email": "asdf@gmail.com",
"phone": "010-0000-1111"
},
{ "username": "yeongmee2",
"email": "qwer@gmail.com",
"phone": "010-0000-2222"
},
]
DELETE
DELETE 메서드는 서버에 존재하는 특정 리소스를 삭제할 때 사용한다. DELETE 요청을 보내면 서버는 요청한 리소스를 삭제한다.
DELETE /delete-resource HTTP/1.1
Host: www.yeongmee.com
PUT과 PATCH의 차이점:
PUT과 PATCH의 가장 큰 차이점은 수정하는 데이터의 범위이다.
PUT은 전체 데이터를 수정할 때 사용된다. 클라이언트가 서버에게 수정하고자 하는 데이터를 전송하면, 해당 데이터로 전체 데이터를 덮어씌우게 된다. PUT은 일괄 업데이트(bulk update)에 사용된다.
PATCH는 부분적으로 데이터를 수정할 때 사용된다. 클라이언트가 서버에게 수정하고자 하는 데이터의 일부분만 전송하면, 해당 데이터만 수정되고 나머지 데이터는 그대로 유지된다. PATCH는 단일 업데이트(single update)에 사용된다.
6. HTTP 상태 코드(HTTP Status Code)
HTTP 상태 코드는 클라이언트가 서버에 요청을 보내고 서버가 클라이언트에게 응답하는 과정에서 발생할 수 있는 상황을 정리한 것이다. 상태 코드는 클라이언트가 요청에 대한 응답을 받았을 때 요청이 성공적으로 처리 되었는지, 오류가 발생했는지, 다른 작업을 수행해야 하는지 등을 명시한다.
HTTP 상태 코드는 3자리 숫자로 이루어져 있다. 첫 번째 자리 숫자는 상태 코드의 분류를 나타내는 용도로 사용되며, 나머지 두 자리는 세부적인 정보를 나타낸다.
- 1xx (Infromational)
- 요청이 수신되었으며 처리가 계속 되고 있음을 나타낸다.
- 주로 웹 브라우저와 같은 클라이언트가 서버와의 연결 상태를 확인하기 위해 사용된다.
- 2xx (Successful)
- 클라이언트의 요청이 성공적으로 처리 되었음을 나타낸다.
- 가장 많이 사용되는 상태 코드는 200이다.
- 요청이 성공적으로 처리 되었으며 클라이언트가 요청한 데이터가 서버에서 제공됨을 의미한다.
- 3xx (Redirection)
- 클라이언트가 추가적인 조치를 취해야 함을 나타낸다.
- 주로 페이지 이동, 리다이렉션 등에 사용된다.
- 4xx (Client Error)
- 클라이언트에 오류가 있음을 나타낸다.
- 주로 클라이언트의 잘못된 요청, 인증 오류 등에 사용된다.
- 가장 많이 사용되는 상태 코드는 404이다. 클라이언트가 요청한 페이지나 리소스가 서버에서 찾을 수 없음을 의미한다.\
- 5xx (Server Error)
- 서버에 오류가 발생했음을 나타낸다.
- 주로 서버의 오류, 서버 과부하 등에 사용된다.
- 가장 많이 사용되는 상태 코드는 500이다. 서버 내부 오류가 발생함을 의미한다.