HTTP 웹 기본 지식 - HTTP 상태코드

링딩·2022년 7월 19일
0

HTTP 웹 기초

목록 보기
4/6
post-thumbnail

이 글은 김영한 강사님의 모든 개발자를 위한 HTTP 웹 기본 지식 강의에 출처를 두고 있습니다.

Chap 6. HTTP 상태코드

1. 상태 코드의 종류

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

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


만일 모르는 '상태코드'가 나타나면?

if 클라이언트가 인식할 수 없는 '상태코드'를 서버가 반환한다면?

[방법]

  • 클라이언트는 상위 상태코드로 해석해서 처리
  • 미래에 new 상태코드가 추가된다 해도, 변경 필요 x
    ex)
    295 ??? => 2XX(200오류네아 200이니까 성공인갑다)
    451 ??? => 4XX (400오류네
    아 400대니까 걍 클라이언트 오류인갑다)
    599 ??? -> 5XX (500 오류네)


✨ 1XX (Informational)

요청이 수신되어 처리중이다. [거의 사용 x]


✨ 2XX (Successful)

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

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


200 OK (요청 성공)

201 Created

* 성공하여 새로 생성된 '리소스'의 위치를 'Location 헤더 필드'에 넣어 응답함

202 Accepted

📢 요청이 접수되었으나 처리는 완료되지 x

  • 배치 처리 같은 곳에서 사용
    ex) 요청 접수한 후 1시간 뒤 배치 프로세스가 요청을 처리함

204 No Content

📢 서버가 요청을 성공적으로 수행했으나, 응답 페이로드 본문에 보낼 데이터가 x

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

  • 애초에 저장만 되면 되고, 굳이 다른 내용을 반납할 필요가 없음
  • save 버튼을 눌러도 같은 화면을 유지해야 함

Q. <개인 궁금증>
=> 여기서 말하는 save가 임시저장일까?




3XX - 리다이렉션

요청을 완료하기 위해 유저 에이전트(웹 브라우저)의 추가 조치 필요

• 300 Multiple Choices => 별로 x
• 301 Moved Permanently
• 302 Found
• 303 See Other
• 304 Not Modified
• 307 Temporary Redirect
• 308 Permanent Redirect


Q. 리다이렉션은 무엇인가,,?

A.
웹 브라우저에서는 3XX 응답의 결과에 'Location 헤더'가 있다면, Location위치로 자동 이동한다.(리다이렉트)


🧨 리다이렉션 종류

  • 영구 리다이렉션 - 특정 리소스의 URI가 영구적으로 이동
    -> 이전 url은 사용 x
    • 예) /members -> /users
    • 예) /event -> /new-event
  • 일시 리다이렉션 - 일시적인 변경
    주문 완료 후 주문 내역 화면으로 이동
    • PRG: Post/Redirect/Get
  • 특수 리다이렉션
    결과 대신 캐시 를 사용

1. 영구 리다이렉션 _301, 308

  • 리소스 URI가 영구적으로 이동
  • 원래의 URL로 다시 사용x, 검색 엔진 등에서도 변경 인지
  • 301 Moved Permanently _더 많이 씀
    • 리다이렉트시 요청 메서드가 GET으로 변하고, 본문이 제거될 수 있음(MAY:일 수도 있고 아닐 수도)
  • 308 Permanent Redirect
    • 301과 기능은 같음
    리다이렉트시 요청 메서드와 본문 유지(처음 POST를 보내면 리다이렉트도 POST 유지)


2. 일시적인 리다이렉션 _302,307,303

  • 리소스의 URI가 일시적으로 변경
  • 따라서 검색 엔진 등에서 URL을 변경하면 안됨
  • 302 Found
    • 리다이렉트시 요청 메서드가 GET으로 변하고, 본문이 제거될 수 있음(MAY_일 수도 아닐 수도)
  • 307 Temporary Redirect
    • 302와 기능은 같음

    • 리다이렉트시 요청 메서드와 본문 유지(요청 메서드를 변경하면 안된다. MUST NOT)
  • 303 See Other
    • 302와 기능은 같음
    • 리다이렉트시 요청 메서드가 GET으로 무조건 변경

