클라이언트가 서버로 메세지를 보내 자원을 요청하는 것을 요청(request - 리퀘스트)라고 부릅니다.
HTTP 규약에서 요청 메세지는 아래와 같은 형태로 이루어집니다. 아래 요청은 일반적인 HTTP GET 요청시 요청 메세지입니다.
GET /member HTTP 1.1
Host: github.com/koeunyeon
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:84.0) Gecko/20100101 Firefox/84.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8
Accept-Language: ko-KR,ko;q=0.8,en-US;q=0.5,en;q=0.3
Accept-Encoding: gzip, deflate
Connection: keep-alive
첫번째 줄은 HTTP 메소드, 요청할 자원의 주소, HTTP 프로토콜 버전입니다. 예시에서는 GET 메소드로 /member 자원에 HTTP 1.1 방식으로 접근하라는 의미가 됩니다.
다음줄부터는 HTTP HEADER라고 부르는데, 요청에 필요한 부가적인 정보들이 들어갑니다.
HTTP POST 요청시도 형식은 동일합니다. 다만 HTTP BODY에 요청 본문이 들어가는 형태를 보기 위해 예제를 보겠습니다.
POST /member/edit?member_id=3 HTTP 1.1
Host: github.com/koeunyeon
login_id=my_id&login_pw=my_pw
위의 예제는 HTTP POST 형식으로 /member/edit?member_id=3 의 자원을 요청합니다. URI는 GET이든 POST든 동일합니다.
중간에 보면 한 칸 공백이 있습니다. 공백 위는 헤더(header), 공백 아래는 바디(body)라고 부릅니다.
POST의 경우 서버로 전달하는 데이터를 바디에 담아 전달합니다. 위 예제에서는 아래와 같은 데이터를 전달했습니다.
login_id=my_id&login_pw=my_pw
코드이그나이터에서는 연관 배열 형태로 읽을 수 있습니다.
[
"login_id"=>"my_id",
"login_pw"=>"my_pw"
]
클라이언트 요청에 대해서 서버가 응답하는 것을 응답(response - 리스폰스)라고 부릅니다. HTTP 규약에서 응답 메세지는 아래와 같은 형태로 이루어집니다.
HTTP/1.1 200 OK
Content-Type: text/html; charset=utf-8
Status: 200 OK
<html>
...
</html>
응답 첫번째 줄은 프로토콜,상태코드, 상태 메세지 세 개의 응답으로 구성됩니다.
두번째 줄 부터는 응답 헤더라고 불리며, 클라이언트가 응답을 해석할 수 있도록 필요한 정보들을 제공합니다.
HTTP 요청과 마찬가지로 공백 한 줄 이후 응답 바디(본문)가 시작됩니다. 본문의 내용은 일반적인 HTML일 수도 있고, JSON 혹은 XML 형식이거나, 단순 텍스트일 수도 있습니다. HTTP 응답 본문은 HTTP 상태 코드에 따라 있을 수도 있고 없을 수도 있습니다.
HTTP 주요 응답 코드에 대해서 간단하게 알아보겠습니다. 모든 응답 코드에 대해 궁금하다면 MDN HTTP 상태 코드 https://developer.mozilla.org/ko/docs/Web/HTTP/Status 를 참고하세요.
코드 | 메세지 | 뜻 |
---|---|---|
200 | OK | 요청이 성공했습니다. |
301 | Moved Permanently | 요청한 리소스가 영구적으로 이동했습니다. 브라우저나 크롤러 등 클라이언트는 영구 이동을 기억하고 같은 리소스가 요청될 경우 캐시 등을 통해 서버에 리소스를 다시 요청하지 않을 수 있습니다. |
302 | Found | 요청한 리소스가 임시로 이동했습니다. 클라이언트는 다음번 같은 리소스 요청시에도 서버에 요청을 합니다. 주로 POST 등으로 서버 리소스를 변경하고 나서 다른 페이지로 이동할 때 사용합니다. |
400 | Bad Request | 서버가 요청을 이해할 수 없습니다. |
401 | Unauthorized | 인증되지 않았습니다. |
403 | Forbidden | 인증은 되었지만 서버 리소스에 접근할 권한이 없습니다. |
404 | Not Found | 요청한 리소스를 찾을 수 없습니다. |
405 | Method Not Allowed | 요청한 리소스는 요청한 메소드에 반응하지 않습니다. 주로 반드시 POST, PUT, DELETE 등 리소스를 변경하는 메소드만 허용하는 리소스를 GET 등으로 요청할 때 응답하는 코드입니다. |
408 | Request Timeout | 서버가 지정한 시간보다 처리 시간이 오래 걸려서 연결을 끊습니다. |
429 | Too Many Requests | 특정 시간 내에 하나의 클라이언트가 너무 많은 요청을 보냈습니다. 많은 서버들은 DDOS 공격 등을 방지하기 위해 짧은 시간 동안 너무 많은 요청이 있는 것을 방지하고는 합니다. |
500 | Internal Server Error | 서버에 오류가 발생했습니다. 주로 프로그램이 예상하지 못한 상황에서 오류가 났을 경우 나오는 코드입니다. |
502 | Bad Gateway | 메시지가 게이트웨이를 거치는 동안 오류가 발생했습니다. 주로 인프라쪽 문제일 경우가 많습니다. |
503 | Service Unavailable | 서버가 아직 준비가 되지 않았습니다. 주로 정기점검 등 임시로 서비스의 접근을 막은 상태에서 게이트웨이나 로드밸런서 등에서 임시 페이지를 걸어놓았을 경우 사용됩니다. |
504 | Gateway Timeout | 게이트웨이가 정상 시간 내에 응답할 수 없습니다. 서버에서 처리 시간이 너무 긴 것일 수도 있고, 게이트웨이에 부하가 걸려서 처리를 못하는 상황일 수도 있습니다. |