뜌릅
HTTP 메시지 본문
HTTP 메시지란 무엇일까?
HTTP 메시지는 데이터 블록 단위로 송수신 된다.
이러한 HTTP 메시지의 구조는 요청 메시지와 응답메시지에 따라 다른데, 요청은 클라이언트에서 서버로 응답은 서버에서 클라이언트로 향한다. 향하는 방향에 따른 용어도 존재하는데, 클라이언트에서 서버를 인바운드, 서버에서 클라이언트를 아웃바운드라고 한다. 또 HTTP 메시지는 TCP/IP 기반위에서 동작하므로 강물과 같이 흐른다. 요청 응답 관계없이 모든 메시지는 다운스트림으로 흐르게 된다.
요청 메시지의 형식은 아래와 같은 구조로 이루어져 있다.
<메서드> <요청 URL> <버젼>
<헤더>
<엔티티 본문>
응답 메시지의 형식은 아래와 같은 구조로 이루어져 있다.
<버젼> <상태코드> <사유구절>
<헤더>
<엔터티 본문>
메서드.
HTTP메서드는 GET, HEAD, POST(등등.)같은 애들을 말한다.
이런 메서드들중 안전한 메서드라고 불리는 애들이 있다. GET과 HEAD는 안전하다고 할 수 있는데, 애네들은 서버의 리소스에 어떠한 작용도 하지 않기 때문이다. 정확히는 멱등성을 유지하면서 리소스에 작용을 하지 않는것이라고 한다.안전한 메서드가 서버에 작용을 유발하지 않는다는 보장은 없다. (웹개발자에게 달려있다고 한다.
- GET은 가장 흔하게 쓰이는 메서드로 주로 서버에게 리소스를 달라고 요청하기 위해 쓰이는 것이다.
- HEAD는 GET처럼 행동하지만, 서버는 응답으로 헤더만을 돌려준다. 본문은 반환하지 않는다. 여기서의 헤더는 GET으로 얻는 헤더와 같아야 한다.
- PUT은 서버에 문서를 쓴다. 사용자가 웹페이지를 만들고 서버에 직접 게시할 수 있도록 해준다. (갱신/생성)
- POST는 서버에 입력데이터를 전송하기 위해 사용된다.
- TRACE는 요청시에 방화벽, 프락시, 게이트웨이등을 통과할수도 있는데 이 통과하는 과정에서 메시지는 수정될수도 있다. 마지막 목적지 서버에 도달했을때의 TRACE 요청 메시지 상태를 그대로 담아서 응답을 해준다. 진단을 위해 사용된다.
- OPTIONS는 웹 서버에게 어떤 종류의 지원 범위에 대해 물어 볼 수 있다.
- DELETE는 말 그대로 삭제이다. 하지만 실제로 삭제를 보장하지는 않는다. 요청 무시를 클라이언트에게 통보하지 않고 하는 것이 가능하기 때문이다.
상태코드 :
크게 5가지로 나뉜다. 1xx, 2xx, 3xx, 4xx, 5xx로 나뉘는데 이런 상태코드는 클라이언트들이 트랜잭션을 이해하는데에 쉬운 방법을 제공한다. 또 사유구절이 부연설명으로 존재할 수 있는데 이해에 도움을 준다.
1xx는 정보응답이라고 볼 수 있다.
HTTP 클라이언트가 엔터티 본문을 전송하기 전에 그 엔터티 본문을 서버가 받아들일 것인지 확인하려고 할 때, 그 확인 작업을 최적화하기 위한 의도로 도입된 것이다.
- 100 : 서버가 request header는 받았고 body을 기다리고 있는 중. 만약 엔터티를 서버에 보내려고 하고 그 전에 100 응답을 받게다면 Expect 요청 헤더를 보낼 필요가 있다. 서버는 100 응답코드를 Expect 헤더를 받았을 경우에만 보내야 한다. 가끔 잘못된 서버는 100 응답코드를 보낸다고 한다. 프락시 또한 100 응답을 의도한 요청을 받는데 이때 해야할 일이 있다. 만약 다음 홉 서버가 HTTP의 어떤 버젼을 따르는지 모른다면 Expect헤더를 포함시켜서 요청을 다음으로 전달해야 한다.
2xx는 성공응답이다.
- 200(OK): 요청은 정상이고 엔터티 본문은 요청된 리소스를 포함하고 있다.
- 201(Created): 서버 개체를 생성하라는 요청(PUT)을 위한 것.
- 202(Accepted): 요청은 받아들여졌으나 서버는 아직 어떤 동작도 수행하지 않음. 완료될거라는 보장은 없고 요청이 받아들이기에 적법해 보인다는 의미일 뿐이다.
- 203(Non_Authoritative Information): 엔터티 헤더에 들어있는 정보가 원래 서버가 아닌 리소스의 사본에서 왔다. 중개자가 리소스의 사본을 갖고있지만 검증이 안되거나 못한경우 발생한다.
- 204(No Content): 응답이 엔터티 본문을 포함하지 않음. 폼을 리프레시 할때 사용한다.
- 205(Reset Content): 현재 페이지에 있는 모든 값을 비우라고 말함.
- 206(Partial Content): 부분 혹은 범위 요청이 성공했다.
3xx는 리다이렉션 상태코드이다. 주로 리소스가 다른 위치에 있거나 대안 응답을 제공한다.
- 300(Multiple Choice): 클라이언트가 동시에 여러 리소스를 가리키는 URL을 요청한 경우, 그 리소스의 목록과 함께 반환한다.
- 301(Moved Permanently)
- 302(Found)
- 303(See Other)
- 304(Not Modified)
- 305(Use Proxy)
- 307(Temporary Redirect)
4xx는 클라이언트 에러 상태 코드이다.
우리는 유명한 404 에러를 보았을 것이다. 서버가 우리에게 우리가 알 수 없는 리소스에 대해 요청을 했다고 말해주는 것이다.
- 400(Bad Request)
- 401(Unauthorized)
- 403(Forbidden)
- 404(Not Found)
- 405(Method Not Allowed)
- 406(Not Acceptable)
- 407(Proxy Authentication Required)
까지 대충 내가 봤던 것들을 적어 보았다.
5xx
때때로, 클라이언트가 올바른 요청을 보냈음에도 서버 자체에서 에러가 발생하는 경우가 있다. 이것은 클라이언트가 서버의 제한에 걸린 것일 수도 있고 혹은 게이트웨이 리소스와 같은 서버의 보조 구성요소에서 발생한 에러일 수도있다.
- 500(Internal Server Errror) 원인이 너무 많은 에러
- 501(Not Implemented)
- 502(Bad Gateway)
- 503(Service Unavailable)
- 504(Gateway Timeout)
- 505(HTTP Version Not Supported)