# 모든 개발자를 위한 HTTP 웹 기본 지식 학습
# 협상 헤더(콘텐츠 네고시에이션)
- 클라이언트가 선호하는 표현 요청
- Accept : 클라이언트가 선호하는 미디어 타입 전달
- Accept-Charset : 클라이언트가 선호하는 문자 인코딩
- Accept-Encoding : 클라이언트가 선호하는 압축 인코딩
- Accept-Language : 클라이언트가 선호하는 자연 언어
- 협상 헤더는 요청시에만 사용
## 협상 헤더 적용 사례 1
한국어 브라우저 사용
/event
GET /evnet
로 보내면
다중 언어 지원 서버
1. 기본 영어(en)
2. 한국어 지원(ko)
Content-Language: en
hello (영어)
로 응답
한국어 브라우저 사용
/event
GET /evnet
Accept-Language: ko
로 보내면(Accept-Language 포함하여 전달)
다중 언어 지원 서버
1. 기본 영어(en)
2. 한국어 지원(ko)
Content-Language: ko
안녕하세요
로 응답
## 협상 헤더 사용 사례 2 (Accept-Language 복잡한 예시)
한국어 브라우저 사용
/event
GET /evnet
Accept-Language: ko
로 보내면(Accept-Language 포함하여 전달)
다중 언어 지원 서버
1. 기본 독일어(de)
2. 영어도 지원(en)
Content-Language: de
Hallo(독일어)
로 응답
## 협상과 우선순위 1
- Quality Values(q) 값 사용
- 0~1, 클수록 높은 우선순위
- 생략하면 1
Accept-Language: ko-KR, ko; q=0.9, en-US; q=0.8, en; q=0.7
1 순위. ko-KR; q=1 (q생략)
2 순위. ko; q=0.9
3 순위. en-US; q=0.8
4 순위. en; q=0.7
## 협상 헤더 사용 사례 2 (Accept-Language 복잡한 예시) - 해결
한국어 브라우저 사용
/event
GET /evnet
Accept-Language: ko-KR, ko; q=0.8, en-US; q=0.8, en; q=0.7
로 보내면(Accept-Language / 우선순위 포함하여 전달)
다중 언어 지원 서버
1. 기본 독일어(de)
2. 영어도 지원(en)
Content-Language: de
Hello(영어)
로 응답
## 협상과 우선순위 2
Accept: text/*, text/plain, text/plain;format=flowed, */*
1 순위. text/plain; format=flowed
2 순위. text/plain
3 순위. text/*
4 순위. */*
## 협상과 우선순위 3
- 구체적인 것을 기준으로 미디어 타입을 맞춘다.
Accept: text/*; q=0.3, text/html; q=0.7, text/html;level=1, text/html; level=2; q=0.4, */*; q=0.5
Media Type : text/html; level=1 일 때 Quality : 1
Media Type : text/html 일 때 Quality : 0.7
Media Type : text/plain 일 때 Quality : 0.3
Media Type : image/jpeg 일 때 Quality : 0.5
Media Type : text/html; level=2 일 때 Quality : 0.4
Media Type : text/html; level=3 일 때 Quality : 0.7
# 전송 방식
- Transfer-Encoding
- Range, Content-Range
## 전송 방식 설명
## 단순 전송
- Conten-Length
- 요청을 하면 응답을 주는데, 메시지 바디에 대한 길이값을 지정하는 것
- 한번에 요청하고 한번에 쭉 받는 것
HTTP/1.1 200 OK
Content-Type: text/html; charset=UTF-8
Content-Length: 3423
<html>
<body> ... </body>
</html>
## 압축 전송
- Content-Encoding
- 서버에서 압축을 통해 용량을 줄이고, Content-Encoding을 설정(어떤 걸로 압축되어있는지)
HTTP/1.1 200 OK
Content-Type: text/html; charset=UTF-8
Content-Encoding: gzip
Content-Length: 521
lkj123kljoiaasdasdskljsdfj
## 분할 전송
- Transfer-Encoding
- 보낼 때 덩어리로 쪼개서 보내겠다는 것 (용량이 큰 것을 분할 전송하여 빠르게 전송)
- Content-Length 넣으면 안됨 ( 처음에 Content-Length 예상 불가능)
HTTP/1.1 200 OK
Content-Type: text/plain
Transfer-Encoding: chunked
5
Hello
5
World
0
\r\n
## 범위 전송
- Range, Content-Range
- 예) 이미지 전송 중 절반정도 받았을 경우 중간에 끊기면 다시 요청 해야 하는데, 처음부터 다시 요청하게 되면 용량 낭비, 그러므로 범위 전송을 통해 범위 설정
클라이언트
GET /event
Range: bytes=1001~2000
서버
HTTP/1.1 200 Ok
Content-Type: text/plain
Content-Range: bytes 1001~2000 / 2000
qweqwewq123qwedaswe
# 일반 정보
- From : 유저 에이전트의 이메일 정보
- Referer : 이전 웹 페이지 주소
- User-Agent : 유저 에이전트 애플리케이션 정보
- Server : 요청을 처리하는 오리진 서버의 소프트웨어 정보
- Date : 메시지가 생성된 날짜
## From
- 유저 에이전트의 이메일 정보
- 일반적으로 잘 사용되지 않는다.
- 검색 엔진 같은 곳에서 주로 사용
- 요청에서 사용
## Referer
- 이전 웹 페이지 주소
- 현재 요청된 페이지의 이전 웹 페이지 주소
예)
구글에서 특정 입력 값 검색 후 개발자 도구 보면 아래와 같이 되어 있음을 볼 수 있다.
referer: http://www.google.com
=>
이전 웹 사이트 주소를 알려준다.
- A 에서 B로 이동하는 경우 B를 요청할 때 Referer: A를 포함해서 요청
- Referer를 사용해서 유입 경로 분석 가능
- 요청에서 사용
- 사용 : 주로 유입 경로 or 웹 사이트 분석 시 사용한다.
- 참고로 referer는 단어 referrer의 오타이다.
## User-Agent
예)
user-agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7)
AppleWebKit/537.36 (KHTML, like Gecko) Chrome/86.0.4240.183 Safari/537.36
- 클라이언트의 애플리케이션 정보 (웹 브라우저 정보, 등등)
- 통계 정보
- 어떤 종류의 브라우저에서 장애가 발생하는지 파악 가능
- 요청에서 사용
- 사용 : 특정 브라우저에서 문제 생길 경우 파악 등
## Server
- 요청을 처리하는 ORIGIN 서버의 소프트웨어 정보
- Server : Apache/2.2.22 (Debian)
- server: nginx
- 응답에서 사용
## Date
- 메시지가 발생한 날짜와 시간
- Date : Tue, 15 Nov 1994 08:15:31 GMT
- 응답에서 사용
# 특별한 정보
- Host : 요청한 호스트 정보(도메인)
- Location : 페이지 리다이렉션
- Allow : 허용 가능한 HTTP 메서드
- Retry-After : 유저 에이전트가 다음 요청을 하기까지 기다려야 하는 시간
## Host
- 요청한 호스트 정보 (도메인)
- 요청에서 사용
- 필수 헤더이다. (아주 중요)
GET /search?q=hello&hi=ko HTTP/1.1
Host: www.google.com
- 하나의 서버가 여러 도메인을 처리해야 할 때
- 하나의 IP 주소에 여러 도메인이 적용되어 있을 때
예)
가상 호스트를 통해 여러 도메인을 한번에 처리할 수 있는 서버, 실제 애플리케이션이 여러개 구동될 수 있다.
여기서 Host가 없으면 발생할 수 있는 문제?
=>
클라이언트가 아래와 같이 요청을 보내면
GET /hello HTTP/1.1 (/hello 요청 전달)
서버에서 /hello가 어디로 들어가야 할지(AAA.com / BBB.com / CCC.com 어디로?)구분할 방법이 없음.
(IP로만 통신하기 때문에)
해결방법)
Host 사용
GET /hello HTTP/1.1
Host: AAA.com
## Location
- 페이지 리다이렉션
- 웹 브라우저는 3xx 응답의 결과에 Location 헤더가 있으면, Location 위치로 자동 이동 (리다이렉트)
- 응답코드 3xx에서 설명
- 201 (Created) : Location 값은 요청에 의해 생성된 리소스 URI
- 3xx (Redirection) : Location 값은 요청을 자동으로 리다이렉션하기 위한 대상 리소스를 가리킴
## Allow
- 허용 가능한 HTTP 메서드
- 405 (Method Not Allowed)에서 응답에 포함해야 함
- Allow: GET, HEAD, PUT
## Retry-After
- 유저 에이전트가 다음 요청을 하기까지 기다려야 하는 시간
- 503 (Service Unavailable) : 서비스가 언제까지 불능인지 알려줄 수 있다.
- Retry-After : Fri, 31, Dec 1999 23:59:59 GMT (날짜 표기)
- Retry-After : 120 (초단위 표기)
# 인증 헤더
- Authorization : 클라이언트 인증 정보를 서버에 전달
- WWW-Authenticate : 리소스 접근 시 필요한 인증 방법 정의
## Authorization
- 클라이언트 인증 정보를 서버에 전달
- Authorization : Basic xxxxxxx
- 참고 : 인증마다 value에 들어가는 건 다름
## WWW-Authenticate
- 리소스 접근시 필요한 인증 방법 정의
- 401 Unauthorized 응답과 함께 사용
WWW-Authenticate : Newauth Realm="apps", type=1, title="Login to\"apps\"", Basic realm="simple"
출처 : 인프런 모든 개발자를 위한 HTTP 웹 기본 지식