نوێکراوەتەوە 1 month ago
링크를 클릭하거나, 양식을 제출하거나, 이미지를 불러올 때마다 브라우저는 서버에 무언가를 요청합니다. 서버는 항상 숫자로 응답합니다. 그 숫자—상태 코드—는 서버가 다른 말을 꺼내기 전에 먼저 건네는 한 마디입니다.
200은 "여기 있습니다"를 의미합니다. 404는 "그런 건 없습니다"를 의미합니다. 500은 "저 고장났습니다"를 의미합니다.
이 세 자리 숫자들은 웹에서 이루어지는 모든 대화의 어휘입니다.
서버의 언어
HTTP 응답은 상태 라인으로 시작합니다:
중요한 건 200입니다. "OK"는 로그를 읽는 사람을 위한 설명일 뿐입니다. 모든 HTTP 클라이언트—브라우저, 앱, 스크립트—는 그 숫자만 보고 다음 행동을 결정합니다.
첫 번째 자리 숫자가 분류를 알려줍니다:
- 1xx: "잠깐만요, 처리 중입니다"
- 2xx: "요청하신 것을 드립니다"
- 3xx: "여기엔 없지만, 어디 있는지 알고 있습니다"
- 4xx: "요청에 문제가 있습니다"
- 5xx: "저 고장났습니다"
덕분에 처음 보는 상태 코드도 이해할 수 있습니다. 누군가 418을 받았다고 하면, 클라이언트 오류임을 바로 알 수 있습니다—문제는 서버가 아니라 요청 쪽이라는 것을요.
알아야 할 코드들
성공 (2xx)
200 OK — 요청이 성공했습니다. 데이터를 드립니다.
201 Created — 요청이 성공했고, 새로운 리소스가 만들어졌습니다. 새 사용자를 POST하고 201을 받으면, 서버가 "완료됐어요, 이제 존재합니다"라고 말하는 것입니다.
204 No Content — 요청은 성공했지만, 돌려보낼 내용이 없습니다. DELETE 요청 후에 자주 나타납니다—항목이 삭제됐고, 더 이상 할 말이 없습니다.
리다이렉트 (3xx)
301 Moved Permanently — "이 주소는 영구적으로 바뀌었습니다. 기록을 업데이트하세요." 브라우저와 검색 엔진은 이것을 기억합니다.
302 Found — "임시로 다른 곳에 있습니다." 원래 주소는 여전히 유효합니다. 그냥 잠깐 우회하는 것입니다.
304 Not Modified — "이미 최신 버전을 갖고 있습니다." 대역폭을 아낄 수 있습니다. 브라우저가 "이게 변경됐나요?"라고 물었고, 서버가 "아니요, 캐시에 있는 걸 쓰세요"라고 답한 것입니다.
클라이언트 오류 (4xx)
"요청 쪽 문제" 코드들입니다.
400 Bad Request — "무엇을 요청하는지 이해할 수 없습니다." 형식이 잘못된 JSON, 누락된 매개변수, 문법 오류 등입니다.
401 Unauthorized — "당신은 누구인가요?" 인증이 필요합니다. 자격 증명을 제시하세요.
403 Forbidden — "당신이 누구인지 알고 있지만, 그건 안 됩니다." 인증은 됐지만 권한이 없습니다.
401과 403은 헷갈리기 쉽습니다. 클럽 입구 경비원을 떠올려보세요: 401은 "신분증 보여주세요"이고, 403은 "신분증은 확인했는데, 명단에 없네요"입니다.
404 Not Found — "찾아봤는데 없습니다." 이것은 무언가 고장났다는 뜻이 아닙니다—리소스가 존재하지 않는다는, 완벽히 정상적인 응답입니다.
429 Too Many Requests — "좀 천천히 하세요." 속도 제한에 걸렸습니다. 요청 빈도를 줄이고 잠시 후 다시 시도하세요.
서버 오류 (5xx)
"서버 쪽 문제" 코드들입니다. 요청은 아무 문제 없었지만, 서버가 처리하지 못한 것입니다.
500 Internal Server Error — "뭔가 잘못됐는데 뭔지 모르겠습니다." 예상치 못한 오류에 대한 포괄적인 코드입니다. 서버 로그를 확인하세요.
502 Bad Gateway — "저는 프록시인데, 뒤에 있는 서버가 이상한 응답을 보내왔습니다." 백엔드 서버에 장애가 생겼을 때 로드 밸런서에서 흔히 나타납니다.
503 Service Unavailable — "과부하가 걸리거나 점검 중입니다." 언제 다시 시도하면 좋을지 알려주는 Retry-After 헤더가 함께 오는 경우가 많습니다.
504 Gateway Timeout — "저는 프록시인데, 뒤에 있는 서버가 제때 응답하지 않았습니다."
왜 중요한가
상태 코드 덕분에 기계는 언어를 이해하지 않고도 판단을 내릴 수 있습니다. 브라우저는 오류 메시지를 파싱하지 않습니다—301을 보면 리다이렉트를 따라가고, 401을 보면 비밀번호를 요청하고, 304를 보면 캐시에서 불러옵니다.
이것이 중요한 이유:
디버깅 — 뭔가 작동하지 않을 때, 상태 코드가 어디를 봐야 하는지 알려줍니다. 4xx면 요청이 잘못된 것입니다. 5xx면 서버가 문제입니다. 3xx면 다른 곳으로 보내지고 있습니다. 이것만으로도 몇 시간짜리 조사가 몇 초로 줄어듭니다.
API 구축 — 올바른 상태 코드를 반환하면 API의 동작이 예측 가능해집니다. 클라이언트는 오류 메시지를 파싱하지 않고도 404와 500을 다르게 처리할 수 있습니다.
캐싱 — 브라우저는 상태 코드를 기반으로 캐싱합니다. 301 리다이렉트는 영구적으로 캐시될 수 있습니다. 200 응답은 헤더에 따라 캐시됩니다. 304는 "캐시가 유효합니다"라고 명시적으로 알려줍니다.
SEO — 검색 엔진은 상태 코드를 통해 사이트를 파악합니다. 301은 새 URL로 순위를 이전합니다. 404는 페이지를 색인에서 제거합니다. 302는 원래 URL을 색인에 유지합니다.
흔한 실수들
오류에 200 반환하기 — 일부 API는 200 OK를 반환하면서 본문에 {"error": "not found"}를 넣습니다. 이는 HTTP 의미론을 위반합니다. 클라이언트는 본문을 파싱하지 않고는 성공과 실패를 구별할 수 없습니다. 404를 사용하세요.
301이 맞는데 302 사용하기 — 무언가 영구적으로 이동했다면, 그렇게 말하세요. 302는 브라우저와 검색 엔진에게 예전 URL이 아직 유효하다고 알립니다.
401과 403 혼동하기 — 401은 "인증하세요"입니다. 403은 "인증해도 안 됩니다"입니다. 로그인은 됐지만 권한이 없다면, 401이 아니라 403입니다.
404를 오류로 취급하기 — 404는 고장이 아닙니다. 정직한 응답입니다. 서버가 찾아봤고, 없었고, 그렇게 알려준 것입니다. 올바른 동작입니다.
상태 코드 읽기
브라우저 개발자 도구(F12 → 네트워크 탭)에서 모든 요청의 상태 코드를 확인할 수 있습니다. 디버깅할 때:
- 200인데 페이지가 이상해 보임: 요청은 성공했습니다. 문제는 렌더링이나 데이터에 있습니다
- 301/302: 리다이렉트 중입니다—Location 헤더를 확인하세요
- 401: 인증이 없거나 유효하지 않습니다
- 403: 인증은 됐지만 권한이 없습니다
- 404: URL이 잘못됐거나 리소스가 없습니다
- 500: 서버 버그입니다—서버 로그를 확인하세요
- 502/503/504: 클라이언트와 실제 서버 사이의 인프라 문제입니다
대화
HTTP 상태 코드는 웹의 무한한 결과를 관리 가능한 어휘로 압축합니다. 모든 요청은 응답을 받습니다. 모든 응답은 숫자로 시작합니다. 그 숫자가 핵심 질문에 답합니다: 이게 됐나요?
그 아름다움은 솔직함에 있습니다. 서버는 잘못됐을 때 괜찮은 척하지 않습니다. 고장나면 500을 말합니다. 뭔가 없으면 404를 말합니다. 당신이 누구인지 모르면 401을 말합니다.
서버가 하는 말을 듣는 법을 배우고 나면, 웹은 한결 덜 신비로워집니다. 상태 코드는 모든 답의 첫 마디입니다—그리고 종종 그것만으로도 충분합니다.
HTTP 상태 코드에 관한 자주 묻는 질문
401과 403의 차이는 무엇인가요?
401은 "인증하세요"입니다—서버가 당신이 누구인지 모릅니다. 403은 "금지됨"입니다—서버는 당신이 누구인지 알지만 권한이 없습니다. 로그인이 안 된 상태라면 401입니다. 로그인은 됐지만 일반 사용자로 관리자 페이지에 접근하려 한다면 403입니다.
200 OK를 받았는데 페이지에 오류가 표시되는 이유는 무엇인가요?
일부 애플리케이션은 모든 응답에 200을 반환하고 응답 본문에 오류를 담습니다. 이는 좋지 않은 방식입니다—HTTP 의미론을 위반하고 디버깅을 어렵게 만듭니다. 제대로 설계된 API는 적절한 상태 코드를 사용하여, 클라이언트가 응답을 파싱하지 않고도 오류를 처리할 수 있게 합니다.
404 응답을 캐시해야 하나요?
네, 404는 기본적으로 캐시 가능합니다. 리소스가 없다면, 반복해서 물어봐도 바뀌지 않습니다. 다만, 애플리케이션이 곧 그 리소스를 생성할 가능성이 있다면 Cache-Control 헤더를 사용해 404가 캐시되는 시간을 제한할 수 있습니다.
418 "I'm a teapot"은 무슨 의미인가요?
하이퍼텍스트 커피포트 제어 프로토콜에 관한 만우절 RFC에서 유래한 코드입니다. 일부 서버는 처리하지 않을 요청을 거부할 때 사용하고, 일부 개발자는 이스터 에그로 반환하기도 합니다. 실제 용도로는 공식적인 HTTP 상태 코드가 아닙니다.
다른 사람들에게는 웹사이트가 잘 보이는데 나는 왜 502 Bad Gateway를 받나요?
502는 게이트웨이나 프록시 역할을 하는 서버가 상위 서버로부터 유효하지 않은 응답을 받았다는 뜻입니다. 일부 백엔드 서버에 장애가 생기면서 나머지 서버들은 계속 동작할 때 발생할 수 있습니다. 다른 사람들이 사이트에 접근할 수 있다면, 로드 밸런서 풀의 다른 서버에 연결된 것일 수 있고, 재시도할 때쯤엔 문제가 해결됐을 수도 있습니다.
ئایا ئەم پەڕەیە بەسوود بوو؟