본문 바로가기
HTTP

[HTTP] 상태 코드 - 상태 코드는 왜 필요할까? 및 종류

by 개미가되고싶은사람 2024. 3. 12.

상태 코드는 왜 필요할까?

저는 왜? 이걸 사용하지라는 생각을 많이 하는데  글을 쓰면서 한 번 내용을 정리하기로 했다.

 

 

아래 내용은 상태코드가 왜 필요한가에 대해서 설명을 위해 예시를 들었다

 

로그인 실패 과정

1. 내가 보낸 아이디, 패스워드는 POST 요청을 통해 서버로 전달되었다.

2. 서버는 방금 나의 요청에 대해 인증에 실패해서 '아이디 또는 패스워드가 잘못 입력되었습니다.'라는 문구를 내가 보고 있는 페이지로 보냈다.

3. 그런데 아래 사진을 보면 크롬에서는  '비밀번호를 업데이트하시겠습니가?' 라는 창을 띄울까?

 

위에 설명한 로그인 실패 과정에서 드는 의문점은  '아이디 또는 패스워드가 잘못 입력되었습니다.'를 보고 인증에 실패했다는 사실을 알 수 있다 하지만 로그인에 실패했는데도 브라우저는 내가 로그인 인증을 실패했다는 사실을 모르고,  '비밀번호를 업데이트하시겠습니까?'를 띄우고 있다.

 

 

방금 보냈던 로그인을 위한 POST 요청이 어떻게 처리되었는지 F12를 누르고 Network에 들어가서 확인해 보았다.

상태코드가 204로 나온것을 볼 수 있었다.

 

204상태 코드는 서버가 요청을 성공적으로 처리했지만, 응답으로 반환할 데이터가 없음을 나타내는 코드이다. 

지금 내가 로그인에 실패했다는 사실을 모르고 정상 처리 된 줄 알고  '비밀번호를 업데이트하시겠습니가?' 라는 창을 띄운 것이다.

 

브라우저에게 지금 로그인에 실패했다는 것을 알리기 위해서는 서버에서 응답할 때, 현재 상황에 맞는 상태 코드를 보내는 것이 좋다. 

 

401 Unauthorized 상태 코드를 보내는 것이 좋다. 이 상태 코드는 클라이언트가 인증되지 않았음을 나타내며, 클라이언트가 인증 정보를 제공하지 않았거나, 제공한 인증 정보가 유효하지 않은 경우에 사용된다.

 

 

 

상태코드

클라이언트가 보낸 요청의 처리 상태를 응답에서 코드로 알려주는 기능

  • 1xx (Informational): 요청이 수신되어 처리중 (거의 사용하지 않으므로 생략)
  • 2xx (Successful): 요청 정상 처리
  • 3xx (Redirection): 요청을 완료하려면 추가 행동이 필요
  • 4xx (Client Error): 클라이언트 오류, 잘못된 문법등으로 서버가 요청을 수행할 수 없음
  • 5xx (Server Error): 서버 오류, 서버가 정상 요청을 처리하지 못함

만약 모르는 상태 코드가 나온다면

모르는 상태 코드가 나온다면 큰 범위로 상태 코드로 해석하면 된다.

예)

299 ??? → 2xx (Successful)

451 ??? → 4xx (Client Error)

2xx

클라이언트의 요청을 성공적으로 처리

  • 200 OK
  • 201 Created
  • 202 Accepted
  • 204 No Conten

201 Created

요청 성공해서 새로운 리소스가 생성된다. 생성된 리소스는 응답 HTTP 메소드에 Location 헤더로 식별

202  Accepted

요청이 접수되었으나 처리가 완료되지 않았음

해당 상태 코드는 요청 접수 후 일정 시간 뒤에 배치 프로세스가 요청을 처리할 때 사용한다.

배치 프로세스란

  • 일반적으로 대량의 데이터를 처리할 때 사용
  • 특정 시간에 실행
  • 일괄적으로 처리

204  No Conten

서버가 요청을 성공적으로 수행했지만, 응답 페이로드 본문에 보낼 데이터가 없을 때

예) 웹 문서 편집기에서 save 버튼

 

 

3xx(Redirection)

