지하철미션과 헤더필드들

yboy·2022년 5월 18일
0

Learning Log 

목록 보기
6/41
post-thumbnail
post-custom-banner

학습동기

우아한테크코스의 레벨2 지하철 노선도 미션의 인수 테스트를 작성하면서 Request와 Response 메세지를 볼 기회가 많았다. 늘 body의 data들만 중요하다고 생각했었는데 header값들의 의미도 궁금해졌다. header의 의미를 알면 http 통신에 대해 더 잘 이해할 수 있지 않을까? 라는 의구심을 갖게 되어 학습을 하게 됐다.

학습내용

HTTP Request & Response

우선 개발한 API의 몇몇 HTTP 통신 메세지를 봐보자.

구간 추가

HTTP Request

POST /lines/1/sections HTTP/1.1
accept: */*
content-type: application/json
content-length: 55
host: localhost:65393
connection: Keep-Alive
user-agent: Apache-HttpClient/4.5.13 (Java/15.0.1)
accept-encoding: gzip,deflate

HTTP Response

HTTP/1.1 200 OK
Keep-Alive: timeout=60
Connection: keep-alive
Vary: Origin
Content-Length: 0
Date: Thu, 12 May 2022 09:32:18 GMT

구간 삭제

HTTP Request

DELETE /lines/1/sections?stationId=2 HTTP/1.1
accept: */*
host: localhost:65402
connection: Keep-Alive
user-agent: Apache-HttpClient/4.5.13 (Java/15.0.1)
accept-encoding: gzip,deflate

HTTP Response

HTTP/1.1 200 OK
Keep-Alive: timeout=60
Connection: keep-alive
Vary: Origin
Content-Length: 0
Date: Thu, 12 May 2022 09:33:10 GMT

노선 등록

HTTP Request

POST /lines HTTP/1.1
accept: */*
content-type: application/json
content-length: 98
host: localhost:65413
connection: Keep-Alive
user-agent: Apache-HttpClient/4.5.13 (Java/15.0.1)
accept-encoding: gzip,deflate

HTTP Response

HTTP/1.1 201 Created
Transfer-Encoding: chunked
Keep-Alive: timeout=60
Connection: keep-alive
Vary: Origin
Date: Thu, 12 May 2022 09:33:53 GMT
Location: /lines/1
Content-Type: application/json

HTTP 헤더는 클라이언트와 서버가 요청 또는 응답으로 부가적인 정보를 전송할 수 있게 해준다.
이제 미션에서 개발한 API의 통신에서 사용하고 있는 Header의 종류와 용도에 대해 알아보자.
Request에서 사용된 header와 Response에서 사용된 header로 나누어서 알아 보도록하자.

Request

  • accept (accept: / )
    • 클라이언트 자신이 원하는 미디어 타입 및 우선순위를 알려준다.
    • 텍스트(text/html,text/plain,...), 이미지(image/jpeg,...) 등
    • 예시는 어떤 미디어 타입도 가능하다는 의미.
  • content-type (content-type: application/json)
    • 보내는 컨텐츠의 유형이 무엇인지 알려준다.
      ex)
        Content-Type: text/html; charset=utf-8
        Content-Type: multipart/form-data; boundary=something
  • content-length (content-length: 98)
    • 보내는 컨텐츠의 길이가 얼마인지 알려준다.
    • 수신자에게 보내지는, 바이트 단위를 가지는 개체 본문의 크기를 나타낸다.
  • host (host: localhost:65413)
    • 요청의 대상이 되는 서버의 호스트명과 포트를 알려준다.
    • HTTP/1.1 이후부터 Host 필드는 필수 항목이 되어서, 웹브라우저는 이를 반드시 포함 필요
    • 가상 호스트는 동일 IP로 운용되기 때문에 Host 헤더 필드로 구별한다.
  • connection (connection: Keep-Alive)
    • 일반 헤더
    • 클라이언트와 서버 간 연결에 대한 옵션 설정
    • Connection: close 현재 HTTP 메세지 직후에 TCP 접속을 끊는다.
    • Connection : Keep-Alive 현재 TCP 커넥션을 유지한다.
    • 클라이언트가 이 헤더를 서버에 보내면 서버는 응답할 때 이 헤더를 응답에 실어 보내야 한다.
  • user-agent (user-agent: Apache-HttpClient/4.5.13 (Java/15.0.1))
    • 데이터를 요청한 사용자 에이전트의 애플리케이션 타입, 운영 체제, 소프트웨어 벤더 등을 식별할 수 있는 문자열
  • accept-encoding (accept-encoding: gzip,deflate)
    • 돌려줄 리소스에 대한 인코딩 알고리즘

Response

  • Keep-Alive (Keep-Alive: timeout=60)
    • 말 그대로 '연결을 계속 유지햐라'라는 의미.
    • 최소 특정 시간동안(timeout) 최대 요청 (max)의 수를 알려 준다.
    • Keep-Alive: timeout=5, max=1000 -> 최소 5초동안 최대 1000번의 요청을 한다면 http Connection이 끊어지지 않을 것이다.
    • 위의 예시는 최소 60초 동안에는 http connection이 끊어지지 않는다는 의미.
  • Connection (connection: Keep-Alive)
    • 클라이언트와 서버 간 연결에 대한 옵션 설정
    • Connection: close 현재 HTTP 메세지 직후에 TCP 접속을 끊는다.
    • Connection : Keep-Alive 현재 TCP 커넥션을 유지한다.
  • Vary (Vary: Origin)
    • 응답에 영향을 줄 수 있는 헤더들의 목록을 클라이언트에게 알려줌
    • ex) Vary: Accept-Encoding,User-Agent
  • Date (Date: Thu, 12 May 2022 09:33:53 GMT)
    • 일반 헤더
    • 메세지가 언제 만들어졌는지에 대한 날짜와 시간을 제공한다.
  • Transfer-Encoding (Transfer-Encoding: chunked)
    • 엔티티 헤더
    • 어떤 방식으로 데이터를 전송할 것인지 알려준다. (수신자에게 안전한 전송을 위해 메세지에 어떤 인코딩이 적용되었는지)
    • 주로 Chunked 전송 방식으로 데이터를 전달하려 할 때 주로 사용
  • Location (Location: /lines/1)
    • 엔티티 헤더
    • 리다이렉트할 URL을 가리킨다.
    • 클라이언트에게 엔티티가 실제로 어디에 위치하고 있는지 말해준다. (수신자에게 리소스에 대한 위치를 알려줄때 사용)
    • 오직 3xx(redirection) or 201(created) 응답 상태일 때만 제공된다.

위의 헤더들이 현재 진행하고 있는 미션에서 사용되고 있는 header들이다.

마무리

몇몇 HTTP header들에 대해 알아보면서 HTTP message를 좀 더 잘 이해할 수 있게 되었다. 원래 HTTP 메시지들을 보면 모르는 것들이 많아서 거부감이 들었는데 header들에 알아보고 나니 메세지를 보는 것에 대한 두려움이 없어졌다. 앞으로 http에 대해서 많이 공부해보고 싶게 만드는 원동력이 된 학습이였다.

post-custom-banner

0개의 댓글