PRG: POST/Redirect/GET 일시적인 리다이렉션 예시

  • 만약 POST로 주문 후에 '새로고침'을 누르면
    => 새로고침은 '다시 요청' 아닌가??
    => 그러면 서버는 재주문 , 곧 중복 주문이 되잖아!!?

의도와 다르게 중복 주문을 해버린 우리들,,,😥🤦‍♂️

해결 방법은 없을까???


.
.

💦 우리는 그래서 PRG를 쓴다...

  • POST로 주문 후, '중복 주문' 방지해줌
    => 주문 결과 화면을 GET 메서드로 Redirect 해주니까!
  • 새로고침(F5) 해도 결과화면을 GET으로 조회해
    => URL은 POST -> GET으로 리다이렉트 됨.
    => 곧 중복 주문이 되지 않고, '결과 화면'만을 GET으로 재요청(Redirect) 하는거지


3. 기타 리다이렉션_300,304

  • 300 Multiple Choices: 안쓴다.
  • 304 Not Modified
    캐시를 목적으로 사용
    • 클라이언트에게 리소스가 수정되지 않았음을 알려준다.
    -> 따라서 클라이언트는 로컬PC에 저장된 캐시를 재사용 (캐시로 리다이렉트 한다.)
    => 클라) 서버야 리소스 좀 줘라, 서버) ㄴㄴ 캐시꺼 재사용 좀 혀
  • 304 응답은 응답에 메시지 바디를 포함하면 안된다. (로컬 캐시를 사용해야 하므로)
    • 조건부 GET, HEAD 요청시 사용



✨4XX (Client 오류)

  • 애초에 원인이 '클라이언트'에 있음
    • 오류는 보통 클라이언트 요청에 잘못된 문법,요청, 데이터 등을 보내서임
      => 그러다 보니 똑같이 재요청을 해도 성공할리가 없음

1. 400 Bad Request

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

  • 클라이언트는 요청 내용을 다시 검토하고 보내야 함.
    ex) 요청 파라미터가 잘못됨, API 스펙이 맞지 x


2. 401 Unauthorized _ 이름이 아쉽네요..😂

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

  • 인증(Authentication)이 되지 않음 => 로그인
    -> 🤷‍♂️ 너가 누군데? 인 상황..
    * 응답에 WWW-Authenticate 헤더와 함께 인증 방법을 설명

인증이고 인가고 뭔 소리인가?..😥

  1. 인증(Authentication): 본인이 누구인지 확인, (로그인)
  2. 인가(Authorization): 권한부여 (ADMIN 권한처럼 특정 리소스에 접근할 수 있는 권한,
    인증이 있어야 인가가 있음)
    • 오류 메시지가 Unauthorized 으로 지었는데 아이러니함.. 이 오류는 '인증'(Authentication)이 되지 않아 발생한거기에..

3. 403 Forbidden

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

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

4. 404 Not Found (403에서 좀 더 업글)

요청 리소스를 찾을 수 없음 😥😥

* 요청 리소스가 서버에 없음
* 또는 클라이언트가 권한이 부족한 리소스에 접근할 때 해당 리소스를 숨기고 싶을 때





## 5XX (Server Error) >* 서버 문제로 오류 발생 * 서버에 문제가 있기 때문에 같은 거로 다시 재요청하면 될 수도 있다!!!! (데이터 베이스 복구 등.)

500 Internal Server Error

애매하면 500 오류로,,,

  • 서버 내부의 문제로 오류남.


503 Service Unavaliable _거의 안 씀

서비스 이용불가

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




📢 웬만해서는 500대 오류는 내지 말자

찐 서버의 오류가 났을 때 쓰자...
예를 들면 DB에 오류가 났던, 쿼리에 문제가 생겼다거나 NullPointException이 떴다거나...


profile
초짜 백엔드 개린이

0개의 댓글