HTTP 메세지는 클라이언트와 서버 사이에서 데이터가 교환되는 방식입니다. HTTP 메시지는 Requests(요청)와 Response(응답) 타입으로 나눠지는데, 이 둘은 유사한 구조를 가지고 있습니다. 각각의 메세지는 어떠한 구조로 되어 있는지 함께 알아보도록 하겠습니다.
HTTP Requests
HTTP Requests는 클라이언트가 서버에게 보내는 요청 메세지 입니다.
Start line
Start line에는 HTTP method와 Request target, HTTP version이 있습니다.
- HTTP method : GET, POST, PUT, DELETE 등(GET은 리소스 받기, POST는 데이터를 서버로 전송, PUT 리소스에 대한 변경, DELETE 리소스 삭제)
- Request target : HTTP Request가 전송되는 목표 주소(URL이나 URI 또는 프로토콜, 포트, 도메인의 절대 경로 등)
- HTTP version : version에 따라 메시지 구조가 달라지기 때문에, 버전을 함께 입력합니다.
Headers
헤더의 이름(대소문자 구분이 없는 문자열), 콜론(:), 값을 입력합니다. 값은 헤더에 따라 다르며, 여러 종류의 헤더가 있습니다.
- General headers : 메시지 전체에 적용되는 헤더로, body를 통해 전송되는 데이터와는 관련이 없는 헤더
- Request headers : fetch를 통해 가져올 리소스나 클라이언트 자체에 대한 자세한 정보를 포함하는 헤더(User-Agent, Accept-Type, Accept-Language와 같은 헤더는 요청을 보다 구체화 할 수 있습니다.)
- Repressentation headers : 이전에는 Entity headers로 불렸으며, body에 담긴 리소스의 정보(콘텐츠의 길이, MIME 타입 등)를 포함하는 헤더입니다.
- Host: 요청하려는 서버 호스트 이름과 포트번호
- User-agent : 클라이언트 프로그램 정보(이 정보를 통해 서버는 클라이언트 프로그램(브라우저)에 맞는 최적의 데이터를 보내줄 수 있다.)
- Accept : 클라이언트가 처리 가능한 미디어 타입 종류
- Referer : 바로 직전에 머물렀던 웹 링크 주소
- If-Modified-Since : 여기에 쓰여진 시간 이후로 변경된 리소스 취득(페이지가 수정되었으면 최신 페이지로 교체한다.)
- Authorization : 인증 토큰을 서버로 보낼 때 쓰이는 헤더
- Origin : 서버로 Post 요청을 보낼 때 요청이 어느 주소에 시작되었는지 나타내는 값(만약에 이 값으로 요청을 보낸 주소와 받는 주소가 다르면 CORS(Cross-Origin Resource Sharing) 에러가 발생한다.)
- Cookie : 쿠키(값이 key-value로 표현된다.)
Body
모든 요청에 body가 필요하지는 않습니다. GET, HEAD, DELETE, OPTIONS처럼 서버에 리소스를 요청하는 경우에는 body가 필요하지 않습니다. 반면에 POST, PUT과 같은 요청은 데이터를 업데이트하기 위해서 사용하기 때문에 body가 필요합니다.
- Single-resource bodies(단일-리소스 본문) : 헤더 두개(Content-Type과 Content-Length)로 정의된 단일 파일로 구성
- Multiple-resource bodies(다중-리소스 본문) : 여러 파트로 구성된 본문에서는 각 파트마다 다른 정보를 지님(보통 HTML form과 관련있다.)
HTTP Responses
HTTP Responses는 서버가 클라이언트에게 보내는 메시지입니다. HTTP Request와는 다르게 응답의 첫 줄을 Status line이라고 부릅니다.
Status line
Status line에는 HTTP version과 Status code, Status text가 있습니다.
- HTTP version : 현재 프로토콜의 버전(HTTP/1.1)
- Status code : 요청의 결과(200, 302, 404 등)
- Status text : 상태 코드에 대한 설명
ex) HTTP/1.1 404 Not Found
Headers
응답에 들어가는 헤더는 요청 헤더와 동일한 구조를 가지고 있습니다. 대소문자 구분 없는 문자열, 콜론(:), 값을 입력하며, 값은 헤더에 따르 다릅니다.
- General headers : 메시지 전체에 적용되는 헤더로, body를 통해 전송되는 데이터와는 관련이 없는 헤더
- Response headers : 위치 또는 서버 자체에 대한 정보(이름, 버전 등)와 같이 응답에 대한 부가적인 정보를 갖는 헤더로, Vary, Accept-Ranges와 같이 상태 줄에 넣기에는 공간이 부족했던 추가 정보를 제공
- Representation headers : 이전에는 Entity headers로 불렀으며, body에 담긴 리소스의 정보(콘텐츠 길이, MIME 타입 등)를 포함하는 헤더
- Location : 301, 302 상태코드일 때만 볼 수 있는 Header(서버의 응답이 다른 곳에 있다고 알려주면서 해당 위치(URI)를 지정합니다.)
- Server : 웹 서버의 종류
- Age : max-age (시간내에서 얼마나 흘렀는지 초 단위로 알려주는 값입니다.)
- Referrer-policy : 서버 referrer 정책을 알려주는 값 (ex) origin, no-referrer, unsafe-url)
- WWW-Authenticate : 사용자 인증이 필요한 자원을 요구할 시 , 서버가 제공하는 인증 방식
- Proxy-Authenticate : 요청한 서버가 프록시 서버인 경우 유저 인증을 위한 값
Body
요청과 동일하게 모든 응답에 body가 필요하지는 않으며, 201, 204와 같은 상태 코드를 가지는 응답에도 body가 필요하지 않습니다.
- Single-resource bodies(단일-리소스 본문) :
- 길이가 알려진 단일-리소스 본문은 두 개의 헤더(Content-Type, Content-Length)로 정의
- 길이를 모르는 단일 파일로 구성된 단일-리소스 본문은 Transfer-Encoding이 chunked 로 설정되어 있으며, 파일은 chunk로 나뉘어 인코딩되어 있다.
- Multiple-resource bodies(다중-리소스 본문) : 서로 다른 정보를 담고 있는 body