이번엔 HTTP 상태코드에 대해서 알아보려고 한다.
HTTP 상태코드란?
클라이언트가 보낸 요청의 처리 상태를 응답에서 알려주는 기능이다.
100번대 ~ 500번대에 대한 상태코드가 정의 되어있고 그 내용들을 살펴볼 예정이다.
1xx (Informational) - 요청이 수신되어서 처리 중인 상태
100번대의 상태코드는 거의 사용되지 않기에 개념만 알아두면 될 것 같다.
2xx (Successful) - 요청이 정상 처리된 상태
종류로는 다음과 같다.
200 OK
가장 많이 볼 수 있는 상태코드이다.
요청이 성공적으로 처리됬을 때의 상태이다.
HTTP/1.1 200 OK
Content-Type: appplication/json
Content-Length: 34
{
"username":"GG_BB",
"age":20
}
201 Created
요청에 성공하여 새로운 리소스가 생성된 상태이다.
생성된 리소스는 응답의 Location 헤더 필드로 식별이 가능하다.
HTTP/1.1 201 OK
Content-Type: appplication/json
Content-Length: 34
Location: /memebers/100
{
"username":"GG_BB",
"age":20
}
202 Accepted
요청이 접수가 되었으나 처리가 완료되지 않은 상태이다.
잘 사용되지는 않는다.
ex) 요청 접수 후 1시간 후의 처리를 원하는 상황 등
204 No Content
서버가 요청을 성공적으로 수행했지만, 응답 페이로드 본문에 보낼 데이터가 없는 상태이다.
ex) 웹 편집기를 통해서 저장만을 수행할 때 (저장 후 편집을 이어나갈 때)
3xx (Redirection) - 요청을 완료하려면 추가적인 행동이 필요한 상태에 쓰인다.
*** 리다이렉션이란?
요청을 보냈을 때 서버가 다른 페이지로 자동으로 연결해주는 것
GET /event HTTP/1.1
Host: localhost:8080
위와 같이 요청을 보냈을 때, 위 주소가 이전에 사용하던 주소라면 자동으로 연결해줘야 할 것이다.
GET /event HTTP/1.1
Host: localhost:8080
그렇다면 서버에서는 다음과 같이 새로운 주소로 리다이렉션 할 수 있게 주소를 전달해주게된다.
GET /new-event HTTP/1.1
Host: localhost:8080
클라이언트에서는 해당 주소로 자동으로 리다이렉트 되며 요청을 하게 된다.
HTTP/1.1 200 OK
그렇게 되면 위와같은 응답을 받을 수 있게 된다.
***
300번대의 리다이렉션은 영구 리다이렉션과 일시 리다이렉션 그리고 특수 리다이렉션으로 나뉘는데,
각 리다이렉션에 해당되는 상태코드를 살펴보자.
영구 리다이렉션 - 특정 리소스의 URI가 영구적으로 이동하였을 때
원래의 URI를 사용하지 않고, 검색 엔진 등에서도 이 변경을 인지한다.
종류로는 다음과 같다.
301 Moved Permanently
리다이렉트를 요청 했을 때 메서드가 GET으로 변하고, 본문이 제거될 수 있다.
먼저 다음과 같이 요청을 보냈다고 가정하자.
POST /event HTTP/1.1
Host: localhost:8080
name=hello&age=20
그러면 페이지가 이동하였기에 301을 통해 리다이렉트 응답을 보내주게 된다.
HTTP/1.1 301 Moved Permanently Location: /new-event
클라이언트는 리다이렉트 되며 해당 페이지로 이동하게되지만, 우리가 입력했던 자료는 사라지게 된다.
GET /new-event HTTP/1.1 Host: localhost:8080
308 Permanent Redirect
리다이렉트를 요청 했을 때 메서드가 POST로 변하고, 본문이 유지된다.
먼저 이번에도 다음과 같이 요청을 보냈다고 가정하자.
POST /event HTTP/1.1
Host: localhost:8080
name=GG_BB&age=20
그러면 페이지가 이동하였기에 308을 통해 리다이렉트 응답을 보내주게 된다.
HTTP/1.1 308 Permanent Redirect
Location: /new-event
클라이언트는 리다이렉트 되며 해당 페이지로 이동하게되고, 우리가 입력했던 자료는 그대로 존재하게 된다.
POST /new-event HTTP/1.1
Host: localhost:8080
name=GG_BB&age=20
*** 페이지가 바뀔 때 요청되는 입력 폼도 달라질 가능성이 크기 때문에 주로 301이 사용된다. ***
일시 리다이렉션 - 일시적인 변경으로 인해 이동 시킬 때
검색엔진 등에서 URL을 영구적으로 변경하면 안될 때 사용된다.
어떤 상태코드가 있는지 살펴보자.
302 Found
리다이렉트시 요청 메서드가 GET으로 변하고, 본문이 제거될 수 있다.
303 See Other
리다이렉트시 요청 메서드가 GET으로 변경된다.
307 Temporary Redirect
리다이렉트시 요청 메서드와 본문을 유지한다.
Post를 통해서 요청을 하고 웹 브라우저를 새로고침하게 된다면 중복으로 요청이 보내질 수도 있게된다.
⇒ 이를 해결하기위해 PRG를 사용하게된다.
*** PRG (Post/Redirect/Get)
Post로 요청 후에 새로고침으로 인한 중복 요청을 방지한다.
상황을 예로 들어보겠다.
POST /order HTTP/1.1
Host: localhost:80
itemId=mouse&count=1
위와 같이 마우스 1개를 주문하기 위해서 요청을 보낸다.
HTTP/1.1 302 Found
Location: /order-result/19
서버에서는 주문이 완료되며, 302를 통해 본문이 제거된 GET 리다이렉트를 보내게된다.
그리고 만약 이 상황에서 클라이언트가 새로고침을 눌러 다시 요청을 보내게된 상황이다.
GET /order-result HTTP/1.1
Host: localhost:8080
주문 결과 화면을 Get 으로 리다이렉트 했기에 새로고침을 해도 결과화면을 다시 요청하게 된다.
특수 리다이렉션 - 결과 대신 캐시를 사용할 때
304 Not Modified
캐시를 목적으로 사용되는 상태코드이다.
클라이언트에게 리소스가 수정되지 않았음을 알려줌으로써, 로컬PC에 저장된 캐시를 재사용하게 된다.
304는 응답에 메시지 바디를 포함하면 안된다. ⇒ 로컬 캐시를 사용해야하기 때문에
조건부 GET, HEAD 요청 시 사용된다.
이외에도 300 Multiple Choices가 있지만 사용하지는 않는다.
*** 3xx 상태코드에서 알아두면 좋은 내용
이 상태코드를 만들 때에 구상되었던 내용은 리다이렉션이 일어날 때 메서드가 유지되는 것이었다.
하지만 예상과는 다르게 대부분의 웹 브라우저가 메서드를 GET으로 변경하는 것을 알게 되었다고 한다.
그 후에 대체가 될 수 있는 상태코드가 만들어졌으나
301 ⇒ 308
302 ⇒ 307, 303
현실적으로는 많은 애플리케이션 라이브러리들이 301, 302를 기본값으로 사용하고 있었고, 현재도 그렇다.
자동 리다이렉션시에 GET으로 변해도 된다면 위 처럼그냥 기본값을 써도 문제는 없다.
***
4xx (Client Error) - 클라이언트에 의한 오류, 잘못된 문법 등으로 인해서 서버가 요청을 수행 할 수 없는 상태
클라이언트가 이미 잘못된 요청을 보낸 상태이기 때문에, 똑같은 재시도가 발생해도 계속해서 실패한다.
400 Bad Request
클라이언트가 잘못된 요청을 해서 서버가 요청을 처리할 수 없는 경우
요청 파라미터가 잘못되거나, API 스펙이 맞지 않을 때 등등이 있다.
401 Unauthorized
인증이 되지 않았을 경우 이 상태코드로 응답한다.
Authentication(인증) [로그인이 안됬을 때] 또는 Authorization(인가) [권한이 없어 리소스에 접근할 수 없을 때]
403 Forbidden
주로 인증 자격 증명이 있지만, 접근 권한이 불충분한 경우
404 Not Found
요청 리소스가 서버에 없는 경우
혹은 권한이 없는 클라이언트가 접속하였을 때 리소스를 숨기기 위해 사용되기도 한다.
5xx (Server Error) - 서버에 의한 오류, 서버가 정상 요청을 처리하지 못하는 상태
서버에 문제가 있는 경우이기 때문에, 클라이언트가 똑같은 재시도를 하면 성공할 가능성이 있다.
500 Internal Server Error
서버 내부 문제로 오류가 발생한 경우
애매한 경우에는 모두 위 상태코드로 처리한다.
503 Service Unavailable
서비스가 이용 불가한 경우
서버가 일시적인 과부하 또는 예정된 작업으로 잠시 요청을 처리할 수없는 상태이다.
Retry-After 헤더 필드를 통해 언제 복구 예정인지도 알려줄 수 있다.
*** 만약 인식할 수 없는 상태코드가 나타나면?
299, 451, 599와 같이 정의되지 않은 상태코드가 나타나게 된다면 상위 상태코드로 해석해서 처리를 하게된다.
200, 400, 500과 같이 해석
***
주로 보아왔던 상태코드로는 404, 500 등이 있을 것이다.
이 같은 숫자들이 바로 상태코드였던 것이다.
외에도 여러가지 상태코드가 있지만 그 중에서도 주로 사용되고 알려진 것들에 대해서만 정리하게 되었다.
참고 -
https://www.inflearn.com/course/http-%EC%9B%B9-%EB%84%A4%ED%8A%B8%EC%9B%8C%ED%81%AC
'오늘의 공부 > WEB' 카테고리의 다른 글
쿠키 (Cookie) (0) | 2022.03.29 |
---|---|
HTTP 헤더 (0) | 2022.03.20 |
HTTP 메서드의 활용 (0) | 2022.03.20 |
HTTP 메서드 (0) | 2022.03.20 |
HTTP에 대하여 (0) | 2022.03.20 |