[BACK-002][입문] HTTP 메서드·상태코드·헤더 읽기
페이지 정보

본문
[이번 수업]
브라우저와 서버가 대화할 때 사용하는 HTTP 요청과 응답을 읽습니다. 메서드는 원하는 동작, 상태코드는 처리 결과, 헤더는 메시지의 부가 정보를 나타냅니다.
[선수지식]
BACK-001의 서버·클라이언트 개념과 터미널 사용법을 알면 됩니다. Python 3와 curl이 필요하며 두 도구 모두 버전 명령으로 확인하세요.
[학습목표]
1. 자주 쓰는 HTTP 메서드의 목적을 구분한다.
2. 상태코드의 다섯 범주와 대표 코드를 설명한다.
3. 요청·응답 헤더와 본문의 경계를 찾는다.
[핵심개념]
HTTP는 클라이언트가 요청하고 서버가 응답하는 규칙입니다. 메서드는 요청의 뜻입니다. GET은 자원을 조회하고 HEAD는 GET과 같은 헤더를 요청하되 응답 본문을 받지 않습니다. POST는 데이터를 제출해 서버 처리를 요청하고, PUT은 대상 자원의 상태를 만들거나 바꾸며, PATCH는 일부 변경에 주로 사용됩니다. DELETE는 자원 제거를 요청합니다. 메서드 이름만으로 권한이 생기는 것은 아니므로 서버가 인증과 권한을 확인해야 합니다.
상태코드는 세 자리 결과입니다. 1xx는 처리 중 정보, 2xx는 성공, 3xx는 다른 위치나 캐시 사용, 4xx는 요청 쪽 문제, 5xx는 서버 쪽 문제를 뜻합니다. 대표적으로 200 OK는 성공, 201 Created는 생성, 204 No Content는 성공했지만 본문 없음입니다. 301은 영구 이동, 304는 캐시된 응답 사용, 400은 잘못된 요청, 401은 인증 필요, 403은 권한 거부, 404는 찾을 수 없음, 405는 허용되지 않은 메서드입니다. 500은 서버 내부 오류, 503은 일시적으로 처리할 수 없음을 나타냅니다.
헤더는 이름: 값 형태의 메타데이터입니다. 요청의 Host·Accept·Authorization, 응답의 Content-Type·Content-Length·Location·Cache-Control 등이 예입니다. 헤더 이름은 대소문자를 구분하지 않습니다. HTTP/1.1 메시지에서는 시작줄 다음에 헤더들이 오고, 빈 줄 뒤에 선택적인 본문이 옵니다. Content-Type은 본문의 형식을 알려 주며 상태코드만 보고 본문 구조를 추측하면 안 됩니다.
[따라하기]
새 폴더를 만들고 hello.txt에 Hello HTTP를 저장하세요. 첫 번째 터미널에서 로컬 서버를 시작합니다.
Windows:
py -m http.server 8000 --bind 127.0.0.1
macOS·Linux:
python3 -m http.server 8000 --bind 127.0.0.1
두 번째 터미널에서 성공 응답을 요청합니다.
curl -i http://127.0.0.1:8000/hello.txt
첫 줄에 HTTP/1.0 200 OK, 이어서 Content-type과 Content-Length 같은 헤더, 빈 줄, Hello HTTP 본문이 보입니다. Python 버전에 따라 헤더 철자와 순서는 달라질 수 있습니다. 이제 없는 파일을 요청합니다.
curl -i http://127.0.0.1:8000/missing.txt
이번에는 첫 줄이 HTTP/1.0 404 File not found이고 오류 HTML이 본문으로 옵니다. 헤더만 보려면 다음 명령으로 HEAD 요청을 보냅니다.
curl -I http://127.0.0.1:8000/hello.txt
실습이 끝나면 서버 터미널에서 Ctrl+C로 종료하세요.
[흔한 실수]
첫째, 4xx를 모두 서버 장애로 오해합니다. 요청 주소·형식·인증을 먼저 봅니다. 둘째, 200이면 본문도 항상 정상이라고 단정합니다. Content-Type과 실제 구조를 함께 검사해야 합니다. 셋째, POST는 무조건 생성, PUT은 무조건 수정이라고 외웁니다. 실제 의미는 API 계약과 대상 URI를 함께 확인합니다. 넷째, 401과 403을 같은 뜻으로 처리합니다.
[보안 주의]
실습 서버는 반드시 127.0.0.1에만 바인딩하세요. Python http.server는 기본 보안 검사만 제공하므로 운영 서비스에 사용하지 않습니다. 외부 통신은 HTTPS를 사용하고 Authorization·Cookie 값을 화면 공유나 로그에 남기지 마세요. 토큰을 URL 쿼리에 넣으면 기록에 남을 수 있습니다. 서버는 Content-Type과 본문 크기, 입력값, 사용자 권한을 모두 검증해야 합니다.
[직접 해볼 과제]
about.html을 하나 더 만들고 200 응답을 확인하세요. 이어서 curl -I 결과에서 상태줄과 Content-Type·Content-Length를 찾아 적고, 없는 파일의 404 결과와 비교하세요.
[확인문제]
1. GET과 HEAD 응답의 가장 큰 차이는 무엇인가요?
2. 201, 404, 503은 각각 어느 범주이며 무엇을 뜻하나요?
3. HTTP/1.1 메시지에서 헤더와 본문은 무엇으로 구분되나요?
[다음 학습]
순환 커리큘럼의 다음 글은 DB-002 SQL 조회·추가·수정·삭제입니다. 백엔드 트랙에서는 BACK-003 REST API 설계로 이어집니다.
[공식 참고 자료]
RFC 9110 HTTP Semantics: 메서드
https://www.rfc-editor.org/rfc/rfc9110.html#name-methods
RFC 9110 HTTP Semantics: 상태코드
https://www.rfc-editor.org/rfc/rfc9110.html#name-status-codes
RFC 9110 HTTP Semantics: 필드
https://www.rfc-editor.org/rfc/rfc9110.html#name-fields
RFC 9112 HTTP/1.1
https://www.rfc-editor.org/rfc/rfc9112.html
curl 공식 매뉴얼
https://curl.se/docs/manpage.html
Python http.server 공식 문서
https://docs.python.org/3/library/http.server.html
브라우저와 서버가 대화할 때 사용하는 HTTP 요청과 응답을 읽습니다. 메서드는 원하는 동작, 상태코드는 처리 결과, 헤더는 메시지의 부가 정보를 나타냅니다.
[선수지식]
BACK-001의 서버·클라이언트 개념과 터미널 사용법을 알면 됩니다. Python 3와 curl이 필요하며 두 도구 모두 버전 명령으로 확인하세요.
[학습목표]
1. 자주 쓰는 HTTP 메서드의 목적을 구분한다.
2. 상태코드의 다섯 범주와 대표 코드를 설명한다.
3. 요청·응답 헤더와 본문의 경계를 찾는다.
[핵심개념]
HTTP는 클라이언트가 요청하고 서버가 응답하는 규칙입니다. 메서드는 요청의 뜻입니다. GET은 자원을 조회하고 HEAD는 GET과 같은 헤더를 요청하되 응답 본문을 받지 않습니다. POST는 데이터를 제출해 서버 처리를 요청하고, PUT은 대상 자원의 상태를 만들거나 바꾸며, PATCH는 일부 변경에 주로 사용됩니다. DELETE는 자원 제거를 요청합니다. 메서드 이름만으로 권한이 생기는 것은 아니므로 서버가 인증과 권한을 확인해야 합니다.
상태코드는 세 자리 결과입니다. 1xx는 처리 중 정보, 2xx는 성공, 3xx는 다른 위치나 캐시 사용, 4xx는 요청 쪽 문제, 5xx는 서버 쪽 문제를 뜻합니다. 대표적으로 200 OK는 성공, 201 Created는 생성, 204 No Content는 성공했지만 본문 없음입니다. 301은 영구 이동, 304는 캐시된 응답 사용, 400은 잘못된 요청, 401은 인증 필요, 403은 권한 거부, 404는 찾을 수 없음, 405는 허용되지 않은 메서드입니다. 500은 서버 내부 오류, 503은 일시적으로 처리할 수 없음을 나타냅니다.
헤더는 이름: 값 형태의 메타데이터입니다. 요청의 Host·Accept·Authorization, 응답의 Content-Type·Content-Length·Location·Cache-Control 등이 예입니다. 헤더 이름은 대소문자를 구분하지 않습니다. HTTP/1.1 메시지에서는 시작줄 다음에 헤더들이 오고, 빈 줄 뒤에 선택적인 본문이 옵니다. Content-Type은 본문의 형식을 알려 주며 상태코드만 보고 본문 구조를 추측하면 안 됩니다.
[따라하기]
새 폴더를 만들고 hello.txt에 Hello HTTP를 저장하세요. 첫 번째 터미널에서 로컬 서버를 시작합니다.
Windows:
py -m http.server 8000 --bind 127.0.0.1
macOS·Linux:
python3 -m http.server 8000 --bind 127.0.0.1
두 번째 터미널에서 성공 응답을 요청합니다.
curl -i http://127.0.0.1:8000/hello.txt
첫 줄에 HTTP/1.0 200 OK, 이어서 Content-type과 Content-Length 같은 헤더, 빈 줄, Hello HTTP 본문이 보입니다. Python 버전에 따라 헤더 철자와 순서는 달라질 수 있습니다. 이제 없는 파일을 요청합니다.
curl -i http://127.0.0.1:8000/missing.txt
이번에는 첫 줄이 HTTP/1.0 404 File not found이고 오류 HTML이 본문으로 옵니다. 헤더만 보려면 다음 명령으로 HEAD 요청을 보냅니다.
curl -I http://127.0.0.1:8000/hello.txt
실습이 끝나면 서버 터미널에서 Ctrl+C로 종료하세요.
[흔한 실수]
첫째, 4xx를 모두 서버 장애로 오해합니다. 요청 주소·형식·인증을 먼저 봅니다. 둘째, 200이면 본문도 항상 정상이라고 단정합니다. Content-Type과 실제 구조를 함께 검사해야 합니다. 셋째, POST는 무조건 생성, PUT은 무조건 수정이라고 외웁니다. 실제 의미는 API 계약과 대상 URI를 함께 확인합니다. 넷째, 401과 403을 같은 뜻으로 처리합니다.
[보안 주의]
실습 서버는 반드시 127.0.0.1에만 바인딩하세요. Python http.server는 기본 보안 검사만 제공하므로 운영 서비스에 사용하지 않습니다. 외부 통신은 HTTPS를 사용하고 Authorization·Cookie 값을 화면 공유나 로그에 남기지 마세요. 토큰을 URL 쿼리에 넣으면 기록에 남을 수 있습니다. 서버는 Content-Type과 본문 크기, 입력값, 사용자 권한을 모두 검증해야 합니다.
[직접 해볼 과제]
about.html을 하나 더 만들고 200 응답을 확인하세요. 이어서 curl -I 결과에서 상태줄과 Content-Type·Content-Length를 찾아 적고, 없는 파일의 404 결과와 비교하세요.
[확인문제]
1. GET과 HEAD 응답의 가장 큰 차이는 무엇인가요?
2. 201, 404, 503은 각각 어느 범주이며 무엇을 뜻하나요?
3. HTTP/1.1 메시지에서 헤더와 본문은 무엇으로 구분되나요?
[다음 학습]
순환 커리큘럼의 다음 글은 DB-002 SQL 조회·추가·수정·삭제입니다. 백엔드 트랙에서는 BACK-003 REST API 설계로 이어집니다.
[공식 참고 자료]
RFC 9110 HTTP Semantics: 메서드
https://www.rfc-editor.org/rfc/rfc9110.html#name-methods
RFC 9110 HTTP Semantics: 상태코드
https://www.rfc-editor.org/rfc/rfc9110.html#name-status-codes
RFC 9110 HTTP Semantics: 필드
https://www.rfc-editor.org/rfc/rfc9110.html#name-fields
RFC 9112 HTTP/1.1
https://www.rfc-editor.org/rfc/rfc9112.html
curl 공식 매뉴얼
https://curl.se/docs/manpage.html
Python http.server 공식 문서
https://docs.python.org/3/library/http.server.html
- 이전글[DB-002][입문] SQL로 데이터 조회·추가·수정·삭제하기 26.08.29
- 다음글[WEB-002][입문] CSS 박스 모델·선택자·레이아웃 익히기 26.08.29
댓글목록
등록된 댓글이 없습니다.
