매번, 자바의 HttpServletRequest, HttpServletResponse를 이용하여 Http Message를 다루어 왔다.
그런데 직접 Http Request를 요청하는 일이 생겼다.
막상 수기로 작성하려다 보니까 막막하다..
그래서 이번 기회에 정리를 해보려고 한다.
HTTP 헤더는 클라이언트와 서버가 요청 또는 응답으로 부가적인 정보를 전송할 수 있도록 해준다.
부가적 정보라 함은, 대표적으로 "요청자", "컨텐트 타입", "캐싱" 등등(수십 가지)가 있다.
Http Header는 다음과 같이 4가지가 있다.
General header : 요청과 응답 모두에 적용되지만 바디에서 최종적으로 전송되는 데이터와는 관련이 없는 헤더.
Request header : 페치될 리소스나 클라이언트 자체에 대한 자세한 정보를 포함하는 헤더. == 내가 보내는 메세지의 헤더
Response header : 위치 또는 서버 자체에 대한 정보(이름, 버전 등)와 같이 응답에 대한 부가적인 정보를 갖는 헤더. == 내가 받은 메세지의 헤더
Entity header: 컨텐츠 길이나 MIME 타입과 같이 엔티티 바디에 대한 자세한 정보를 포함하는 헤더.
실제로 존재하는 사이트에서 위의 4가지 정보를 살펴보자.
3가지의 Header가 보인다.
(Entity Header는 request, response에 녹아있는 것 같다.)
실제로 적용되는 Request Message를 작성해보자.
네이버 쇼핑을 이용한다.
네이버 쇼핑에 가서 "신발" 검색 후, 2페이지로 이동
개발도구 > network 창 켜기
다음 항목을 복사해서 URL 요청
결과는
데이터 파일이 잘 넘어오고 있다.
URL에 따른 Http Request Header 생성해보기
항목 내용을 "curl"로 복사해주자.
다음 사이트에 가서 curl 생성을 해보자.
https://curl.trillworks.com/
나는 python으로 생성해보았다.
내용이 너무 많아서 대표적인 항목만 살펴보자.
Date: (day-name), (day) (month) (year) (hour):(minute):(econd) GMT
"Date: Wed, 21 Oct 2015 07:28:00 GMT"
close, Keep-Alive가 있다.
-- close는 메세지 교환 후 TCP 연결 종료
-- Keep-Alive는 메세지 교환 후 TCP 연결 유지
Connection: close
Connection: Keep-Alive
요청하는 자의 호스트명, 포트 번호를 포함하고 있다.
Host: developer.mozilla.org
요청자의 소프트웨어 정보를 표현한다.
-- 소프트웨어 정보 : os, 브라우저, 기타 버전 정보
User-Agent를 Request에 넣지 않고 요청을 했을 경우, 정보를 주지 않는 곳도 있다. 이유는 봇(스크래핑, 크롤링, 기타 등등)이 요청을 하는 경우에는 User-Agent의 경로로 오지 않기 때문이다.
하지만 봇에 User-Agent를 기입하면 이것마저도 봇이 아니라 사람이 요청한 줄 안다..ㅋㅋ
User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.9; rv:50.0) Gecko/20100101 Firefox/50.0
요청자가 원하는 미디어의 타입 및 우선순위를 표현한다.
Accept는 부속 속성이 더 있다.
Accept: application/json, text/plain, */*
-> json > text > all type 순으로 받는다는 표현이다.
Accept-Language: en-US,en;q=0.5
-> 언어는 en이라는 표현이다. q는 가중치다.
Accept-Encoding: gzip, deflate, br
-> gzip, deflate, br(Brotli) 등등의 압축 포맷을 받는다는 표현이다.
서버에 의해서 이전에 저장된 쿠키를 포함시키는 속성이다.
cookie: aaa=3LEMQRTO6EBF4; page_uid=bbb123p0YihsshvyCBRssssstWG-3033307; nx_ssl=100; nid_inf=333333333;NID_AUT=PSS11Z0wmL63LVUNoGF2ft123123123123/AomAn5zPT6Ni2uGyyuWIfp9hb; NID_JKL=TNg7Y994769rvA+5dcCHhdB7TBdl12345676+nQdCM=; AD_SHP_BID=9;spage_uid=hRDT1233455
(네이버 쇼핑에서의 쿠키 - 내 맘대로 수정좀 했음)
Referer 요청 헤더는 현재 요청을 보낸 페이지의 절대 혹은 부분 주소를 포함한다.
두 가지의 속성을 더 가지고 있다.
referrer-policy : 우선 스펠링이 다르다.(오타가 스펙이 되어버렸다고 한다..) 이 헤더는 요청과 함께 얼마나 많은 레퍼럴 정보를 포함하는지 알려준다.
referer-after : 응답 헤더에 속하는 것인데, 다음에 올 요청이 이루어지기 전에 사용자가 대기해야 하는 시간을 가르킨다.
referer:https://search.shopping.naver.com/search/allquery=%EA%B3%BC%EC%9E%90&cat_id=&frm=NVSHATC
ex) cache-control :
no-cache(서버측에 캐시를 사용해도 되는지 확인),
no-store(캐싱x),
must-revalidate(만료 캐시만 서버측에 확인),
public(중개 서버에 저장 가능)/private(사용자 브라우저에만 등록),
max-age(캐시 유효기간)
ex) Vary: User-Agent
이렇게 설정되어 있으면, 모바일 유저에게 데스크탑 유저를 위한 캐시 컨텐츠가 제공되지 않게 할 수 있다.
이것말고도 수많은 속성과 수많은 내용이 있다. 기본적인 틀만 알아놓고 필요하다면 구글 서칭을 통해서 알아보도록 하자!