http 상태코드
클라이언트가 서버에게 http 메세지를 보내면, 서버는 메세지 내용을 처리한다. 그리고 서버는 처리가 어떻게 되었는지 알려주는데 이 때 사용되는 것이 상태 코드다. 우리가 어떤 사이트에 접속했는데 아무것도 뜨지 않고 404 Not found
라고 표시된 것이 대표적 사례.
좀 더 정확하게 정리하자면,
: 서버 응답 시, 클라이언트가 요청한 내용의 처리 상태를 알려주는 코드가 상태 코드다
: 1xx/2xx/3xx/4xx/5xx 등 각 상위 코드에 따라 어떤 상태인지 알 수 있다
(클라이언트는 상위 코드를 기준으로 이해하면 된다는 뜻과 같다)
- 2xx (succesful)
: 200 ok
: 201 created
: 202 accepted, 클라이언트 요청은 접수되었으나 100% 처리된 상태가 아님
: 204 no content, 보낼 데이터가 없는 경우 (e.g. 웹 문서 편집 시, save를 눌러도 같은 화면 유지해야 하고 save된 것만 확인하면 되는 상황)
- 3xx (redirection)
: 요청을 완료하기 위해 클라이언트로 다시 보내는 것으로, location에 표시된 위치로 이동
- 영구 redirection (e.g. /event -> /new-event)
: 301 moved permanently, 리다이렉트 시 요청 메서드가 get
으로 변하며, 기존 본문이 제거될 수 있음
: 308 permanent redirect, 리다이렉트 시 요청 메서드와 본문 유지 (어차피 새 uri로 옮겨지면 데이터 폼이 바뀌는 경우가 대부분이라, 거의 사용하지 않음)
- 일시적인 redirection (e.g. 주문 완료 -> 주문 내역)
: 302 found, 리다이렉트 시 요청 메서드가 get
으로 변하고, 기존 본문이 제거될 수 있음
: 307 temporary redirect, 302와 동일한데 요청 메서드와 본문은 유지
: 303 see other, 302와 동일한데 요청 메서드가 반드시 get
으로 변해야 함
: 가장 많이 사용되는 방식이 'PRG'(post-redirect-get)
-> post로 주문 처리 후, 웹 브라우저를 새로고침하면 다시 주문이 처리되면서 중복 주문이 발생할 수 있음
-> 이를 방지하기 위해, post로 주문 처리 후 결과 화면을 get
메서드로 리다이렉트 하면 새로고침해도 결과 화면을 get
으로 조회하는 패턴을 의미함
-> 사용자의 behaviour에 따른 오류를 크게 낮출 수 있음
- 특수 redirection
: 300 multiple choices (안씀)
: 304 not modified, 클라이언트에게 리소스가 수정되지 않았음을 알려주면서 캐시로 리다이렉트 해줌
-> 즉, 클라이언트에게 캐시를 계속 사용해도 된다고 confirm 해주는 것
-> 응답 시 메세지 바디에 내용이 없어야 함 (그래야 로컬 pc에 있는 캐시 사용)
- 4xx (client error)
: 오류의 원인은 클라이언트에게, 그래서 재시도해도 결과는 계속 실패임
: 400 bad request, api 스펙이나 요청 파라미터가 잘못 됐을 때. 서버는 400 오류를 잘 사용해서 클라이언트 측 오류를 최대한 막아주는 것이 중요
: 401 unauthorized, 클라이언트가 해당 리소스에 접근하기 위해서는 인증이 필요함. 이 때 서버는 WWW-Authenticate헤더와 함께 인증 방법 전달함
: 403 forbidden, 서버가 요청을 이해했으나 처리 거부 (admin 등급이 아닌 사용자가 로그인은 했으나 해당 리소스에 접근은 안되는 경우)
: 404 not found, 요청 리소스가 서버에 없음 / 아예 해당 리소스의 존재를 숨겼을 때 (권한이 부족한 리소스에 사용자가 접근하는 것이 싫어서 아예 숨기고 싶을 때)
- 5xx (server error)
: 오류의 원인은 서버에게, 그래서 재시도 하면 성공할 수도 (서버가 그 사이 복구되었다는 뜻)
: 503 service unavailable, 일시적인 과부하 또는 예정된 작업으로 인해 잠시동안 클라이언트 요청을 처리할 수 없는 상태
(Ready-after헤더로 어느 정도 시간 후에 복구되는지 알려줄 수는 있으나, 현실은 그런거 알기 어렵다 (...))
cache(캐시): 주기억 장치 - 중앙처리장치 사이에 있는, 데이터 임시 저장소
: 자주 접속하는 데이터나 프로그램 명령을 캐시에 넣으면, 중앙처리장치가 명령을 내릴 때 주기억장치 대신 캐시에서 필요한 프로그램을 사용할 수 있음
: cache hit가 높을 수록(요청한 데이터가 캐시에서 발견된 경우), 컴퓨터 처리 속도가 향상됨
: cache miss는 요청된 데이터가 캐시에 없음을 의미
내용 출처: 모든 개발자를 위한 HTTP웹 기본 지식, 김영한