웹 브라우저에서 웹 서버로 접속할 때 `Request Headers`의 `view source`를 클릭해서 보면
- 제일 먼저 나오는 행(요청 행(Request Line)) : `GET /1.html HTTP/1.1`
- https://www.google.com......BAD
- Request Headers
- Request Message Header
- 서버 쪽으로 전송해야 될 정보가 있다면 그 정보가 실제 내용임 ("페이로드")
-- Request Message Body
- Body와 Header는 그 중간에 blank line을 둬서 구분
`GET /1.html HTTP/1.1`
- `GET` : 메소드
-- 웹 브라우저와 웹 서버가 어떤 방식으로 통신할 것인가
-- `GET`은 데이터를 웹 서버로 가져올 때 씀
--- e.g. 주소 치고 엔터 치는 것
- `POST`
-- e.g. 로그인 전송 버튼 누르면 데이터 전송
- `/1.html` : 웹 서버에게 요청하는 정보
-- 웹 서버는 `/1.html`을 보고서 그것에 따라 웹 브라우저가 요청한 정보를 응답해주게 됨
- `HTTP/1.1` : 웹 브라우저가 현재 사용하고 있는/사용할 수 있는 HTTP의 버전이 1.1
-- 웹 서버는 이 정보를 바탕으로 해서 웹 브라우저에게 적당한 방식으로 통신을 함
`Host: localhost:8080`이라는 이 부분부터는 Request Header
- `Host: localhost:8080`: 여러 가지 Request Headers가 있지만 그 중에서 반드시 적어야 하는 필수적인 것
-- Host : 인터넷에 연결되어 있는 컴퓨터 한 대 한 대를 식별하는 이름 (Host name)
-- Host라고 적는 것은 우리가 요청하는 이 웹사이트 웹 서버의 주소를 적는 것
-- Host가 있으면 하나의 웹 서버가 여러 개의 도메인을 서비스 할 수 있음
--- 그런 경우에는 예를 들면 a라는 웹 서버가 a.com, b.com, c.com이라는 도메인을 호스팅하고 있고 각각의 주소별로 다른 웹사이트라고 한다면 웹 서버는 `Host: localhost:8080`에 적혀 있는 주소가 무엇이냐에 따라서 다른 정보를 보내줄 수 있음
---- "가상 호스트"
-- `8080` : 포트
--- 한 대의 컴퓨터에는 여러 대의 서버가 설치되어 있을 수 있음
--- `8080`이라고 하면 `8080`이라는 포트 번호에 등록되어 있는 웹 서버를 이야기하는 것
핵심
```
GET /1.html HTTP/1.1
Host: localhost:8080
```
```
User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 ... Chrome/67.0.3396.99 Safari/537.36
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp;image/apng,*/*;...
```
- `User-Agent` : 웹 브라우저의 다른 표현
-- 웹 브라우저를 User Agent라고도 함
-- 즉 요청하는 웹 브라우저가 어떤 웹 브라우저인지를 보여줌
--- `Chrome`
-- `(Macintosh; Intel Mac OS X 10_13_5)` : 우리가 사용하고 있는 운영 체제가 Macintosh, Intel CPU를 쓰고 있고 Mac OS 버전이 어떻다고 하는 것
-- 나중에 웹 서버를 잘 운영해보면 통계 같은 걸 내게 되는데 이 웹사이트에는 어떤 브라우저와 운영 체제를 쓰는 사람들이 많이 접속하고 있는가 이러한 정보들을 `User-Agent`를 통해서 볼 수 있음
-- 경우에 따라서는 `User-Agent`가 Chrome이나 Firefox나 이런 것이 아니라 어떤 로봇이 접근할 수 있음 (검색 엔진 로봇 등)
--- 그런 경우에는 웹 서버는 이 정보를 바탕으로 해서 그 요청을 차단할 수 있음 (본인이 원하지 않은 요청일 수도 있음)
--- `User-Agent`는 그런 목적으로 사용됨
```
Accept-Encoding: gzip, deflate, br
```
- `Accept-Encoding` : 웹 브라우저와 웹 서버가 서로 통신할 때 응답하는 데이터의 양이 많으면 그걸 압축해서 전송하면 웹 브라우저가 그것을 압축을 풀어서 처리할 수 있음
-- 그러면 네트워크의 자원을 아낄 수 있음
-- 그때에 이 웹 브라우저는 어떤 압축 방식을 지원한다고 적어놓은 것
-- 그러면 웹 브라우저는 여기에 있는 이 세 가지 방식 중의 하나, 본인이 선호하는 걸 보내줄 수 있음
--- 웹 브라우저는 이 중의 하나를 처리할 수 있기 때문
```
If-Modified-Since: Tue, 17 Jul 2018 23:28:26 GET
```
- 지금 우리가 `1.html`이라는 파일을 웹 서버에게 요청했는데 그리고 다시 요청을 또 할 수도 있음
-- 그러면 요청할 때마다 그걸 다운로드 받는 게 효율적이지 않음
-- 그런 경우에 `If-Modified-Since`라고 되어 있는 부분이 이 정보를 우리가 서버에게 전송한다는 것은 내가 갖고 있는 이 파일은 마지막으로 언제 다운로드 받은 파일이다는 것을 서버에게 알려 줌
--- 그러면 웹 서버는 응답할 때 본인이 갖고 있는 파일이랑 무엇이 더 최신인지를 비교해서 본인이 갖고 있는 파일이 최신이면 전송해주고 최신이 아니면(더 다운로드할 필요가 없으면) 전송하지 않아도 되는 것
---- 속도도 줄일 수 있고 서로에게 윈윈이 되는 것