[IT] HTTP Request/Response 구조

노유성·2023년 7월 20일
0
post-thumbnail

HTTP 통신

  • http 통신은 기본적으로 요청/응답 구조로 되어있다. 클라이언트가 HTTP request를 서버에 보내면 서버는 HTTP response를 보내는 구조이다.
    클라이언트와 서버의 모든 통신은 요청, 응답으로 이루어져있다.
  • http는 무상태이다. 요청이 오면 그에 응답할 뿐 요청/응답끼리 연결되어 있지 않다. 이를 극복하기 위해 쿠기나 세션 등을 이용한다.

HTTP request 구조

HTTP Request 메세지는 3가지 부분으로 구성된다.

Start line

GET /login HTTP/1.1

  • HTTP Method: request가 의도한 action이다. GET, POST, DELETE, PUT 등이 있다.
  • Request Target: request가 전송되는 목표 uri이다.
  • HTTP Version: 말 그대로 HTTP 버전이다.

Headers

Reqeust에 대한 추가 정보를 담고 있는 부분이다. 정보는 key-value 구성되어있다.

헤더도 3가지 부분으로 나눌 수 있다.

일반 헤더(General Headers)

  • Date: 현재 시간
  • Pragma: 캐시제어, HTTP/1.0에서 쓰이던 것으로 HTTP/1.1에서는 Cache-Control이 쓰인다.
  • Cache-Control: 캐시를 제어할 때 사용
  • Upgrade: 프로토콜 변경시 사용
  • Via: 중계(proxy) 서버의 이름, 버전, 호스티명
  • Connection: 네트워크 접속을 유지할 것인지 말지에 제어. HTTP/1.1은 keep-alivce로 연결한다.
  • Transfer-Encoding: 사용자에게 entity를 안전하게 전송하기 위해 사용하는 인코딩 형식을 지정

Entity Header(엔티티 헤더) - MIME 타입과 같은 entity의 자세한 정보를 포함

  • Content-type: resouce의 media-type을 명시한다. ex)application/json, text/html 등
  • Content-length: 바이트 단위를 가지는 entity 본문의 크기
  • Content-language: 본문을 이해하는데 적절한 언어
  • Content-location: 반환된 데이터 개체의 실제 위치, URI
  • Content-Security-Policy: 다른 외부 파일을 불러오는 경우 차단할 리소스와 불러올 리소스를 명시함. 예를 들어 'default-src https'는 http로만 파일을 가져올 수 있다는 것을 명시한 것
  • Content-Encoding: 본문의 리소스 압축 방식. Content-type과 같이 사용되며 decode 방법을 클라이언트에게 알게 해준다
  • Location: 301, 302 상태코드일 때 볼 수 있는 헤더로, 서버의 응답이 다른곳에 있다고 하면서 해당 URI를 지정한다.
  • Last-Modified: 리소스의 마지막 수정 날짜
  • ALlow: 지원되는 HTTP 요청 메소드. ex)GET, HEAD, POST
  • Expires: 자원 만료 일자
  • ETag: 리소스의 버전을 식별하는 문자열 검사기

Request Header(요청 헤더)

  • Host: 요청하려는 서버 호스트 이름과 포트번호, 요청을 받는 서버를 의미
  • User-agent: 클라이언트 프로그램 정보
  • Referer: 현재 페이지로 연결되는 링크가 있던 이전 웹 페이지 주소
  • Accpet: 클라이언트가 처리 가능한 MIME Type 종류 나열
  • Accept-charset: 클라이언트가 지원가능한 인코딩 방식
  • Accept-language: 클라이언트가 지원가능한 언어 나열
  • If-Modified-Since: 캐시가 만료되었을 때에만 데이터를 전송하는데 사용
  • Authorization: 인증 토큰을 서버에 보낼 때 쓰임
  • Origin: 서버로 POST 요청을 보낼 때 요청이 어느 주소에서 시작되었는지 나타내는 값. Origin은 A서버에서 B서버로 요청을 보낼 때 A서버의 주소를 적는 것이다. B서버에서는 A서버에서 요청이 온 것이 유효한지를(Origin 값에 해당하는 정책을) 확인해서 CORS 응답 헤더로 내려준다. 이 과정에서 Origin헤더 값이 약속된 원본 도메인이 아니라면 에러 응답 혹은 CORS 헤더 없이 응답하게 된다. 즉, A서버는 응답을 사용할 수 없다.
  • Cookie: key-value로 표현된다. 이전에 전송했던 저장된 HTTP 쿠키를 포함한다.

Response Header(응답 헤더)

  • Server: 웹 서버의 종류
  • Age: max-age 시간내에서 얼마나 시간이 흘렀는지 초 단위로 알려준다.
  • Referrer-policy: 서버 referrer 정책을 알려주는 값
  • WWW-Authenticate: 사용자 인증이 필요한 자원을 요구하면, 서버가 제공하는 인증 방식
  • Proxy-Autehnticate: 요청한 서버가 프록시 서버인 경우 유저 인증을 위한 값
  • Set-Cookie: 서버가 클라이언트에게 세션 쿠키 정보를 설정

Body

실제 request의 메세지 내용. Body가 없는 request도 있다. 예를 들어, GET request들은 대부분 body가 없다.

POST /payment-sync HTTP/1.1

Accept: application/json
Accept-Encoding: gzip, deflate
Connection: keep-alive
Content-Length: 83
Content-Type: application/json
Host: intropython.com
User-Agent: HTTPie/0.9.3

{
    "imp_uid": "imp_1234567890",
    "merchant_uid": "order_id_8237352",
    "status": "paid"
}

HTTP Response 구조

Response도 3부분으로 구성되어 있다.

Start line

HTTP/1.1 404 Not Found

  • HTTP 버전
  • Status code: 응답 상태를 나타내는 코드
  • Status code: 응답 상태를 간결하게 설명해주는 부분.

Headers

동일하다.

body

request의 body와 일반적으로 동일하다. 데이터 전송이 필요없을 경우 body가 비어있을 수도 있다.

profile
풀스택개발자가되고싶습니다:)

1개의 댓글

comment-user-thumbnail
2023년 7월 20일

훌륭한 글이네요. 감사합니다.

답글 달기