본문 바로가기

CS/네트워크

HTTP 상태 코드

반응형

이번 글은 자주 만나게 되는 HTTP 상태 코드의 종류와 의미에 대해 정리해 보려고 합니다. 개발을 하다 보면 자주 보는 에러 코드들이지만 막상 "너 401이랑 403" 차이점이 뭐야?"라고 물어보면  대답하기 쉽지 않더라고요 가오가 좀 상하니까 이번 기회에 정리해 보려고 합니다.

 

HTTP 상태 코드의 종류에 대해 정리하기 전에 HTTP 상태 코드에 대해 간략하게 정리하자면 서버에 HTTP(HTTPS)  요청을 보내면 응답을 받게 되는데 이때 이 응답의 "쌍태"를 나타내는 것이 HTTP 상태 코드입니다. 

 

상태 코드는 크게 5개의 클래스로 분류됩니다.

1xx 정보 요청을 받았으며 프로세스를 계속한다.
2xx 성공 요청을 성공적으로 받았으며 인식했고 수용했다. 
3xx 리다이랙션 요청 완료를 위해 초가 작업 조치가 필요하다.
4xx 클라이언트 오류 요청의 문법이 잘못 되었거나 요청을 처리할 수 없다.
5xx 서버오류 서버가 명백히 유효한 요청에 대해 충족을 실패했다. 

이제 각각의 클래스 별 상태 코드의 종류와 의미에 대해 정리해보겠습니다.

 

1xx 

1xx 유형의 상태 코드는 쉽게 말해서 "니가 보낸 요청을 완료하지는 않았어 그니까 좀만 기달려줄래?" 라는 의미로 생각하면 될것 같습니다. 

100 계속 요청을 현재 진행중이고 현재까지 진행상태에 문제가 없음을 알려줌.

100 Continue
101 프로토콜 전환 HTTP 1.1(전용)

Upgrade 헤더를 사용하여 이미 설정된 클라이언트/ 서버 연결을 다른 프로토콜로 업그레이드 요청 한 경우에 대한 응답으로 보내짐.

예를 들어 HTTP 1.1에서 HTTP 2.0로, HTTP 또는 HTTPS 연결을 WebSockt으로 업그레이드 하는 경우를 Upgrade 요청 헤더를 사용하는 경우이다.

101 Switching Protocal

 

2xx 

2xx 유형의 상태 코드는  "요청에 대한 성공" 을 의미합니다.

200 성공 서버가 요청을 제대로 처리했음

200 OK
201 작성됨 요청이 성공적으로 처리되어서 "리소스"가 만들어 졌음.

여기서 말하는 "리소스"에 대해 간단히 설명하자면(저는 저게 뭔지 헷갈렸어요)
예를 들어 POST나 PUT으로 게시물을 작성하는 경우에 데이터를 서버에 생성하는
경우 작업이 성공했을때 201 상태코드를 받습니다.

201 Created
202 허용됨 서버가 요청을 접수했지만 아직 처리하지 않았음.

202 Accepted
203 신뢰할수 없는 정보 서버가 요청을 성공적으로 처리했지만 다른 소스에서 수신된 정보를 제공하고있다.(...?)

밑줄친 부분의 말이 저는 한번에 이해되지 않았었습니다. 

203 상태코드에 대해 추가적으로 설명을 하기 위해서는 "프록시 서버"에 대한 개념이 있어야 하는데 간단히 말해서 프록시 서버란 "클라이언트와 원본서버 사이의 중간자"라고 할 수 있습니다. 

203 상태 코드는 프록시 서버에서 데이터의 형식을 변환하거나 html 본문에 무언가를 추가할 경우 응답받으며 클라이언트에게 "변경"되었음을 알리는 역할을 합니다. 

하지만 이경우 기존의 상태 코드를 확인 할 수 없는 문제가 발생하기 때문에 warning 헤더를 사용하는 것을 권하고 있습니다. 

203 Non-Authoritative Information

* warning header 예시 : Warning : 213 proxy.test.org "we change the response ..hh"
204 콘텐츠 없음 서버가 요청을 성공적으로 처리했지만 콘텐츠를 제공하지는 않는다.

204 No Content
205 콘텐츠 재설정 서버가 요청을 성공적으로 처리했지만 콘텐츠를 표시하지 않고 이 요청을 보낸 문서를 재설정할 것을 요구한다.

쉽게 말해서 페이지 reload해 라는 의미입니다.

205 Reset Content

 

3xx 

3xx 유형의 상태코드는  "리다이렉션"을 의미합니다.

즉, 클라이언트의 요청에 대해 원하는 리소스가 다른 위치에 있다는 것을 전달하거나 해당 리소스의 대안 응답을 제공하는 경우 3xx의 상태 코드를 받습니다.

300 여러 선택항목 클라이언트가 동시에 여러 리소스를 가리키는 URL을 요청한 경우 그 리소스의 목록과 함께 반환되는 상태

300 Multiple Choices
301 영구 이동 요청한 페이지를 새 위치로 영구적으로 영구적으로 이동함.
"Location" 헤더에 현재 리소스가 존재하고 있는 URL을 포함해야한다.

301 Moved Permanently
302 임시 이동 현재 서버가 다른 위치의 페이지로 요청에 응답하고 있지만 요청자는 이후에 요청 시 원래 위치를 계속 사용해야한다.

302 Found
303 기타 위치 보기 클라이언트에게 리소스를 다른 URL에서 가져올 것을 말하고자 할때 사용되는 상태 
"Location"헤더에 현재 리소스가 존재하고 있는 URL을 포함해야 함.
"303 상태코드"의 주 목적은 POST 요청에 대한 응답이며 GET 요청으로 리다이렉트 시킨다. 

