클라이언트는 서버에 접속하여 http규약으로 통신을 하게되는데, 핵심은 서버에게 "요청 양식"을 보내 서버가 "응답 양식을" 전송해 주길 기다린다.
GET / HTTP/1.1 Host: localhost:80 Upgrade-Insecure-Requests: 1 Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8 User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/16.0 Safari/605.1.15 Accept-Language: ko-KR,ko;q=0.9 Accept-Encoding: gzip, deflate
먼저 첫번째 줄에 메소드(GET | POST | DELETE | PUT 등등)가 온다.
이어서 공백을 기준으로 "요청대상 경로(target path)", 그리고 "http의 버전"이 온다.
두번째 줄부터는 헤더들에 대한 정보가 키,값 형식으로 "헤더블록"이 작성된다. (RFC 7230 : header field)
만약 post와 같이 데이터를 본문(body)에 담아 전송한다면 헤더블록뒤에 CRLF이 작성되고 그 밑에 body정보가 담긴다.
HTTP/1.1 200 OK Server: nginx Date: Sat, 12 Nov 2022 15:51:41 GMT Content-Type: text/html Content-Length: 10909 Last-Modified: Sat, 15 Oct 2022 06:33:10 GMT Connection: keep-alive ETag: "634a5426-2a9d" Accept-Ranges: bytes (CRLF) <!DOCTPE html> <html> <head>...</head> <body>...</body> </html>
응답메시지도 비슷하다. 첫번재 줄에 "버전", "상태코드", "상태 메시지(상태코드에 대한 해석)"순으로 작성된다.
두번째 줄부터 헤더블록이 작성이 된다.
마지막으로 CRLF가 작성되고 이어서 요청했던 내용이 작성된다.
GET : safe method, 서버에서 데이터를 조회한다. (주로 서버의 html파일 요청) POST : 데이터를 전송하는 메소드. 주로 html의 form데이터를 서버로 전송하기 위해 사용한다. PUT : 데이터를 전송 및 수정하는 메소드. DELETE : 데이터를 삭제하는 메소드 (200응답이 와도 서버는 실제 데이터 삭제를 보장하지 않는다).
100번대 : 정보 200번대 : 성공 300번대 : 리다이렉트 400번대 : 클라이언트 에러 500번대 : 서버에러
Content-Type : body의 형식 (text/html, image/jpg 등등) content-Length : body데이터의 크기 Date : 작성된 시각 (서버 기준) Accept : 클라이언트가 받을 수 있는 형식 (text/html, image/jpg 등등)
바디 없음 : GET 바디 있음 : POST , PUT, DELETE(필수는 아님)
바디 없음 : PUT, DELETE(필요시 body사용 가능) 바디 있음 : GET, POST
상태코드가 204(내용없음)가 아닌 200이면 삭제한 데이터의 정보를 담아서 응답 할 수도 있다.