HTTP 메시지란?
- HTTP 메시지는 HTTP에서 서버와 클라이언트 간에 데이터가 교환되는 방식
- 시작 줄 (Start line)
- 메시지의 첫 줄은 시작줄로, 요청이라면 무엇을 해야 하는지 응답이라면 무슨일이 있어났는지 나타난다.
- 요청과 응답의 형태가 다름에 주의하자.
- 요청은 HTTP 메서드 및 버전
- 응답은 HTTP 버전 및 상태 코드가 오고 있다.
- 헤더 (HTTP Headers)
- 시작줄 다음에는 0개 이상의 헤더 필드가 이어진다. 각 헤더 필드는 쉬운 구문 분석을 위해 쌍점(:) 으로 구분되어 있는 하나의 이름과 하나의 값으로 구성 된다.
- 헤더필드를 추가하려면 그저 한 줄을 더하기만 하면 되며, 헤더는 빈 줄로 끝난다.(empty line)
- 본문 (Body)
- 어떤 종류의 데이터든 들어갈 수 있는 메시지 본문이 필요에 따라 올 수 있다.
- 요청의 마지막 부분에 들어가나 모든 요청에 본문이 들어가지는 않는다.
- GET, HEAD, DELETE, OPTIONS 처럼 리소스를 가져오는 요청은 보통 본문이 필요가 없다 (DELETE는 삭제)
메서드란
- HTTP 메서드라고 불리는 여러가지 종류의 요청 명령을 지원하며 모든 요청 메시지에는 한 개의 메서드를 갖는다.
- 메서드는 서버에게 어떤 동작이 취해져야 하는지 말해준다.
HTTP 메서드 | 설명 |
---|
GET | 서버에서 클라이언트로 지정한 리소스를 보내라. |
PUT | 클라이언트에서 서버로 보낸 데이터로 리소스를 전부 변경해라. |
PATCH | 지정한 리소스를 일부 변경해라. |
DELETE | 지정한 리소스를 서버에서 삭제하라. |
POST | 클라이언트 데이터를 서버에 보내 리소스를 생성하라. |
HEAD | 지정한 리소스에 대한 응답에서 HTTP 헤더만 보내라. (GET과 동일한 응답을 요구하지만, 응답 본문을 포함하지는 않음) |
TRACE | 루프백 진단을 위해 사용 |
OPTION | 서버의 어떤 메소드가 지원되는지 질의 |
이외에도 여러 method가 있다. https://developer.mozilla.org/ko/docs/Web/HTTP/Methods
- GET의 특징
- 캐시가 가능하고, 브라우저 히스토리에 기록이 남을 수 있다.
- URL에 쿼리 스트링으로 데이터를 붙여 서버에 전송 한다.
- 데이터를 헤더에 포함하여 전송 한다.
- URL에 정보들이 그대로 노출되어 있어, POST 방식보다 상대적으로 보안에 취약하다.
- POST 방식보다 전송 속도가 빠르며 전송 데이터양에 한계가 있다. (브라우저마다 GET 요청 길이 제한이 다르다.)
- 멱등성이 보장되어야 한다.
- POST의 특징
- 데이터를 HTTP Body에 담아 전달한다.
- 보내는 데이터 양에 제한이 없고, 대용량 데이터를 보낼때에는 POST가 적합하다.
- GET에 비해 보안은 가능하나, 브라우저 도구로 데이터를 전부 볼 수 있다.
- 브라우저 히스토리에 남지 않는다.
- 멱등성이 보장되지 않는다. (PUT은 보장한다.)
상태 코드
- HTTP 메시지는 상태 코드와 함께 반환 된다.
상태 코드의 종류 | 의미 |
---|
1xx | 정보성, 요청 받았고 진행중 |
2xx | 성공 |
3xx | 리다이렉션 |
4xx | 클라이언트 측 오류 |
5xx | 서버 측 오류 |
- 1xx (정보성 응답)
- 100 (Continue) : 진행 중임을 의미
- 101 (Switching Protocol) : 클라이언트가 보낸 Upgrade 요청 헤더에 대한 응답에 들어가며, 서버에서 프로토콜을 변경할 것
- 102 (Processing) : 응답 코드는 서버가 요청을 수신하였으며 이를 처리하고 있지만, 아직 제대로 된 응답을 알려줄 수 없음
-
2xx (성공 응답)
- 200 (OK) : 요청이 성공적으로 되었다.
- 201 (Created) : 요청이 성공적이었고 그 결과로 새로운 리소스가 생성되었다. POST 혹은 PUT 요청 이후로 따라온다.
- 202 (Accepted) : 요청이 처리를 위해 수락되었으나, 아직 해당 요청에 대해 처리 중이거나 처리 시작되지 않았을 수 있다는 것을 의미,
이 응답은 요청 처리에 대한 결과를 이후에 HTTP로 비동기 응답을 보내는 것에 대해서 명확하게 명시하지 않는다.
- 204 (No Content) : 요청에 대해서 보내줄 수 있는 콘텐츠가 없다. DELETE 혹은 PUT 요청 이후로 따라온다.
-
3xx (리다이렉션 응답)
-
301 (Moved Permanently) : 요청한 리소스의 URI가 변경되었음을 의미, 요청한 페이지를 새 위치로 영구적으로 이동. GET 또는 HEAD 요청에 대한 응답으로 이 응답을 표시하면 요청자가 자동으로 새 위치로 전달된다.
-
302 (Found) : 요청한 리소스의 URI가 임시적으로 변경되었음을 의미, 클라이언트는 향후의 요청도 반드시 동일한 URI로 해야한다. 현재 서버가 다른 위치의 페이지로 요청에 응답하고 있지만 요청자는 향후 요청 시 원래 위치를 계속 사용해야 한다.
-
303 (See Other) : 클라이언트가 요청한 리소스를 다른 URI에서 GET 요청을 통해 얻어야 할 때, 서버가 클라이언트로 직접 보내는 응답
-
304 (Not Modified) : 캐시를 목적으로 사용, 클라이언트에게 응답이 수정되지 않았음을 알려주며, 클라이언트는 계속해서 응답의 캐시된 버전을 사용할 수 있다.
-
301과 302의 차이?
-
4XX (클라이언트 측 오류)
- 400 (Bad Request) : 잘못된 문법으로 서버가 요청을 이해할 수 없음을 의미
- 401 (Unauthorized) : 클라이언트는 요청한 응답을 받기 위해서는 반드시 스스로를 인증해야 함
- 403 (Forbidden) : 클라이언트는 콘텐츠에 접근할 권리를 가지고 있지 않음, 401과 달리 403은 클라이언트가 누구인지는 알 고 있음
- 404 (Not Found) : 서버는 요청받은 리소스를 찾을 수 없음
- 429 (Too Many Requests) : 사용자가 지정된 시간에 너무 많은 요청을 했음
-
5xx (서버 측 오류)
- 500 (Internal Server Error) : 웹 사이트 서버에 문제가 있음을 의미
- 503 (Service Unavailable) : 서버가 요청을 처리할 준비가 되지 않았다는 뜻, 유지보수를 위해 작동이 중단되거나 과부하가 걸린 서버
헤더 정보
내용이 많으니 MDN을 참조하자.