HTTP는 웹 상에서 정보를 주고받을 수 있는 프로토콜입니다. HTTP에 대해 아직 모르신다면 저의 이전 포스팅을 참고하시면 됩니다.
2022.09.06 - [Web/Base] - HTTP란? (버전, 특징)
💡 HTTP 메시지의 구조는 다음과 같이 4파트로 구성되어 있습니다.
- 시작 라인은 Request(요청)이냐 Response(응답)이냐에 따라 다른 정보를 포함하게 됩니다. Request 인 경우 [HTTP 메서드와 리소스 경로, HTTP 버전 정보]가 들어가고, Response일 경우 [HTTP 버전 정보, 상태 코드, 문구]가 들어가게 됩니다.
- 헤더에는 HTTP 전송에 필요한 모든 부가정보가 포함됩니다. 데이터의 압축 정보, 길이, 언어, 형식, 쿠키, 협상 등등의 많은 정보를 헤더에 담아서 전송하게 됩니다.
- empty line은 헤더와 바디를 구분하기 위한 것으로 메시지 바디가 있을 경우, 헤더와 바디 사이에 한 줄의 공백이 생깁니다.
- Message body는 실질적인 데이터가 들어가는 공간으로, HTML 문서나 이미지 영상 음성 JSON 등등 byte로 표현할 수 있는 모든 데이터를 전송할 수 있습니다.
✍ HTTP 메시지 요청 / 응답 예시
- 위 예시에서는 요청 메시지 바디에 아무 내용도 없지만, 실제로는 바디에 데이터를 넣어서 요청할 수 도 있습니다. -
start-line (시작 라인)
시작 라인은 요청과 응답의 스펙이 다릅니다.
- 요청 메시지
- 요청 메시지에서 시작 라인의 공식 스펙은 다음과 같습니다.
[ method (공백 - SP) request-target (공백 - SP) HTTP-version (엔터 - CRLF) ]
- method : HTTP 메서드입니다. 종류로는 GET, POST, PUT, DELETE 등이 있으며, 서버는 요청으로 온 HTTP 메서드에 따라 다른 동작을 수행하게 됩니다. 메서드별 용도는 다음과 같습니다.
- GET : 리소스를 조회할 때 주로 사용.
- POST : 요청 데이터 처리, 주로 등록에 사용
- PUT : 리소스를 대체 할 때 주로 사용, 해당 리소스가 없으면 생성함.
- PATCH : 리소스 부분을 일부 변경해야할 때 주로 사용.
- DELETE : 리소스 삭제.
메소드에서 한가지 주의해야할 점은 각 HTTP 메서드에 따라 서버에서 동작을 지정해주어야 한다는 것입니다. GET 메서드로 요청했다고 해서 무조건 데이터를 조회하는 것이 아니고, DELETE 메서드로 요청했다고 해서 무조건 해당 데이터를 삭제하는 것이 아닙니다. 메서드에 따른 동작은 모두 서버에서 구현해주어야하는 부분입니다.
- request-target
request-target 에서는 요청 대상을 지정합니다. 위 예시에서 /member?name=John 이 이에 해당하는 부분이며, /member라는 리소스에 name=John이라는 파라미터를 지정하여 데이터를 보내는 것입니다. 서버에서는 "/member"으로 왔을때 처리하는 로직들을 실행합니다. 요청 객체(HttpRequest)에서 request.getParameter("name")을 하여 John이라는 값을 가져올 수 있습니다.
- HTTP version
사용하는 HTTP 버전을 나타냅니다.
- 응답 메시지
- 응답 메시지에서 시작 라인의 공식 스펙은 다음과 같습니다.
[ HTTP-version (공백 - SP) status-code (공백 - SP) reason-pharse (엔터 - CRLF) ]
- HTTP version
사용하는 HTTP 버전을 나타냅니다.
- status-code
HTTP 요청에 대한 서버의 응답 상태를 나타냅니다. 웹 서핑을 하다 보면 404 에러 페이지를 많이 볼 수 있는데 이 부분에 해당합니다.
- 2xx : 성공
- 4xx : 클라이언트 요청 오류
- 5xx : 서버 내부 오류
- reason-phrase
사람이 이해할 수 있는 짧은 상태 코드 설명 글입니다.
Header 헤더 :
헤더의 공식 스펙은 다음과 같습니다.
[ field-name ":" (공백허용 - OWS) filed-value (공백허용 - OWS) ]
- JAVA의 Map 자료구조처럼 key- value 값으로 데이터가 보내진다고 생각하시면 됩니다. Start-line에 포함하지 않은 모든 부가정보들을 헤더에 담아 보냅니다.
- field-name 에는 대소문자 구분이 없습니다.
Message body :
- body는 실질적인 데이터가 들어가는 공간으로, HTML 문서나 이미지 영상 음성 JSON 등등 byte로 표현할 수 있는 모든 데이터를 전송할 수 있습니다.