HTTP란?

발단

f-lab 멘토링을 하면서 HTTP status code에 대한 얘기가 나왔다. 멘토님의 질문은 다음과 같았다.

"데이터가 없음"을 나타내는 상태코드는 무엇일까?

나는 해당 질문에 대해 500이라 답했다. 부끄러운 일이지만 그간 회사에서 거의 혼자 일을 하며 기능 개발에 급급한 나머지 HTTP 요청에 대해 status code는 어떤 상황에 어떤 code로 반환할지 등 기본적인 HTTP 통신에 대한 고려는 잘하지 못하였다. 이번 기회에 HTTP 자체에 대한 기본적인 정리를 해보고 자주 사용하는 status code에 대해 정리해보고자 한다.

HTTP란?

HTTP에 대해서는 워낙 많은 자료들이 있어서 이해하는데 어렵진 않을 것이다. HTTP는 HyperText Transfer Protocol의 약자로 하나의 통신규약을 의미한다. 웹 상에서 클라이언트와 서버가 통신을 주고 받을 때 기본적으로 HTTP 통신을 한다. 

 

HTTP는 크게 보면 요청, 응답으로 구분할 수 있다. 또한 요청은 요청내용, 헤더, 기타 메시지(파라미터 등)로 구분해 볼 수 있고 응답은 상태 표시행, 응답 헤더, 기타 메시지(html 등)로 구분해 볼 수 있다. 아래는 요청, 응답에 대한 예시이다.

 

- 요청

GET /restapi/v1.0 HTTP/1.1 #요청 내용
Accept: application/json #헤더
Authorization: Bearer UExBMDFUMDRQV1MwMnzpdvtYYNWMSJ7CL8h0zM6q6a9ntw #헤더

 

- 응답

HTTP/1.1 200 OK #상태표시 행
Date: Mon, 23 May 2005 22:38:34 GMT #헤더 시작
Content-Type: text/html; charset=UTF-8
Content-Encoding: UTF-8
Content-Length: 138
Last-Modified: Wed, 08 Jan 2003 23:11:55 GMT
Server: Apache/1.3.3.7 (Unix) (Red-Hat/Linux)
ETag: "3f80f-1b6-3e1cb03b"
Accept-Ranges: bytes
Connection: close #헤더 끝

<html> #기타 메시지 시작
<head>
  <title>An Example Page</title>
</head>
<body>
  Hello World, this is a very simple HTML document.
</body>
</html> #기타 메시지 끝

 

즉 HTTP를 간단히 말하자면 위와 같은 규칙을 따르는 통신규약이다. 웹 서버 개발자가 기본적으로 하는 일이 바로 HTTP 요청을 받고 이를 적절히 처리하여 HTTP 응답을 클라이언트로 전송하는 것이다. 때문에 HTTP에 대한 기본적인 이해가 중요하다.

HTTP 헤더

HTTP 헤더의 종류는 굉장히 많다. 전체적인 내용을 알고 싶다면 아래 내용을 확인하기 바란다.

https://developer.mozilla.org/ko/docs/Web/HTTP/Headers

 

HTTP 헤더 - HTTP | MDN

HTTP 헤더는 클라이언트와 서버가 요청 또는 응답으로 부가적인 정보를 전송할 수 있도록 해줍니다. HTTP 헤더는 대소문자를 구분하지 않는 이름과 콜론 ':' 다음에 오는 값(줄 바꿈 없이)으로 이루

developer.mozilla.org

이 글에서는 대표적으로 많이 사용되는 헤더에 대해 알아보겠다.

Accept

Accept 헤더는 클라이언트가 받아들일 수 있는 미디어 타입이 무엇인지를 나타내는 요청 헤더이다. 예를들어 Accept: text/html로 요청을 보내면 클라이언트는 서버 측에 "나는 text/html 타입만 해석할 수 있으니 그에 맞는 타입으로 응답을 보내줘"라고 요청하는 셈이다. 

User-Agent

요청을 보내는 클라이언트의 식별 정보를 나타내는 헤더이다. 즉 클라이언트의 운영체제, 브라우저 유형 등 클라이언트의 기본적인 식별정보가 들어간다.

# 형식: User-Agent: Mozilla/5.0 (<system-information>) <platform> (<platform-details>) <extensions>
User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/51.0.2704.103 Safari/537.36

Accept-Language

클라이언트가 해석할 수 있는 언어에 대한 헤더이다. 영어, 한국어 등 자연 언어에 대한 내용이며 해당 헤더에 맞게 서버는 응답 정보를 맞춰서 전송해야 한다.

Authorization

이 헤더는 클라이언트가 인증된 것인지를 나타내는 헤더이다. 서버에서는 특정 서버 리소스에 접근할 수 있는 클라이언트인지 확인할 수 있다. 이때 해당 헤더를 이용해 인증된 클라이언트임을 나타내고 서버는 이를 바탕으로 처리를 하게 된다. 

Content-Type

응답 헤더에 포함되는 헤더로써 응답 정보가 어떤 MIME 타입인지를 나타내는 헤더이다. 요즘 많이 사용되는 json의 경우 Content-Type: application/json 이렇게 설정된다.

Connection

HTTP는 기본적으로 연결 상태를 유지하지 않는다. 즉 클라이언트와 서버 간에 연결 상태가 지속되지 않는다는 것이다. 그런데 서버에서 HTTP 요청을 받으려면 기본적으로 Connection을 맺어야 한다. 한 클라이언트에서 HTTP 요청이 빈번하게 일어나는 서비스라면 일정 기간 동안 연결 상태를 유지하는 것이 성능적으로 유리할 것이다. 서버와 연결 상태를 유지할지를 지정하는 헤더가 Connection이다.

