주제: HTTP 상태코드의 이해
작성: 2024-07-11
안녕하세요, 개발자 우성우입니다.
혹시 웹 검색하다가 '404 오류'가 뜨면서 웹이 반응하지 않는 경우를 종종 경험해 본 적이 있지 않나요? 이런 상황은 정말 당황스럽고 불편할 수 있습니다. 그런데 이 404 오류가 정확히 무엇을 의미하는지, 그리고 왜 발생하는지 궁금하지 않으신가요?
오늘은 웹 사용 중 우리가 마주칠 수 있는 다양한 HTTP 상태 코드 에는 무엇이 있으며, 상태코드를 사용하면 어떤 장점들이 있는지 차근차근 살펴보도록 하겠습니다.
HTTP란?
우선, HTTP가 무엇인지부터 정의하도록 하겠습니다. HTTP는 Hypertext Transfer Protocol(하이퍼텍스트 전송 프로토콜)로, 네트워크 장치 간에 정보를 전송하도록 설계된 애플리케이션 계층이 포함된 프로톨이며, 네트워크 프로토콜 스택의 다른 계층 위에서 실행되게 됩니다.
즉, 인터넷을 통해 웹페이지와 데이터를 주고받기 위해 사용되는 규칙이라고 할 수 있습니다. 조금 더 풀어서 설명하면, 웹 브라우저(클라이언트)와 웹 서버가 대화하는 방법을 정해놓은 약속(프로토콜)입니다.
그래도 아직 이해가 잘 안 되시죠? 그럼 예시를 들어서 설명해 보겠습니다.
- 요청과 응답:
- 클라이언트: 사용자가 웹 브라우저에서 어떤 페이지를 열기 위해 주소를 입력하거나 링크를 클릭합니다.
- 요청: 웹 브라우저는 이 요청을 웹 서버에 보냅니다.
- 서버: 서버는 이 요청을 받고, 요청한 페이지나 데이터를 준비합니다.
- 응답: 서버는 준비된 데이터를 웹 브라우저에 돌려줍니다.
- 예시:
- 사용자가 웹 브라우저에서 www.example.com을 입력합니다.
- 웹 브라우저가 "example.com의 홈페이지를 주세요"라는 요청을 서버에 보냅니다.
- 서버가 홈페이지 데이터를 찾아서 웹 브라우저에 보냅니다.
- 웹 브라우저가 받은 데이터를 사용자에게 보여줍니다.
HTTP 상태코드
여기서 등장하는 HTTP의 상태가 어떤지를 줄글로 쓰면 복잡하니까, 3자리의 숫자로 상태코드를 만들었습니다.
다시 말해, 상태코드는 클라이언트가 웹 서버에 요청을 보냈을 때, 서버가 그 요청을 어떻게 처리했는지를 나타내는 숫자인 거죠. 이를 통해서 서버가 요청을 성공적으로 처리했는지, 어떤 문제가 발생했는지, 추가 행동이 필요한지를 클라이언트에 알리기 위해 사용될 수 있습니다.
이를 통해 클라이언트와 서버 간의 통신을 명확하게 하고, 오류 진단 및 해결을 용이하게 된 것이죠
HTTP 상태코드 분류
HTTP 상태코드는 크게 5가지로 분류합니다. 100번대는 조건부 응답, 200번대는 성공을, 300대는 리디렉션, 400번대는 요청 오류, 500대는 서버오류를 의미하게 됩니다.
분류 | 내용 |
1xx Informational (조건부 응답) |
클라이언트가 서버에 정보를 요청했지만 해당 요청이 여전히 처리 중임을 나타냅니다 (해당 상태 코드를 접할 일은 많이 없습니다). |
2xx Successful (성공) |
여러분이 원하는 상태 코드입니다. 이러한 코드는 서버가 브라우저의 요청을 수신하고 성공적으로 처리했음을 나타냅니다. |
3xx Redirection (리디렉션) |
3xx 리디렉션은 서버가 요청된 페이지가 일시적으로 또는 영구적으로 이동되었음을 클라이언트에 알릴 때 나타납니다. 원래 요청한 리소스를 더 이상 사용할 수 없습니다. |
4xx Client Error (요청 오류) |
클라이언트의 잘못된 요청으로 서버가 이해를 못해 요청을 수행할 수 없음을 의미합니다. |
5xx Server Error (서버 오류) |
클라이언트가 특정 리소스에 대한 액세스를 요청하고 성공했지만 서버 오류로 인해 서버가 요청을 정상 처리하지 못함을 의미합니다. |
HTTP 상태코드 세부사항
실질적으로 상태코드가 더 자세하게 구분되어 있으나, 많이 사용하거나 볼 수 있는 항목으로 일부만 가져왔습니다.
1xx: Informational
- 100 Continue: 서버가 요청의 일부를 수신했으며, 클라이언트는 나머지 요청을 계속해야 함을 나타냅니다.
- 101 Switching Protocols: 서버가 클라이언트의 프로토콜 전환 요청을 수락했음을 나타냅니다.
2xx: Success
- 200 OK: 요청이 성공적으로 완료되었으며, 서버가 요청한 리소스를 반환했음을 나타냅니다.
- 201 Created: 요청이 성공적으로 완료되었으며, 서버가 새로운 리소스를 생성했음을 나타냅니다.
- 202 Accepted: 요청이 접수되었지만 아직 처리되지 않았음을 나타냅니다.
- 204 No Content: 요청이 성공적으로 처리되었으나 반환할 콘텐츠가 없음을 나타냅니다.
3xx: Redirection
- 301 Moved Permanently: 요청한 리소스가 영구적으로 다른 URL로 이동했음을 나타냅니다.
- 302 Found: 요청한 리소스가 일시적으로 다른 URL로 이동했음을 나타냅니다.
- 304 Not Modified: 클라이언트가 조건부 GET 요청을 했으며, 리소스가 수정되지 않았음을 나타냅니다.
4xx: Client Error
- 400 Bad Request: 서버가 잘못된 요청을 이해하지 못했음을 나타냅니다.
- 401 Unauthorized: 인증이 필요함을 나타냅니다.
- 403 Forbidden: 서버가 요청을 거부했음을 나타냅니다.
- 404 Not Found: 요청한 리소스를 찾을 수 없음을 나타냅니다.
- 405 Method Not Allowed: 요청한 메서드가 허용되지 않음을 나타냅니다.
5xx: Server Error
- 500 Internal Server Error: 서버에서 요청을 처리하는 중에 오류가 발생했음을 나타냅니다.
- 501 Not Implemented: 서버가 요청한 기능을 지원하지 않음을 나타냅니다.
- 502 Bad Gateway: 서버가 게이트웨이 또는 프락시로부터 잘못된 응답을 받았음을 나타냅니다.
- 503 Service Unavailable: 서버가 일시적으로 과부하 상태이거나 유지 보수 중임을 나타냅니다.
- 504 Gateway Timeout: 서버가 게이트웨이 또는 프락시로부터 응답을 기다리는 동안 시간이 초과되었음을 나타냅니다.
이 상태 코드를 통해 클라이언트와 서버 간의 상호 작용이 원활하게 이루어질 수 있으며, 오류 발생 시 그 원인을 파악할 수 있습니다.
HTTP 상태코드 활용한 코드간결화 예시
다음은 상태코드를 활용한 코드명료화의 예시입니다.
기존의 HTTP 상태코드에 대해 알지 못했을 때는, response.headers에서 값을 가져와서 있는지 파악해서 코드를 활용했습니다.
response = requests.get(API_URL, stream=True)
if 'Content-Disposition' in response.headers:
content_disposition = response.headers['Content-Disposition']
file_name = unquote(content_disposition.split('filename=')[1]).strip('"')
else:
file_name = 'downloaded_file.bin' # 파일 이름이 없을 경우 기본값 지정
save_file_path = os.path.join(f'{folder_path}', file_name)
if not os.path.exists(save_file_path):
response = requests.get(API_URL, stream=True)
if 'Content-Length' in response.headers:
file_size = int(response.headers['Content-Length'])
if file_size < 1000000:
log_message = f"File {save_file_path} is too small ({file_size} bytes)."
logging.info(log_message)
else:
download_file(API_URL, save_file_path)
print(f"{formatted_time_str}.nc 다운로드 완료")
하지만, status_code 값을 통해서 코드의 간결화 및 명료화가 가능할 수 있습니다.
# 코드 간결/명료화 - HTTP 상태코드(200- 요청성공 및 요청한 리소스 반환)
response = requests.get(API_URL, stream=True)
if response.status_code == 200 and 'Content-Disposition' in response.headers:
content_disposition = response.headers['Content-Disposition']
file_name = unquote(content_disposition.split('filename=')[1]).strip('"')
save_file_path = os.path.join(folder_path, file_name)
if not os.path.exists(save_file_path):
file_size = int(response.headers.get('Content-Length', 0))
if file_size < 1000000:
logging.info(f"[데이터 다운로드 제외]파일명 : {file_name}|파일크기 : {file_size} bytes")
else:
download_file(API_URL, save_file_path)
Reference
- HTTP 상태코드: https://namu.wiki/w/HTTP/%EC%9D%91%EB%8B%B5%20%EC%BD%94%EB%93%9C?from=HTTP%20%EC%83%81%ED%83%9C%20%EC%BD%94%EB%93%9C
- 대표이미지 : https://cmlabs.co/en-id/seo-guidelines/error-404-not-found
'Python > 5️⃣ 웹' 카테고리의 다른 글
[기상청 API 허브] 위성 데이터 다운받기 (코드 포함) (7) | 2024.03.14 |
---|---|
[기상청 API 허브] 지상관측 데이터 다운받기(2/2) (0) | 2024.03.14 |
[기상청 API 허브] 지상관측 데이터 다운받기 (1/2) (0) | 2024.03.01 |
[기상청 API 허브] API 활용한 기상자료 쉽게 다운받기 (32) | 2024.02.25 |