We will find a way, we always have.

-interstellar

Computer Science/네트워크

[네트워크] HTTP 응답코드

Redddy 2023. 7. 19. 23:54

HTTP 응답 코드

HTTP 응답 코드는 클라이언트의 요청에 대한 서버에서 반환되는 코드를 말한다. 응답 코드를 통해서 요청 결과에 대한 정보를 알 수 있다.

응답 코드는 5개의 분류로 구분된다.


  • 1xx (정보 전달) : 1로 시작하는 응답코드는 서버가 요청을 받았고, 클라이언트는 작업을 진행하라는 의미. HTTP/1.0 이후 거의 쓰이지 않는다.
  • 2xx (성공) : 요청이 서버에서 정상적으로 수신되었음을 나타낸다.
    • 200 OK : 요청이 성공했음을 나타내는 응답 코드.
    • 201 Created : 요청이 성공했고, 자원이 생성되었음을 나타내는 응답 코드. 주로 POST, PUT 요청에 대한 결과.
    • 202 Accepted : 요청은 성공했으나, 서버가 아직 요청을 완료하지 못함.
  • 3xx (리다이렉션) : 클라이언트가 요청을 완료하기 위해 추가 작업을 수행해야 함을 말한다.
    • 301 Moved Permanently : 요청한 리소스의 URI가 영구적으로 변경되었음을 의미
    • 302 Found : 요청한 리소스의 URI가 일시적으로 변경되었음을 의미
    • 303 See Other : 302와 기능은 같지만 리다이렉트 요청시 메서드가 GET으로 변경
    • 304 Not Modified : 리소스가 수정되지 않았음을 의미한다. (클라이언트는 캐시 사용)
    • 307 Temporary Redirect : 302와 기능은 같지만 리다이렉트 요청시 본문 유지
    • 308 Permanent Redirect : 301과 기능은 같지만 차이점은 리다이렉트시 요청 메서드와 본문을 유지한다.
  • 4xx (클라이언트 오류) : 이 코드는 클라이언트 요청이 잘못되었음을 의미한다.
    • 400 Bad Request : 서버가 클라이언트 오류를 감지해 더 이상 작업을 진행하지 않는 경우를 의미.
    • 401 Unauthorized : 비인증을 의미.
    • 403 Forbidden : 리소스에 접근할 권리가 없음.
    • 404 Not Found : 클라이언트가 요청한 자원이 존재하지 않음
  • 5xx (서버 오류) : 요청을 받은 서버에서 오류가 발생했음을 의미한다.
    • 500 Internal Server Error : 서버에 문제 있음을 의미. 문제에 대한 구체적인 설명은 없음.
    • 503 Service Unavailable : 서버가 일시적인 과부하 또는 예정된 작업으로 잠시 요청을 처리할 수 없음.

200 vs 201

두 코드 다 성공적인 요청을 의미하는 2xx 계열이다. 하지만 서로 다른 맥락으로 사용된다. 200 OK 코드는 성공적인 응답에 사용되며, 클라이언트에서 요청된 리소스가 존재하고 반환되었음을 나타낸다.

반면 201 Created 코드는 새 리소스가 성공적으로 생성되었음을 나타내며, 클라이언트가 찾을 수 있게 위치에 대한 정보도 제공한다.


리다이렉션 종류

  • 영구 리다이렉션 - 특정 리소스의 URI 가 영구적으로 이동

    • 예) 기존 URI 가 변경됐다면 변경된 새로운 URI 로 리다이렉션 해줄 수 있다. (301)
  • 일시 리다이렉션 - 일시적인 변경

    • 예) 주문 완료 후 주문 내역 화면으로 이동
    • PRG: Post/Redirect/Get 의 약자로, Post 후에 리다이렉션을 한 후 Get 을 요청함으로써 새로 고침시 Post 요청이 아닌 Get을 요청할 수 있다.
  • 특수 리다이렉션

    • 결과 대신 캐시를 사용

영구 리다이렉션

301 vs 308

두 코드 리소스의 URI가 영구적으로 이동되어 새로운 URI 로 리다이렉션을 의미하는 3xx 계열이다.
301 Moved Permanently 은 리다이렉트 요청시 메서드가 GET 으로 변하고 본문이 제거될 수 있다(MAY). 반면에
308 Permanent Redirect 은 리다이렉트시 요청 메서드와 본문을 유지한다. 처음 POST를 보내면 리다이렉트도 POST를 유지한다.

URI 가 변경되면 내부적으로 전달해야 하는 데이터가 변경될 수 있기 때문에 POST를 유지하는 것보단 GET을 사용하여 새로운 URI를 확인시켜주는 것이 안전하다.
다시 말해 308 보단 301 을 더 많이 사용한다.


일시적 리다이렉션

302 vs 307 vs 303

세 코드 모두 리소스의 URI 가 일시적으로 변경됨을 의미한다. 따라서 검색 엔진 등에서 URL 을 변경하면 안된다.

세 코드의 차이점은 리다이렉트 후 요청 메서드의 변경 유무이다.

각각의 코드 스펙을 살펴보자.

  • 302 Found
    • 스펙은 리다이렉트시 요청 메서드가 GET으로 변하고, 본문이 제거될 수 있음(MAY)
  • 307 Temporary Redirect
    • 302와 기능은 같음
    • 리다이렉트시 요청 메서드와 본문 유지(요청 메서드를 변경하면 안된다. MUST NOT)
  • 303 See Other
    • 302와 기능은 같음
    • 리다이렉트시 요청 메서드가 GET으로 변경

다시 정리해보면

  • 302 Found : GET으로 변할 수 있음
  • 307 Temporary Redirect : 메서드가 변하면 안됨
  • 303 See Other : 메서드가 GET으로 변경

처음 302의 스펙 의도는 HTTP 메서드를 유지하는 것이였지만 대부분의 브라우저들이 GET으로 변경하였다.
그래서 애매한 302를 대신하고자 명확한 307, 303이 등장하게 된것이다. 301과 308도 같은 맥락이다.


401 vs 403

두 코드 다 클라이언트 오류를 의미하는 4xx 계열이다. 하지만 서로 다른 의미로 사용된다. 401 Unauthorized 응답 코드는 클라이언트 요청에 유효한 자격 증명을 제공해야 함을 말한다. 즉 401이 반환되었다는 것은 리소스에 대한 요청에 유요한 자격 증명이 없음을 의미한다.

반면 403 Forbidden 응답 코드는 클라이언트가 유요한 자격 증명을 제시했지만 요청한 리소스에 접근할 수 없음을 의미한다.

쉽게 생각하면 401은 로그인이 안 된 상태고, 403은 로그인은 했지만, 관리자 권한이 없는 상태를 생각하면 이해가 쉬울 것이다. 그렇기에 403은 서버가 클라이언트가 누군지 알고 있다.