HTTP 기초 - 4 - 요청과 응답

고은연·2021년 2월 19일
2

HTTP 요청 형태

클라이언트가 서버로 메세지를 보내 자원을 요청하는 것을 요청(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"
]

HTTP 응답 형태

클라이언트 요청에 대해서 서버가 응답하는 것을 응답(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 응답 코드

HTTP 주요 응답 코드에 대해서 간단하게 알아보겠습니다. 모든 응답 코드에 대해 궁금하다면 MDN HTTP 상태 코드 https://developer.mozilla.org/ko/docs/Web/HTTP/Status 를 참고하세요.

코드메세지
200OK요청이 성공했습니다.
301Moved Permanently요청한 리소스가 영구적으로 이동했습니다. 브라우저나 크롤러 등 클라이언트는 영구 이동을 기억하고 같은 리소스가 요청될 경우 캐시 등을 통해 서버에 리소스를 다시 요청하지 않을 수 있습니다.
302Found요청한 리소스가 임시로 이동했습니다. 클라이언트는 다음번 같은 리소스 요청시에도 서버에 요청을 합니다. 주로 POST 등으로 서버 리소스를 변경하고 나서 다른 페이지로 이동할 때 사용합니다.
400Bad Request서버가 요청을 이해할 수 없습니다.
401Unauthorized인증되지 않았습니다.
403Forbidden인증은 되었지만 서버 리소스에 접근할 권한이 없습니다.
404Not Found요청한 리소스를 찾을 수 없습니다.
405Method Not Allowed요청한 리소스는 요청한 메소드에 반응하지 않습니다. 주로 반드시 POST, PUT, DELETE 등 리소스를 변경하는 메소드만 허용하는 리소스를 GET 등으로 요청할 때 응답하는 코드입니다.
408Request Timeout서버가 지정한 시간보다 처리 시간이 오래 걸려서 연결을 끊습니다.
429Too Many Requests특정 시간 내에 하나의 클라이언트가 너무 많은 요청을 보냈습니다. 많은 서버들은 DDOS 공격 등을 방지하기 위해 짧은 시간 동안 너무 많은 요청이 있는 것을 방지하고는 합니다.
500Internal Server Error서버에 오류가 발생했습니다. 주로 프로그램이 예상하지 못한 상황에서 오류가 났을 경우 나오는 코드입니다.
502Bad Gateway메시지가 게이트웨이를 거치는 동안 오류가 발생했습니다. 주로 인프라쪽 문제일 경우가 많습니다.
503Service Unavailable서버가 아직 준비가 되지 않았습니다. 주로 정기점검 등 임시로 서비스의 접근을 막은 상태에서 게이트웨이나 로드밸런서 등에서 임시 페이지를 걸어놓았을 경우 사용됩니다.
504Gateway Timeout게이트웨이가 정상 시간 내에 응답할 수 없습니다. 서버에서 처리 시간이 너무 긴 것일 수도 있고, 게이트웨이에 부하가 걸려서 처리를 못하는 상황일 수도 있습니다.
profile
중년 아저씨. 10 + n년차 백엔드 개발자. 스타트업과 창업, 솔로프리너와 1인 기업에 관심 많아요.

0개의 댓글