티스토리 뷰

반응형

팀원들과 세미나를 진행하던 중, NodeJS로 서버를 구축 한 이후, HTTP로 쿼리, 응답을 받는 과정 중 "일단 404, 200으로만 상태 코드를 반환하자."는 말이 있었다.

 

사실 자주 쓰이는 404 Not Found, 400 Bad Request, 200 OK등등 자주 사용하는 상태코드는 외우고 있지만, 이 밖에 상태 코드는 찾아봐야 할 정도로 모르기 때문에, 한 번 정리해야겠다는 차원으로 이 포스팅을 작성하게 되었다.

 

HTTP Status Code를 하나하나 살펴보자.

 

HTTP Status Code에 대하여 알아보자.


1. HTTP Status Code

HTTP는 기본적으로 stateless 하기에 이전 요청과 상관없이 새 요청마다 새로운 응답을 받는다. 따라서, 각 요청마다 잘 되었는지, 어떤 상태인지 알려주는 약속이 대두되었고, 이는 HTTP status code 당위성의 근거가 되었다. 

 

상태 코드는 정해져 있지만, 서버와 클라이언트 간의 어떤 응답을 받았을 때 어떤 행동을 취할 지는 사용자 마음이다. 200 OK를 받았으면 거기서 통신을 종료할 것인지, 계속해서 다음 행동을 이어나아 갈 지를 결정할 수 있다는 이야기이다.

 

상태 코드는 3자리 숫자로 이루어져 있으며, 첫 번째 자리는 1~5이고, 뒤 두 자리는 구체적인 상태 두 자리를 의미한다. 첫 번째 자리가 4, 5인 경우 오류이므로 이에 대한 조치를 취해야 한다. 다섯 가지의 일반적인 의미는 다음과 같다.

 

1. 1XX : 요청을 정상적으로 받았다는 의미이다.

2. 2XX : 요청을 정상적으로 받았고, 이에 대한 처리를 완료했다는 의미이다.

3. 3XX : 요청을 끝내기 위해 추가적인 조치가 필요하다는 의미이다.

4. 4XX : 요청을 잘못 보냈거나 요청을 처리할 수 없다는 의미이다. (클라이언트 측의 오류)

5. 5XX : 요청을 수행하지 못하였다는 의미이다. (서버 측의 오류)

 

각 카테고리에는 이와 관련된 정보를 지니고 있다. 하나씩 살펴보자. 다만, 특수 환경(WebDAV)에서만 사용되는 경우와 자주 사용되지 않는 코드일 경우 이 포스팅에서 제외하였다.


2. 1XX : Informative Response

1XX는 요청이 받아들여졌다는 의미이다. 현재 HTTP/1.0 버젼 이상부터는 정의되지 않아 사용하지 않는 코드이며, 예외적인 상황 혹은 실험 환경에서만 사용하는 코드이다. 

 

100 : Continue

100 응답 코드는 임시 응답으로, 현재까지의 상태가 괜찮으며 클라이언트가 다시 요청을 하거나 요청이 완료된 경우 무시해도 된다는 의미이다.

 

101 : Switching Portocol

101 응답 코드는 서버에게 프로토콜을 변경하고, 서버가 이를 승인한 경우 받을 수 있는 응답 코드이다.


3. 2XX : Success

2XX는 서버가 요청이 받아들여졌다는 의미이다. 이에 응답의 종류에 따라 여러 응답으로 나눌 수 있다.

 

200 : OK

200 응답 코드는 HTTP 요청이 무사히 완료되었다는 의미이다. 만약 GET 요청일 경우 해당 엔티티를 포함하였다는 것이고, POST 요청일 경우 해당 요청의 결과나 이를 포함한 엔티티를 포함하였다는 의미이다.

 

201 : Created

201 응답 코드는 서버가 새로운 리소스를 생성했다는 의미이다. 200 OK와 맥락이 비슷하지만, 새로운 리소스가 생겼다는 의미가 추가되었다.

 

202 : Accepted

202 응답 코드는 서버가 응답을 받아들였지만, 서버가 아직 요청을 완료하진 못했다는 의미이다. 이는 비동기와 관련되어 자주 사용되는 응답 코드로, 나중에 성공이나 실패 여부를 알려주겠다는 의미를 포함하고 있다. 따라서, 클라이언트 측은 콜백을 사용하거나, 폴링 방식으로 성공 혹은 실패 여부를 알아야 한다. 이는 서버가 두 방식 중 적어도 하나를 지원해야 한다는 의미이다. (둘 다 있으면 금상첨화다.)

 

203 : Non-Authoritative Information

203 응답 코드는 서버가 200 OK를 반환했지만, 중간에서 이에 대한 응답을 변형하였으면 중간 서버가 203 응답을 반환한다. 따라서, 신뢰할 수 없는 정보라는 의미이다. 주로 프록시 서버나, 미들웨어가 사용되는 구조에서 받을 수 있는 응답 코드이다. 보통 200 OK 응답코드가 우선순위가 높기에 자주 볼 수는 없다.

 

204 : No Content

