정보 응답 1xx
1xx 코드
100Continue — 서버가 헤더를 수신함, 클라이언트는 본문을 전송해야 함
101Switching Protocols — WebSocket 또는 HTTP/2로 업그레이드
102Processing — 서버가 요청을 수신하고 처리 중 (WebDAV)
103Early Hints — 최종 응답 전에 리소스 미리 로드
사용 예시
# 100 Continue: 클라이언트가 Expect 헤더를 보내고 100을 기다림 curl -H "Expect: 100-continue" -d @large.json URL # 101: WebSocket으로 업그레이드 Connection: Upgrade / Upgrade: websocket
성공 응답 2xx
2xx 코드
200OK — 표준 성공 응답
201Created — 리소스가 성공적으로 생성됨 (POST/PUT)
202Accepted — 요청 수신됨, 비동기 처리 중
203Non-Authoritative Info — 프록시에 의해 변환된 응답
204No Content — 성공했지만 응답 본문 없음 (DELETE)
205Reset Content — 성공, 클라이언트는 폼을 초기화해야 함
206Partial Content — 범위 요청 처리 완료
207Multi-Status — 여러 상태 코드 포함 (WebDAV)
REST API 사용 패턴
GET → 200본문과 함께 리소스 반환
POST → 201리소스 생성됨, Location 헤더 포함
PUT → 200/204리소스 업데이트 (본문 포함/미포함)
DELETE → 204삭제됨, 본문 없음
PATCH → 200부분 업데이트, 수정된 리소스 반환
리다이렉션 3xx
3xx 코드
300Multiple Choices — 여러 표현 방식 제공 가능
301Moved Permanently — 리소스 이동됨, 북마크 업데이트 필요
302Found — 임시 리다이렉트 (303으로 잘못 사용되는 경우 많음)
303See Other — POST 이후 GET으로 리다이렉트
304Not Modified — 캐시 사용 (ETag/If-Modified)
307Temporary Redirect — 동일 메서드, 임시 위치
308Permanent Redirect — 동일 메서드, 영구 위치
리다이렉트 동작 비교
301/308영구 — 검색 엔진이 인덱스를 업데이트함
302/307임시 — 원래 URL이 캐노니컬로 유지됨
301/302리다이렉트 시 메서드를 GET으로 변경할 수 있음
307/308원래 HTTP 메서드를 반드시 유지해야 함
클라이언트 오류 4xx
주요 클라이언트 오류
400Bad Request — 잘못된 구문 또는 유효하지 않은 파라미터
401Unauthorized — 인증 필요 또는 인증 실패
403Forbidden — 인증됐지만 권한 없음
404Not Found — 리소스가 존재하지 않음
405Method Not Allowed — HTTP 메서드가 지원되지 않음
406Not Acceptable — Accept 헤더를 만족할 수 없음
408Request Timeout — 클라이언트가 요청을 너무 느리게 전송
409Conflict — 요청이 현재 상태와 충돌
추가 클라이언트 오류
410Gone — 리소스가 영구적으로 삭제됨 (단순 미존재와 다름)
411Length Required — Content-Length 헤더 누락
412Precondition Failed — If-Match/If-Unmodified 실패
413Content Too Large — 요청 본문이 제한 초과
414URI Too Long — URL이 서버 제한 초과
415Unsupported Media Type — Content-Type이 허용되지 않음
422Unprocessable Content — 구문은 유효하나 시맨틱 오류
429Too Many Requests — 요청 횟수 제한 초과
서버 오류 5xx
5xx 코드
500Internal Server Error — 서버에서 처리되지 않은 예외 발생
501Not Implemented — 서버가 해당 메서드를 지원하지 않음
502Bad Gateway — 업스트림 서버에서 잘못된 응답 수신
503Service Unavailable — 과부하 또는 점검 중
504Gateway Timeout — 업스트림 서버가 제때 응답하지 않음
505HTTP Version Not Supported — 해당 버전을 처리할 수 없음
507Insufficient Storage — 서버가 요청을 저장할 수 없음 (WebDAV)
511Network Auth Required — 캡티브 포털 로그인 필요
재시도 전략
500백오프 후 재시도, 일시적일 수 있음
502/504재시도 — 업스트림 문제가 해소될 수 있음
503재시도 전 Retry-After 헤더 확인
501/505재시도 불필요 — 클라이언트 요청 수정 필요
자주 쓰는 코드
핵심 상태 코드 한눈에 보기
200OK — 정상 처리
201Created — 새 리소스 생성됨
204No Content — 성공, 빈 본문
301Moved Permanently — URL 업데이트 필요
304Not Modified — 캐시 사용
400Bad Request — 요청을 수정하세요
401Unauthorized — 먼저 로그인하세요
403Forbidden — 권한 부족
404Not Found — 잘못된 URL 또는 삭제됨
422Unprocessable — 유효성 검사 오류
429Too Many Requests — 요청 속도를 줄이세요
500Server Error — 서버 측 문제
502Bad Gateway — 프록시/업스트림 오류
503Unavailable — 나중에 다시 시도하세요
헤더 참조
요청 헤더
Accept원하는 응답 미디어 타입 (예: application/json)
Authorization인증 정보 (Bearer 토큰, Basic base64)
Content-Type요청 본문의 미디어 타입
If-None-Match조건부 요청: 캐시 유효성 검사용 ETag
If-Modified-Since조건부 요청: 캐시 유효성 검사용 날짜
Cache-Control캐싱 지시자 (no-cache, max-age)
User-Agent클라이언트 식별 문자열
응답 헤더
Content-Type응답 본문의 미디어 타입
Location리다이렉트 대상 또는 생성된 리소스 URL
ETag캐시 유효성 검사용 엔티티 태그
Cache-Control캐싱 지시자 (max-age, no-store)
Retry-After재시도 전 대기 시간 (429/503)
WWW-Authenticate필요한 인증 방식 (401과 함께 전송)
Set-Cookie클라이언트에 쿠키 설정
주요 패턴
캐싱 흐름
# 첫 번째 요청 — 서버가 ETag 반환 GET /api/data → 200, ETag: "abc123" # 이후 요청 — 조건부 요청 GET /api/data, If-None-Match: "abc123" → 304 Not Modified (캐시 사용)
인증 흐름
# 인증되지 않은 요청 GET /api/secret → 401, WWW-Authenticate: Bearer # 토큰 포함 요청 GET /api/secret, Authorization: Bearer → 200 OK
요청 횟수 제한
# 요청 횟수 초과 응답 429 Too Many Requests Retry-After: 60 X-RateLimit-Remaining: 0 X-RateLimit-Reset: 1700000000
콘텐츠 협상
# 클라이언트가 JSON 선호, XML도 허용 Accept: application/json, application/xml;q=0.9 # 서버가 만족 불가 → 406 Not Acceptable # 서버가 최적 타입 반환 → 200 + Content-Type