303 See Other

 

4xx 

4xx 유형의 상태 코드는  "클라이언트 잘못(오류)"을 의미합니다.

개발을 하면서 가장 많이 접했을 오류의 목록들은 대부분 4xx 오류 중 하나였던 것 같습니다. 

400 잘못된 요청 서버가 요청의 구문(문법)에 오류가 있음을 알려줌

400 Bad Request
401 권한 없음 인증이 되지 않은 클라이어트에게 인증을 요구하기 위한 상태
로그인 정보가 필요하거나 API 인증키를 미입력 했을 경우 많이 발생하는 에러

401 Unauthorized
402 결제 필요 해당 요청은 결제가 필요함

402 Payment Required
403 금지됨 서버가 요청을 거부하고 있는 상황.
인증은 되었으나 허가되지 않은 게시물에 접근하고자 할 때 발생할 수 있음.

401과 403의 상태코드의 차이점에 정리하려고 합니다. (제가 많이 헷갈렸거든요..ㅎㅎ)
상황을 가정하고 두 개의 코드의 차이점을 비교하면 이해가 잘되는 것 같습니다

예를 들어, 로그인도 안했는데 "마이페이지"에 들어가려고 하면 401 상태코드를 로그인한 상태에서 "다른사람의" 마이페이지를 들어가려고 하면 403 상태코드를 받습니다. 

즉, 401은 "인증 실패" 403"은 "인가 실패" 라는 차이점이 있다.

403 Forbidden
404 찾을 수 없음 서버가 요청한 페이지를 찾을 수 없음. 
존재하지 않는 URL을 요청하는 경우 해당 상태코드를 받습니다.(가장많이 받아본 상태코드 였던것 같습니다)

404 Not Found
405 허용되지 않은 메서드 요청한 URL에 대해 지원하지 않은 메서드의 요청을 받았을때 사용하는 상태
쉽게 말해 POST요청으로 보내야하는데 GET을 보내는 경우가 대표적.

405 Method Not Allowed
406 허용되지 않음 요청한 페이지가 요청한 콘텐츠 특성으로 응답할 수 없음.

이번에도 상황을 설정하고 406 상태코드에 대해 이해해 봐야 할 것 같습니다.

 HTTP 헤더에는 Accept, Content-Type 비슷하지만 다른 역할을 하는 두개의 헤더가 포함되어 있습니다. 

    1. Accept : 클라이언트에서 웹서버로 요청시 요청메세지에 담기는 헤더로써 선      언한 타입만 허용하겠다는 의미

    2. Content-type : 데이터를 전송하는 쪽에서 데이터 형식을 알려주는 헤더

간단히 말해 Accept는 "난 이것만 받을거야!" , Content-Type 은 "내가 주는 데이터 형식으 이거니까 참고해!" 라는 의미입니다. 

406 에러가 발생하는 이유는 Accept에 지정되지 않은 데이터 형식이 Content-Type  에 담겨 있을때 발생합니다. 

예를 들어 Accept 를 application/json 만 선언 했는데 다른 Content-Type 내에 application/json 이외에 다른 데이터 타입으로 응답하게 되면 406 에러가 발생하게 되는 거죠.

406 Not Acceptable
408 요청 시간초과 서버의 요청 대기가 시간을 초과함.

408 Request Timeout

 

5xx 

5xx 유형의 상태코드는  "서버 잘못(오류)" 을 의미합니다.

요청한 클라이언트는 잘못이 없지만 요청을 받은 서버 내부에서 오류가 있을 때 발생하는 상태 코드입니다.

 

500 내부 서버 오류 서버에 오류가 발생하여 요청을 수행할 수 없는 경우.

500 Internal Server Error
501 구현되지 않음 서버에 요청을 수행할 수 있는 기능이 없는 경우. 
예를 들어 서버가 지원하지 않는 메서드로 요청하는 경우에 해당

501 Not Implemented
502 불량 게이트 웨이 프록시나 게이트웨이로부터 잘못된 응답을 받았을때 사용되는 상태

간단히 말하자면 원본 서버가 아닌 프록시 서버로부터 잘못된 응답을 받은 경우에 사용되는 상태 입니다.

502 Bad Gateway
503 서비스를 사용할 수 없음. 현재 서버에서 요청을 처리해 줄 수 없는 상태(서버가 일시적으로 다운되는 경우에 해당됨)

503 Service Unavailable
505 HTTP 버전이 지원되지 않음. 서버가 요청에 사용된 HTTP 프로토콜 버전을 지원하지 않음.

505 HTTP Version Not Supported

 

 

이상으로 HTTP 상태 코드에 대해 간략하게 정리해 보았습니다. 상태 코드는 정리한 내용 이외에 더 많이 있지만 이번 글에서는 자주 등장하고 중요하다고 판단되는 것들만 정리해보았습니다. ㅎㅎ (너무 많아요..)

 

잘못되었거나 내용에 수정이 필요한 부분들은 댓글을 통해 알려주시면 감사드리겠습니다!!

반응형

'CS > 네트워크' 카테고리의 다른 글

[Network] 프로토콜 계층(2)  (0) 2022.10.09
[Network] 프로토콜 계층(1)  (0) 2022.10.02
HTTP/1.1 과 HTTP/2 의 차이점  (0) 2022.03.06
GET 과 POST의 차이  (2) 2022.01.13
IP, Gateway,Subnet 이란?  (0) 2022.01.04