204 응답 코드는 서버가 응답을 받아들였고, 반환할 것이 없는 경우에 사용되는 응답 코드이다. 정확히, body가 아예 없다는 의미이다. 예를 들면, DELETE 요청의 경우 리소스의 내용이 삭제되어 반환할 내용이 없다. 혹은 PUT이나 PATCH로 요청을 보냈지만, 기존의 것과 같이 수정할 내용이 없을 경우 204를 반환할 수 있다. 따라서, 이 응답 코드는 결과만 중요한 요청에서 주로 사용한다.

 

205 : Reset Content

205 응답 코드는 서버가 요청을 처리했지만, 이에 반환된 컨텐츠를 표시하진 않는다. 204 No Content와 달리 이 응답은 보기 관련 항목을 재설정하도록 한다. 응답 코드 내용에서 유추할 수 있듯이 안의 내용을 재설정해야할 경우에 사용된다.

 

206 : Partial Content

206 응답 코드는 서버가 요청을 처리했지만, 리소스의 일부만 반환하는 경우이다. 보통 분할된 파일을 요청하거나, 중단된 다운로드 재개 등 리소스의 일부만이 필요할 때 사용할 수 있는 응답 코드이다.


4. 3XX : Redirection

3XX는 요청이 완전히 완료되지 않아, 클라이언트 측에서 추가적인 행동을 취해야할 때 사용하는 응답코드이다. 보통 URL 리디렉션에서 자주 사용된다.

 

300 : Multiple Choices

300 응답 코드는 요청에 대하여 여러 개의 응답이 가능한 경우이다. 따라서 클라이언트는 응답들 중 하나를 선택해야한다. 선택에 대한 표준은 아직 갖춰지지 않았다. 예를 들면, 요청한 동영상의 확장자나 파일 확장자를 선택할 수 있는 경우에 사용할 수 있다.

 

301 : Moved Permanently

301 응답 코드는 요청한 리소스의 URI가 영구적으로 변경된 경우이다. 따라서, 클라이언트는 응답에 포함된 URI로 새로운 요청을 보낼 수 있다. 보통 응답 안에 새로운 URL이 있고, 브라우저는 이 URL로 리디렉션을 수행하고, 검색 엔진은 링크를 갱신한다.

 

302 : Found

302 응답 코드는 요청한 리소스의 URI가 임시로 변경된 경우이다. 따라서, 클라이언트는 응답에 포함된 URI로 새로운 요청을 보낼 수 있다. 응답 안에 새로운 URL이 있고, 브라우저는 이 URL로 리디렉션을 수행하지만, 검색 엔진은 임시로 URL이 변경된 경우이기에 링크를 갱신하지 않는다.

 

303 : See Other

303 응답 코드는 요청한 리소스가 GET 요청을 통해 다른 URI에서 얻어야 한다는 응답이다. 302와 다르게, 리디렉션 URI에서 GET을 명시적으로 써야한다는 의미를 담고 있다.

 

304 : Not Modified

304 응답 코드는 요청한 리소스가 마지막으로 요청한 이후 변동된 사항이 없으니, 로컬 캐시에서 찾으라는 의미이다. 3XX에는 안맞는 의미를 지니고 있다고 생각한다.

 

305 : Use Proxy

305 응답 코드는 요청한 리소스를 얻기 위해선 프록시 서버를 써야한다는 응답이다. 따라서, 클라이언트는 프록시를 거쳐 요청을 다시 보내야한다. 이 경우, 보안 문제로 인하여 몇몇 클라이언트 혹은 브라우저(ex. 파이어폭스, IE...)는 이를 지키지 않는다. 현재는 사용 중지된 응답 코드이다.

 

306 : Switch Proxy(Unused)

306 응답 코드는 더 이상 사용되지 않는다.

 

307 : Temporary Redirect

307 응답 코드는 요청한 리소스의 URI가 임시로 변경된 경우이다. 302 Found와 같은 의미를 지니고 있지만, 클라이언트가 요청의 종류를 바꾸지 않아야 한다는 점이 다르다. 만약, 처음 요청에서 POST 방법을 사용하였다면, 다음 요청에도 POST를 사용하여야 한다.

 

308 : Permanent Redirect

308 응답 코드는 요청한 리소스의 URI가 영구적으로 변경된 경우이다. 301 Moved Permanently과 같은 의미를 지니고 있지만, 클라이언트가 요청의 종류를 바꾸지 않아야 한다는 점이 다르다. 만약, 처음 요청에서 POST 방법을 사용하였다면, 다음 요청에도 POST를 사용하여야 한다.


 

5. 4XX : Client Errors

4XX는 클라이언트로 인하여 발생한 오류로 인하여 서버가 해당 요청을 제대로 수행하지 못했다는 응답 코드이다. 브라우저 혹은 클라이언트단에서 응답 코드의 종류로 원인을 파악할 수 있다.

 

400 : Bad Request

