HTTP 상태 코드 ?
클라이언트가 보낸 요청의 처리 상태를 응답으로 알려주는 기능을 의미하며 HTTP 응답 코드라고도 부른다.
개발자는 클라이언트가 오류의 원인을 정확하게 알 수 있도록 상황에 맞는 적절한 상태 코드를 알려줄 수 있어야 한다.
상태코드는 크게 100번대부터 500번대까지 5가지로 나뉜다.
1xx (informational) : 요청을 받았으며 작업을 계속한다.
2xx (Successful) : 클라이언트가 요청한 동작을 수신하여 이해했고 승낙했으며 성공적으로 처리했음 을 가리킨다.
3xx (Redirection) : 요청을 완료하려면 추가 행동이 필요하다.
4xx (Client Error) : 클라이언트 오류, 잘못된 문법 등으로 서버가 요청을 수행할 수 없다.
5xx (Server Error) : 서버가 유효한 요청을 명백하게 수행하지 못했음을 나타낸다. (서버 오류)
상태코드는 엄청나게 다양하다. 특히나 400번대 코드는 30가지가 넘는다..
완전히 상황에 100% 들어맞는 코드를 사용하면 더 좋겠지만 큰 맥락에서의 기능은 같기 때문에 하나하나 다 외우지는 않아도 무방하다. 오히려 너무 다채로운 상태 코드를 사용하면 일이 너무 복잡해질 수 있다.
(1) 100번대 코드
100번대 코드는 진행 중인 전송 상태에 대한 알림인데.. 거의 쓸모가 없다고 한다.
언제가 쓸모가 생길지는 모르지만 아무리 생각해봐도 당장은 사용처가 보이지 않는다.
1. 100 Continue : 지금까지 상태가 괜찮으며 클라이언트가 계속 요청해도 된다거나 이미 요청을 완료한 경우 무시해도 된다는 의미.
2. 101 Switching Protocol : 클라이언트가 보낸 요청 헤더에 응답이 들어가며 서버에서 프로토콜을 변경할 것임을 알림.
(2) 200번대 코드
1. 200 OK : 요청이 성공했음을 알린다. 당연히 성공의 의미는 HTTP 메서드에 따라 달라진다.
2. 201 Created : 요청에 성공해서 새로운 리소스가 생성되었음을 알린다. 단, 서버가 리소스 위치를 알고 있는 경우에만. (POST와 일부 특별한 경우의 PUT)
3. 202 Accepted : 요청이 접수되었으나 처리가 완료되지 않았음. 다른 프로세스에서 처리하는 경우, 혹은 서버가 해당 요청을 다루고 있거나 배치 프로세스를 하고 있는 경우를 위해 만들어졌다.
4. 204 No Content : 요청에 대해서 보내줄 수 있는 코드는 없으나 헤더는 클라이언트에게 의미 있을 수 있다. 대표적인 예시로는 문서 편집기 내 세이브 버튼. (편집 없이 해당 버튼을 눌러도 데이터는 아무것도 변하지 않는다.)
(3) 300번대 코드
* 300번대 공통 설명 : 리다이렉션(Redirection)이란 ?
>> HTTP에서 300번대 코드로 헤더에 Location: /URL을 입력해서 전송하면 브라우저는 응답을 받은 뒤 즉시 해당 URL을 사용하여 로드한다. 하단의 그림이 리다이렉션의 예시이다.
또한 리다이렉션은 영속적인 리다이렉션과 일시적인 리다이렉션으로 나뉜다.
300번대 코드는 코드 순서대로 분류하는 것이 아니라 영속적인 리다이렉션과 일시적 리다이렉션으로 분류하여 기술하였다.
1. 영속적인 리다이렉션 (301, 308 *사용 빈도 낮음)
> 이 리다이렉션은 영구적으로 지속됨을 의미한다. 원래의 URL은 더 이상 사용되지 않아야하며 무조건 새로운 URL을 사용해야함을 시사한다.
> 검색 엔진에서도 해당 URL이 더이상 사용되지 않는 URL임을 인지한다.
> 301 Moved Permeanently : 요청 메서드가 GET으로 변하고 본문이 제거될 수 있음. (명세는 메서드 제거를 허용할 의도가 없었으나 사실상 대다수의 개발자들이 본문을 제거하도록 하고 있기 때문에 제거될 확률이 크다.)
> 308 Permanent Redirect : 301과 기능은 완전히 같으나 본문과 요청 메서드는 유지된다.
> 예를 들어 어떤 유저가 정보를 입력하고 사이트에 접속을 요청했으나 301 상태 응답을 받아 리다이렉트될 경우 유저는 작성한 내용을 잃게 되지만 308의 경우 작성한 내용을 서버에게 다시 보내준다.
> 사실 URL이 변경되었을 경우 내부 코드도 다 바뀌었을 확률이 크기 때문에 일반적으로 301로 처리할 수 밖에 없다.
2. 일시적인 리다이렉션 (302, 307, 303)
> 종종 요청된 리소스를 요청한 위치에서 접근할 수 있고 다른 위치에서만 접근 가능한 경우가 있다. 이런 경우 일시적 리다이렉트가 사용될 수 있다.
> 검색 엔진은 이런 일시적인 링크를 기억하지 않는다.
> 302 Found : 리다이렉트 시 요청 메서드가 GET으로 변하고 본문이 삭제될 수 있다. (301과 같은 이유로 본문이 삭제될 확률이 높다.)
> 307 Temporary Redirect : 302와 기능은 같으나 요청 메서드와 본문을 유지한다. 308을 거의 사용하지 않는 것과 같은 이유로 302를 더 많이 사용한다.
> 303 See Other : 302와 기능이 같고 메서드를 GET으로 변경시킨다.
> 300번대 리다이렉션은 동작을 다시 촉발시키는 페이지 리프레시를 막기 위해 PUT 혹은 POST 뒤에 많이 사용된다.
예시 1) 300번대 리다이렉션 미사용 시
사용자가 상품을 주문하여 POST 요청을 받고 200을 응답했다. 그런데 사용자가 그 상태에서 그대로 새로고침을 했고 POST 요청이 다시 전송되어 결제가 두 번 되어버렸다.
예시 2) 300번대 리다이렉션 사용 시
사용자가 상품을 주문하여 POST 요청을 받고 302를 응답하며 헤더에 결제 페이지가 아닌 다른 페이지로 리다이렉션 시켰다. 사용자가 그 상태에서 새로고침을 했지만 메서드가 GET으로 변경됐기 때문에 아무런 일도 생기지 않았다.
> 서버상에서 막을 수 있지만 불안 요소를 없엘 수 있고 유저 입장에서도 경고문이나 다른 안내를 받는 것보다 훨씬 깔끔하개 해결된다.
3. 특수 리다이렉션
> 300 Multiple Choice : 요청에 가능한 응답이 두 개 이상 있을 시 유저에게 선택권을 주는 기능이라고 한다. 응답 중 하나를 선택하는 표준화된 방법이 없기 때문에 이 응답 코드는 실질적으로 사용되지 않는다.
> 304 Not Modified : 클라이언트의 브라우저에 캐시가 저장되어 있고 서버에 있는 리소스와 같은 데이터일 경우 리소스가 수정되지 않았음을 알려주는 상태 코드이다. 304 응답은 데이터를 전송하지 않기 때문에 바디를 포함하면 안된다.
예시 ) 내가 어떤 페이지에 접속했다가 다음 날 다시 접속하면 내 브라우저에는 해당 브라우저의 리소스가 이미 캐시로 등록되어 있기 때문에 클라이언트가 데이터를 요청하면 304 Not Modified를 응답하고 해당 응답을 받은 브라우저는 저장된 캐시를 재사용한다.
(4) 400번대 코드
400번대 코드의 공통점은 오류 원인이 클라이언트에 있다는 것이다.
애초에 요청을 보내는 쪽이 잘못된 요청을 보내고 있거나, 데이터를 전송하고 있기 때문에 몇 번을 시도해도 실패한다.
1. 400 Bad Request
> 클라이언트가 잘못된 요청을 해서 서버가 요청을 처리할 수 없음.
> 요청 구문, 메시지 등의 오류로 클라이언트가 요청 내용을 다시 검토하고 보내야함을 시사함.
> rquest parameter나 API 스펙이 맞지 않을 때 이런 에러 코드를 만날 수 있다.
2. 401 Unauthorized
> 어이 없게도 당당하게 "미승인/미인가 (Unauthorized)"라는 단어를 사용하며 권한에 관련된 코드인 것 같지만 이 응답은 미인증(Unauthorized)을 의미한다.
> 클라이언트가 해당 리소스에 대한 인증이 필요하다.
3. 403 Forbidden
> 클라이언트가 콘텐츠에 접근할 권리를 가지고 있지 않음을 시사한다. 401과 다른 점은 서버는 클라이언트가 누구인지 알고 있다.
> 인증 자격 증명은 있으나 접근 권한이 불충분한 경우.
> ex) 일반 사용자가 어드민 페이지에 접근할 경우
4. 404 Not Found
> 서버가 요청받은 리소스를 찾을 수 없다.
> 혹은 서버들은 인증받지 않은 클라이언트로부터 리소스 존재 자체를 숨기기 위하여 이 응답을 403 대신에 전송할 수 있다.
*TMI : 이 응답 코드는 웹에서 반복적으로 발생하기 때문에 가장 유명할 수도 있다. (Mozila 피셜)
(5) 500번대 코드
500번대 코드의 공통점은 서버 오류라는 것이며, 서버의 문제이기 때문에 유저가 계속해서 시도하면 성공할 확률이 있다는 점이다.
500번대 에러는 반드시 서버에 문제가 있을 경우에만 응답해야 하며, 다른 에러를 처리하는 것에 500번대 에러를 응답해서는 안된다.
1. 500 Internet Server Error
> 가장 포괄적인 에러로써 그냥 서버에 문제가 있다는 뜻이다.
> 사실 네트워크 에러는 미리 예측하고 대비할 수 있는 상황이 거의 없기 때문에 일반적으로 이 응답을 보내게 된다.
2. 503 Service Unavailable
> 서버가 유지보수 혹은 과부하로 인해 작동이 중단된 상태이다.
> 이 응답과 함께 문제를 설명하는 사용자 친화적 페이지를 전송할 것을 권장하고 있다.
> 이 응답은 임시 조건에 사용되어야 하며 Retry-After:로 헤더에 복구 전 예상 시간을 포함할 수 있다.
'CS ﹒ Algorithm > (구)Network' 카테고리의 다른 글
네트워크 (7) HTTP 헤더 - 2 - 쿠키와 캐시 (0) | 2022.07.26 |
---|---|
네트워크 (6) HTTP 헤더 - 1 - 종류와 사용 (0) | 2022.07.22 |
네트워크 (4) HTTP 메서드의 종류와 속성 (0) | 2022.07.12 |
네트워크 (3) HTTP의 개요와 특징 (0) | 2022.07.10 |
네트워크 (2) URI, URL, URN은 각각 무엇이고 어떤 차이가 있는가 (0) | 2022.07.07 |