1. HTTP 상태코드 소개

📌 상태코드

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

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


🧐 만약 모르는 상태코드가 나타나면?
아래 예시처럼 '299, 451, 599'와 같이 클라이언트가 인식할 수 없는 상태코드를 서버가 반환하면 클라이언트는 상위 상태코드로 해석하면 된다. 미래에 새로운 상태 코드가 추가되어도 클라이언트를 변경하지 않아도 된다.

✏️예시
299 ➡️ 2xx (Successful)
451 ➡️ 4xx (Client Error)
599 ➡️ 5xx (Server Error)

📚 그렇다면 이제 상위 상태코드별 의미에 대하여 알아보도록 하자.



2. 2XX - 성공

  • 200 OK : 요청 성공
  • 201 Created : 요청 성공해서 새로운 리소스가 생성
  • 202 Accepted : 요청이 접수되었으나 처리가 완료되지 않음

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

  • 204 No Content : 서버가 요청을 성공적으로 수행했지만, 응답 바디에 보낼 데이터가 없음

    EX) 웹 문서 편집기에서 save 버튼
    👉 save 버튼의 결과로 아무 내용이 없어도 된다.
    👉 save 버튼을 눌러도 같은 화면을 유지해야 한다.
    👉 결과 내용이 없어도 204 메시지(2xx)만으로 성공인식할 수 있다.



3. 3XX - 리다이렉션

📌 3xx (Redirection)

300 : Multiple Choices
301 : Moved Permanently
302 : Found
303 : See Other
304 : Not Modified
307 : Temporary Redirect
308 : Permanent Redirect

서버가 클라이언트의 요청을 완료하기 위해 추가적인 작업이 필요해서 클라이언트에게 다시 보낸다.


🧐 /event를 사용하다 /new-event로 경로를 변경했다고 가정해보자. 기존 사용자는 /event 페이지에 북마크를 해두었을 수도 있고, 페이지가 여러 군데 공유되었을 수도 있다.

  1. 사용자가 /event 경로로 들어오면 서버가 위 사진에서 2번과 응답을 보낸다.
  2. 웹 브라우저는 3XX 응답에 Location 헤더가 있으면 Location 위치로 자동으로 이동한다.(=url경로가 자동으로 /new-event로 변경)
  3. 웹 브라우저가 새로운 경로를 서버에 처음부터 다시 요청한다.
  4. 서버는 /new-event에 대한 응답 HTML을 클라이언트에 내려준다.
  5. 그러면 우리는 웹 브라우저에서 새로운 이벤트 페이지를 볼 수 있게 된다.

📌 리다이렉션의 종류

📁 1. 영구 리다이렉션 : 특정 리스소의 URI가 영구적으로 이동한다.

📖 예시
/members ➡️ /users
/event ➡️ /new-event

영구 리다이렉션의 상태코드는 301, 308이다.
도메인이 아예 변경되었거나, 새로운 URI 구조로 변경했을 때 기존에 사용자들이 북마크 기능 등, 예전 리소스로 접근했을 때 영구 리다이렉션을 통해 변경된 리소스로 유도한다.

✔️ 301 Moved Permantely : 리다이렉트시 요청 메서드가 GET으로 변하고 본문이 제거될 수 있다.
POST 요청 -> URI 리다이렉트 -> GET 요청

✔️ 308 Permanent Redirect : 리다이렉트시 요청 메서드와 본문을 유지한다.
POST 요청 -> URI 리다이렉트 -> POST 요청, BODY 유지


💡 301과 308의 차이점
301은 회원가입 요청 시 리다이렉트되면 GET으로 변경되므로 다시 데이터 작성 후 요청
308은 회원가입 요청 시 리다이렉트되면 POST, BODY를 유지하므로 바로 POST 요청 가능


📁 2. 일시 리다이렉션 : 리소스의 URI가 일시적으로 변경된다.

회원가입 시 일시적인 리다이렉션을 하지 않으면 회원가입 후 새로고침으로 중복 가입이 될 수 있다. 이럴 때 POST 회원 가입 결과 화면 등으로 GET메서드로 리다이렉트 해줘야 한다. 그러면 새로 고침을 해도 결과 화면을 GET으로 조회한다.
👉 PRG : Post/Redirect/Get

  • 302 Found : 요청 메서드가 GET으로 변할 수 있음
  • 307 Temporary Redirect : 리다이렉트시 요청 메서드와 분문을 유지한다(=요청 메서드를 변경하면 안 된다.)
  • 303 See Other : 메서드가 GET으로 무조건 변경

307과 303 모두 302와 기능은 같다. 의미가 명확한 307, 303을 권장하지만, 기존 애플리케이션들이 이미 302를 기본값으로 사용한다.
그렇기 때문에 GET으로 변해도 되면 302를 사용해도 큰 문제 없다.

📁 3.특수 리다이렉션 : 결과 대신 캐시를 사용한다.

  • 304 Not Modified : 캐시를 목적으로 사용한다.

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



4. 4XX - 클라이언트 오류

클라이언트 측 오류
클라이언트에서 이미 잘못된 요청을 보낸 것이므로, 재시도해도 똑같이 실패한다.

  • 400 Bad Request : 잘못된 요청(요청 파라미터가 잘못되었거나, API 스펙 불일치)
  • 401 Unauthorized : 인증되지 않음, (로그인이 안 돼있음)

    인증(Authentication) : 본인이 누구인지 확인하는 과정이다.
    인가(Authorization) : 특정 리소스에 접근할 수 있는 권한이 있는 사람만 볼 수 있는 권한 부여이다.
    오류 메시지가 Unauthorized이지만 인증 자체가 안된다는 뜻이다.

  • 403 Forbidden : 서버가 요청을 이해했지만, 승인을 거부함(로그인은 되어있지만, 권한이 없음)
  • 404 Not Found : 요청 리소스를 찾을 수 없음
    요청 리소스가 서버에 없거나 클라이언트가 권한이 부족한 리소스에 접근할 때 해당 리소스를 숨기고 싶을 때 발생한다.

✅✅ 404에러 났을 때 확인할 것들
1. url이 틀렸거나, api수정된 거 pull 땡기고 restart안해줘서 났다.
2. proxy: target 로컬로 잡혀있는지 확인
❗❗ 만약 수정했다면 서버 재시작해주기!!!



5. 5XX - 서버 오류

서버 측 오류
서버에 문제가 있기 때문에 재시도하면 성공할 수도 있다. (DB, 서버 복구 등)

  • 500 Internal Server Error : 서버 내부 문제(애매하면 500)
  • 503 Service Unavailable : 서비스 이용 불가(서버 다운)

💡 5xx 대 에러는 정말 서버의 장애나 에러가 났을 때만 발생시켜야 함. 비즈니스 로직이나 프로세스상 논리적인 문제가 발생 시 내는 경우가 있는데, 사용하면 안 된다.

0개의 댓글