요청을 완료하기 위해 유저 에이전트의 추가 조치 필요

3xx 상태 코드는 응답 HTTP 메세지에 Location헤더가 있으면, 해당 위치로 자동 이동한다 = 리다이렉션

  • 300 Multiple Choices (잘 사용하지 않음)
  • 301 Moved Permanently
  • 302 Found
  • 303 See Other
  • 307 Temporary Redirect
  • 308 Permanent Redirect

 

영구 리다이렉션(301, 308)

말 그대로 리소스의 URI가 영구적으로 이동

 

301 Moved Permanently

  • 리다이렉트시 요청 메서드가 GET으로 변하고, 본문이 제거될 수 있음(웬만하면)

308 Permanent Redirect

  • 리다이렉트시 요청 메서드와 본문 유지(처음 POST를 보내면 리다이렉트도 POST 유지)

 

일시 리다이렉션(302, 307, 303)

리소스의 URI가 일시적으로 변경

  1. 302 Found
    • 리다이렉트시 요청 메서드가 GET으로 변하고, 본문이 제거될 수 있음
  2. 307 Temporary Redirect
    • 리다이렉트시 요청 메서드와 본문 유지(요청 메서드를 변경하면 안된다)
  3. 303 See Other
    • 리다이렉트시 요청 메서드가 GET으로 변경

특수 리다이렉션(300, 304)

300리다이렉션은 사용하지 않음

 

304 Not Modified

  • 클라이언트에게 리소스가 수정되지 않았음을 알려준다. 따라서 클라이언트는 로컬PC에 저장된 캐시를 재사용한다. (캐시로 리다이렉트 한다.)
  • 304 응답은 응답에 메시지 바디를 포함하면 안된다. (로컬 캐시를 사용해야 하므로)
  • 조건부 GET, HEAD 요청시 사용

 

4xx (Client Error) - 오류의 원인이 클라이언트에 있다.

클라이언트가 이미 잘못된 요청, 데이터를 보내고 있기 때문에, 똑같은 재시도가 실 패한다. 클라이언트가 잘못된 요청을 하기 때문에 복구가 불가능하다.

 

400 Bad Request

클라이언트가 잘못된 요청을 해서 서버가 요청을 처리할 수 없음

요청 파라미터이나 API스펙이 안 맞는 경우 주로 이 에러가 난다. 그러므로 백엔드 개발자들은 사전에 막아놔야 된다. 이런 걸 5xx오류로 튕기면 서버 문제라고 생각하기 때문에 4xx오류라고 명확히 명시 해야 된다.

401 Unauthorized

클라이언트가 해당 리소스에 대한 인증이 필요함

  • 인증(Authentication): 본인이 누구인지 확인, (로그인)
  • 인가(Authorization): 권한레벨 (ADMIN 권한처럼 특정 리소스에 접근할 수 있는 권한, 인증이 있어야 인가가 있음 → 인증되지 않는 사용자가 인증된 사용자만 사용할 수 있는 리소스에 접근한 경)

403 Forbidden

서버가 요청을 이해했지만 승인을 거부함

  • 주로 인증 자격 증명은 있지만, 접근 권한이 불충분한 경우
  • 예) 어드민 등급이 아닌 사용자가 로그인은 했지만, 어드민 등급의 리소스에 접근하는 경우

404 Not Found

요청 리소스를 찾을 수 없음

클라이언트 오류인 이유

서버 입장에서 보면 클라이언트가 해당 리소스가 없는데 요청을 했으니까 클라이언트 오류라고 본다.

5xx (Server Error)

서버 오류

  • 서버 문제로 오류 발생
  • 서버에 문제가 있기 때문에 재시도 하면 성공할 수도 있음(복구가 되거나 등등)

500 Internal Server Error

실무에서는 애매한 서버 오류인 경우 다 500오류로 보낸다.

503 Service Unavailable

서비스 이용 불가

  • 서버가 일시적인 과부하 또는 예정된 작업으로 잠시 요청을 처리할 수 없음
  • Retry-After 헤더 필드로 얼마뒤에 복구되는지 보낼 수도 있음

 

 

참조: 모든 개발자를 위한 HTTP 웹 기본 지식 - 김영한