400 응답 코드는 클라이언트 측의 요청이 유효하지 않아 서버가 처리하지 못했을 때의 응답 코드이다. 서버는 요청이 들어올 시, 요청이 유효한지 검사를 하고, 올바르면 수행을 하고 올바르지 않으면 400을 응답한다. (만약 이를 안할 시 5XX관련 오류가 날 수 있어 클라이언트 측 오류인지, 서버 측 오류인지 판단하지 못하게 된다.) 400 안에는 어떻게 요청해야 하는지에 대한 내용을 실어 보낼 수 있다.(센스 있는 백엔드 개발자라면...)

 

401 : Unauthorized

401 응답 코드는 클라이언트가 미인증된 사용자일 경우 받을 수 있는 응답 코드이다. 사실, 이름이 잘못되었다고 생각하는게 권한(authorization)의 문제가 아니라 인증(authentication)의 문제이기에 사실상 401 Unauthenticated가 더 정확한 의미를 지닌다. 권한이 없는 경우 밑에 403 Forbidden을 사용해야 한다.

 

403 : Forbidden

403 응답 코드는 클라이언트가 권한이 없는 사용자일 경우 받을 수 있는 응답 코드이다. 401 Unauthorized와 혼동될 수 있는 개념이나, 403은 권한의 측면에서 발생하는 오류이다.

 

404 : Not Found

404 응답 코드는 클라이언트가 요청한 리소스를 찾을 수 없다는 응답 코드이다. 존재하지 않는 자원을 요청하였을 때 받을 수 있다. URI도 결국은 자원이기에 만약 경로가 없어도 404 응답 코드를 받을 수 있다.

 

405 : Method Not Allowed

405 응답 코드는 서버가 막은 메서드로 클라이언트가 요청하였을 때의 응답코드이다. 즉, URI는 존재하지만 지원하지 않는 메서드이거나 막은 메서드일 경우이다. 예를 들면, 서버가 DELETE 나 PUT을 막았을 경우, 해당 요청을 보냈을 때 405 응답 코드를 받을 수 있다. 응답에서 가능한 메서드의 종류를 알 수 있다.

 

408 : Request Timeout

408 응답 코드는 서버가 클라이언트를 기다려 주지 않고 연결을 종료하겠다는 의미이다. 즉, 서버가 대기하는 시간보다 요청 시간이 길 때 발생한다. 클라이언트 측은 이후에 연결을 다시 요청할 수 있다.

 

429 : Too Many Requests

429 응답 코드는 클라이언트 측이 일정 시간 내에 너무 많은 요청을 하였을 때 서버에서 이를 거부할 때 사용하는 응답 코드이다. 주로 제한 시간내에 API 요청을 너무 많이 하여 임시적인 차단을 할 때 사용할 수 있는 코드이다.


6. 5XX : Server Errors

5XX는 서버 측에서 오류가 발생하여 응답을 수행할 수 없다는 의미이다. 이 경우 요청의 유효성은 검사하지 못한다.

 

500 : Internal Server Error

500 응답 코드는 서버 내에서 오류가 발생하여 요청을 수행하지 못하였을 때 사용된다. 각종 에러로 인하여 비정상적으로 종료되는 경우 이 응답을 받을 수 있다. 이러한 상황은 발생해선 안되며, 서버 단에서는 각종 예외 처리를 철저히 하여 이 코드가 생겨서는 안 되는 상황이어야 한다.

 

502 : Bad Gateway

502 응답 코드는 서버가 요청 처리를 하기 위해 게이트웨이로 작업하는 중 잘못된 응답을 받았을 때의 응답 코드이다. 서버가 게이트웨이, 프록시 역할을 하며 유효하지 않은 응답을 받았을 때 받을 수 있는 응답이다. 프로토콜에 문제가 있거나, 잘못된 프로토콜에 연결할 때 발생하므로 서버 내부에 충돌같은 것이 있는지 검사해야한다.

 

503 : Service Unavailable

503 응답 코드는 서버가 일시적으로 문제가 생겨 요청을 수행할 수 없을 때 발생하는 응답 코드이다. 보통 서버를 작동 중단하거나, 과부하로 인하여 서버가 정상적인 작동을 안할 때 자주 발생한다. 

 

504 : Gateway Timeout

504 응답 코드는 서버가 요청 처리를 하기 위해 게이트웨이로 작업하는 중 응답을 받지 못하였을 때의 응답 코드이다. 서버가 게이트웨어 혹은 프록시 역할을 하며 필요한 응답을 받지 못하였을 때 받을 수 있는 응답이다.


이상으로 자주 볼 수 있는 HTTP 응답 코드이다. 만약 더 많은 코드와 정확한 정보를 보고싶다면, 이 링크를 참고하여 더 많은 응답 코드를 볼 수 있다. 이후에도 응답 코드가 추가되거나 수정되면, 이 포스팅에서 새로 추가하거나 수정하겠다.

반응형

'Network' 카테고리의 다른 글

[Network] DNS(Domain Name Service)에 관한 모든 것  (0) 2022.09.22
댓글
Total
Today
Yesterday
공지사항
최근에 올라온 글
최근에 달린 댓글
링크
«   2024/05   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
글 보관함