Cookie

주로 로그인 상태를 유지할 때 사용되는 헤더이다. 예를 들어 쿠키에 값이 있는지 없는지에 따라 서버에서는 로그인한 유저인지 아닌지를 판단하게 된다.

Status Code(응답 상태 코드)

클라이언트에서 HTTP 요청을 보내면 서버에서는 응답을 전송한다. 이때 요청이 올바른 요청인지, 서버에서 에러가 발생했는지 등 상태코드를 함께 보내게 된다. 응답 상태 코드는 100번대부터 500번대까지 있으며 각각 의미하는 바가 다르다. 흔히 아래와 같이 분류한다고 한다.

 

  • 1xx(정보) : 서버가 HTTP 요청에 대해 처리하는데 문제가 없으며 클라이언트가 계속 요청을 진행할 수 있음을 나타냅니다.
  • 2xx(성공): 서버가 클라이언트의 요청에 대해 정상적으로 처리했음을 의미합니다.
  • 3xx(리다이렉트): 요청에 대한 성공적인 처리를 위해서 추가적인 조치가 필요함을 의미합니다.
  • 4xx(클라이언트 오류): 클라이언트에서 보낸 요청에 오류가 있음을 의미합니다.
  • 5xx(서버 오류): 클라이언트는 정상적인 요청을 보냈지만 서버에서 처리를 할 때 오류가 발생했음을 의미합니다.

우리가 주의 깊게 봐야 하는 건 400번대와 500번대이다. 다른 상태 코드는 오류가 아니지만 400번대와 500번대는 명확히 오류가 발생한 것이기 때문이다. 때문에 해당 상태 코드들 중에 많이 접하는 상태 코드를 알아보겠다.

 

  • 401(비인증): 서버의 리소스에 접근 허가가 안 된 클라이언트가 보낸 요청이라는 의미이다. 예를 들어 로그인 하지 않은 클라이언트는 게시글을 볼 수 없다든가 할 때 반환하는 상태코드이다.
  • 403(비인가): 서버의 특정 리소스에 접근할 수 있는 권한을 보유했는가를 의미한다. 예를 들어 관리자만 접근할 수 있는 리소스에 일반 유저가 요청했을 때 403을 반환한다. 
  • 404(리소스 찾지못함): 서버에 없는 리소스에 대한 요청을 보냈을 때 반환하는 코드이다. 가장 많이 반환되는 예는 서버에 지정되지 않은 URL에 요청을 보냈을 때이다.
  • 500(Internal Server Error): 서버가 클라이언트의 요청에 대해 제대로 처리하지 못했음을 의미한다. 
  • 502(Bad Gateway): 서버로 통신을 매개해주는 게이트웨이가 매개 대상인 서버로부터 잘못된 응답을 받았을 때를 의미한다. 예를 들어 로드밸런서가 실제 WAS로 요청을 프록시 할 때 WAS가 정상적인 상태가 아니거나 할 때 로드밸런서는 정상적인 응답을 받지 못했으므로 502 상태코드를 반환한다.
  • 504(Gateway TimeOut): 클라이언트의 요청에 대해 서버가 일정 시간 내에 처리하지 못했을 때 반환하는 상태코드이다. 일반적으로 서버가 스레드를 전부 사용하고 있거나 네트워크 문제로 지연이 발생했을 때 반환되는 코드이다.

결론

HTTP에 대한 내용은 방대하기 때문에 글 하나로 정리하기는 어렵다. 다만 위에 정리한 바와 같이 헤더, 상태코드에 대한 기본적인 이해는 웹 개발자로써 갖춰야할 부분이다. 

 

서두에서 "데이터가 없음"을 의미할 때 상태코드는 무엇일지 질문을 받았다고 했었는데 204란 상태코드가 있다. 해당 코드에 대한 설명은 No Content이다. 즉 200번대 이므로 서버는 정상적으로 요청을 처리했지만 다만 반환할 데이터가 없다는 의미인 것이다. 어떤 게 정답이다라는 것은 없지만 요청에 대해 어떤 상태코드를 반환할 것인지 개발할 때 세심히 고려해야 한다는 것을 느낄 수 있는 시간이었다. 

참고자료

https://ko.wikipedia.org/wiki/HTTP

 

HTTP - 위키백과, 우리 모두의 백과사전

위키백과, 우리 모두의 백과사전. HTTP(HyperText Transfer Protocol, 문화어: 초본문전송규약, 하이퍼본문전송규약)는 W3 상에서 정보를 주고받을 수 있는 프로토콜이다. 주로 HTML 문서를 주고받는 데에

ko.wikipedia.org

https://www.whatap.io/ko/blog/40/

 

HTTP 상태 코드 정리 | 와탭 블로그

HTTP 상태(응답) 코드 정리하기

www.whatap.io

https://techblog.yogiyo.co.kr/%EB%8D%B0%EC%9D%B4%ED%84%B0%EA%B0%80-%EC%97%86%EC%9D%84-%EB%95%8C-200%EC%9D%B8%EA%B0%80-404%EC%9D%B8%EA%B0%80-f1c8c39ca9df

 

데이터가 없을 때 200인가 404인가?

오류가 아닌데 왜 4xx로 반환하는 거예요?

techblog.yogiyo.co.kr

 

'Infra' 카테고리의 다른 글

springboot 배포 스크립트 이해  (1) 2023.12.22
모니터링 환경 구축(Spring actuator, Prometheus, Grafana)  (0) 2023.12.16
Auto scaling 작동원리  (1) 2023.11.30